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单机数据库持久化与过期建删除》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Spark

Spark

Bill Chambers、Matei Zaharia / O′Reilly / 2017-10-31 / GBP 39.99

Learn how to use, deploy, and maintain Apache Spark with this comprehensive guide, written by the creators of the open-source cluster-computing framework. With an emphasis on improvements and new feat......一起来看看 《Spark》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具