Redis单机数据库持久化与过期建删除

栏目: 数据库 · 发布时间: 5年前

内容简介:作为一名程序猿,redis已经是我们接触最多的缓存工具之一,它的应用面很广,那么大家是否对他真的有些了解呢,对于antirez大神的想法我也是算不上略懂一二,再此知识简单谈谈关于redis的一些小事首先让我们来了解一下redis的存储结构(废话不多说,直接上图)这张图很好地说明了Redis是如何存储的,我们知道redis是以键值对的方式来进行数据存储,首先redis会维持一个键表,在这个表上存储着redis所有的 “key” (也就是direct表)再来就是以指针的方式指向对于的"value",而它的val

作为一名程序猿,redis已经是我们接触最多的缓存 工具 之一,它的应用面很广,那么大家是否对他真的有些了解呢,对于antirez大神的想法我也是算不上略懂一二,再此知识简单谈谈关于 redis 的一些小事

redis的存储结构

首先让我们来了解一下redis的存储结构(废话不多说,直接上图)

Redis单机数据库持久化与过期建删除

这张图很好地说明了Redis是如何存储的,我们知道redis是以键值对的方式来进行数据存储,首先redis会维持一个键表,在这个表上存储着redis所有的 “key” (也就是direct表)再来就是以指针的方式指向对于的"value",而它的value就数据结构比较丰富,有动态字符串,链表,跳跃表等等、redis采用对象式存储,每一个键都是一个String对象,而value则是一个对应数据结构的对象。

1、redis单机数据库与过期键删除策略

下面让我们来自转入正题,redis的过期键删除策略,我们知道当我们安装redis后,它默认有16个子数据库,我们可以通过一些命令插入删除键值对,也可以切换数据库,但我们今天讨论的重点不在这儿,在redis中有一类比较特殊的键值对,那就是被expire命令设置了过期时间的键值对,他们只在规定时间内有效,最最常见的应用实例便是验证码,在生活中我们经常需要验证码,一般一分钟就失效了,那么这些失效了的验证码要如何处理呢,如果放任不管,我们知道redis是本地数据库,如果不处理,这些验证码长期存留于内存便造成内存泄漏,久而久之,服务器必然瘫痪。

1.1、redis存储过期键的方式

Redis单机数据库持久化与过期建删除

如上图,redis中专门会设置一个表来存储所有设置了过期键的键值对,存储方式为添加一个long数据记录过期时间

1.2、那么redis是如何处理过期键的?

废话不多说,直接出答案 redis的三种过期键删除策略

  • 定时删除 在设置具有过期时间的键值对的时候,给这个键值对加上定时器,当过期时间来临则删除这个键值对 优点 时效性很好 缺点 对cpu很不友好,大量消耗cpu性能,影响整体性能
  • 惰性删除 放任过期键不管,但是每次在redis取出键值对的时候,进行过期检验,删除其中过期键 优点 对cpu很友好 缺点 对内存很不友好,导致大量内存泄漏
  • 定期删除 每隔一段时间检查一次数据库,删除里面的过期键,至于检查多少个数据库,由算法决定 优点 对cpu和内存均比较友好 缺点 如果频繁清除对cpu不友好,如果清除不及时对内存不友好

从上面来看,不论选择哪种方式都不是最优,毕竟人无完人,十全十美的策略也是不存在的,团队的力量才是最强大的,所以redis最终采用的策略是惰性删除与定期删除相结合,定期删除过期键,并且在做get操作时进行过期键检查,删除过期键

2、redis持久化

2.1、RDB

RDB的持久化方式是将数据化当前的状态存储起来,也就是将它的键值对存储为一个压缩的二进制文件,RDB的持久化有两种命令

  • SAVE 系统阻塞然后生成RDB文件,在文件生成期间不能对外提供服务,
  • BGSAVE 创建子进程进行RDB文件的生成,父进程继续处理任务

那么何时进行RDB保存当前状态? 在redis中以下的情况会进行RDB存储当前状态(默认的配置)

  • 1、900秒之内有一次修改这进行RDB保存
  • 2、300秒之内有十次修改,进行RDB保存
  • 3、60秒内有一万次修改,进行RDB保存

最后RDB文件什么时候被使用? RDB文件只在系统启动的时候被使用,系统启动的时候检测到RDB文件的存在则会载入RDB文件

2.2、AOF

RDB通过保存数据库数据来保存状态,而AOF则是通过保存Redis说执行的每一条命令来保存数据库状态

当Redis开启Aof功能的时候,系统将会将说执行的命令通过Aof的方式进行同步 他的同步分为大致可分为两部,

  • 1、将命令写入aof缓冲区aof_buf 我们知道写入存储器是极为费时的操作,所以为了加快写回速度,减少I/O造成的性能浪费,Redis加上了缓冲区

  • 2、 将缓冲区命令写入到AOF文件进行同步 将缓冲区的数据写回AOF文件采用FlushAppendOnlyFile函数,而这个函数的执行实际由redis的一个配置选项appendSync决定,它有三种策略

    • awalys 总是将缓冲区aof_buf的数据时时同步到AOF文件(此方法I/O和cpu消耗较大)

    • everysec 每隔一秒将数据写回一次(Redis默认的方式)

    • no 将缓冲区aof_buf的数据同步到AOF文件由系统决定。

    从上面的介绍可知三种方法各有利弊,系统采用了everysec的方式。

  • 3、AOF文件的重写 当AOF文件过大的时候,会对Redis造成影响,那么Redis就会对AOF进行重写 如

    //假设系统有如下三条命令
    127.0.0.1:6379[1]> RPUSH list 1 2 3 4    //[1,2,3,4]
    127.0.0.1:6379[1]> RPOP list                    //[1,2,3]
    127.0.0.1:6379[1]> LPOP list            //[2,3]
    
    //其实可用一条命令代替
    RPUSH 2,3
    
    复制代码

    经过重写可大大缩小Redis AOF文件的大小

  • 4、AOF文件何时启用 AOF文件也是在系统启动的时候系统自动载入AOF文件进行同步

2.3、AOF与RDB共存时启动过程

见下图

Redis单机数据库持久化与过期建删除

2.4、一些值得探讨的事

我们知道redis是内存数据库,并非持久化数据库,根据CAP理论,redis是满足高可用和分区容错性的数据库,那么其实Redis的持久化并不安全?答案确实如此,很多人说,Redis也是可以做到持久化的,将AOF的持久化策略设置为awalys不就可以了吗,那样最多就丢失一条命令。。。

但是这恰恰违背了Redis高可用的特性,会大大降低Redis的qbs,让Redis大打折扣,在通常情况下我们采用的是everysec,在每隔一秒将缓冲区的数据写回AOF文件,这样的话,如果系统宕机,就会有丢失一秒数据的危险。

鱼与熊掌不可兼得,所以Redis并不是很好的持久化数据库工具,当保存重要数据的时候还是得使用mysql sqlsever 等持久化数据库工具。

结语

文本简单介绍了redis的一些简单的内容,如有差错欢迎讨论和提出意见与建议,请各位大神手下留情,下一篇文章本小小编将简单介绍多机版Redis的集群,集群同步等内容,期待下回再见。

  • 参考书籍《Redis设计与实现》
  • 网上文章,不一一列举。

增鑫

广州芦苇科技 Java 开发团队

芦苇科技-广州专业互联网软件服务公司

抓住每一处细节 ,创造每一个美好

关注我们的公众号,了解更多

想和我们一起奋斗吗?lagou搜索“ 芦苇科技 ”或者投放简历到 server@talkmoney.cn 加入我们吧

Redis单机数据库持久化与过期建删除

关注我们,你的评论和点赞对我们最大的支持


以上所述就是小编给大家介绍的《Redis单机数据库持久化与过期建删除》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

游戏编程模式

游戏编程模式

Robert Nystrom / GPP翻组 / 人民邮电出版社 / 2016-9-1 / 61.4

游戏开发一直是热门的领域,掌握良好的游戏编程模式是开发人员的应备技能。本书细致地讲解了游戏开发需要用到的各种编程模式,并提供了丰富的示例。 全书共分20章,通过三大部分内容全面介绍了与游戏编程模式相关的各类知识点。首部分介绍了基础知识和框架;第二部分深入探索设计模式,并介绍了模式与游戏开发之间的关联;第三部分介绍了13种有效的游戏设计模式。 本书提供了丰富的代码示例,通过理论和代码示例......一起来看看 《游戏编程模式》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具