内容简介:作为一名程序猿,redis已经是我们接触最多的缓存工具之一,它的应用面很广,那么大家是否对他真的有些了解呢,对于antirez大神的想法我也是算不上略懂一二,再此知识简单谈谈关于redis的一些小事首先让我们来了解一下redis的存储结构(废话不多说,直接上图)这张图很好地说明了Redis是如何存储的,我们知道redis是以键值对的方式来进行数据存储,首先redis会维持一个键表,在这个表上存储着redis所有的 “key” (也就是direct表)再来就是以指针的方式指向对于的"value",而它的val
作为一名程序猿,redis已经是我们接触最多的缓存 工具 之一,它的应用面很广,那么大家是否对他真的有些了解呢,对于antirez大神的想法我也是算不上略懂一二,再此知识简单谈谈关于 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中专门会设置一个表来存储所有设置了过期键的键值对,存储方式为添加一个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共存时启动过程
见下图
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单机数据库持久化与过期建删除》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。