redis的两种策略

本文详细介绍了Redis的两种持久化策略:RDB和AOF,包括它们的原理、触发条件、优缺点和配置方法。此外,还讨论了Redis的淘汰策略,解释了不同淘汰算法的工作原理,以应对内存溢出的情况。最后,提出了根据业务场景选择合适策略的建议,以优化性能和数据完整性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两种策略

一、持久化策略

       1. 为什么需要持久化

        了解持久化策略之前,我们需要知道redis为什么需要持久化,是因为redis数据是保存在内存中,为了避免关闭程序之后数据丢失,所以我们需要将数据保存在磁盘文件上,这个过程就是持久化。

       2. 持久化的分类

       1.RDB
       1.1 RDB的原理

        RDB是redis默认的持久化策略,当redis中写操作达到指定的次数同时距离上一次持久化达到指定的时间就会将redis内存中数据生成数据快照保存到指定的rdb文件中。

        1.2 RDB默认触发持久化的条件
条件
900s/1次900秒中修改至少1个键
300s/10次300秒中修改至少10个键
60s/10000次60秒中修改至少10000个键
       1.3 选择持久化策略

        视业务场景而定:

                允许少量数据丢失,性能要求高,选择RDB

                只允许很少数据丢失,选择AOF

                几乎不允许数据丢失,选择RDB + AOF

        1.4 配置方法

         在redis.config中配置持久化代码

  1. # Save the DB on disk:保存数据库到磁盘    
  2. #    
  3. #   save <秒> <更新>    
  4. #    
  5. #   如果指定的秒数和数据库写操作次数都满足了就将数据库保存。    
  6. #    
  7. #   下面是保存操作的实例:    
  8. #   900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)    
  9. #   300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化)    
  10. #   60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)    
  11. #    
  12. #   注释:注释掉“save”这一行配置项就可以让保存数据库功能失效。    
  13. #    
  14. #   你也可以通过增加一个只有一个空字符串的配置项(如下面的实例)来去掉前面的“save”配置。    
  15. #    
  16. #   save ""    
  17.     
  18. save 900 1    
  19. save 300 10    
  20. save 60 10000    
  21.     
  22. #在默认情况下,如果RDB快照持久化操作被激活(至少一个条件被激活)并且持久化操作失败,Redis则会停止接受更新操作。    
  23. #这样会让用户了解到数据没有被正确的存储到磁盘上。否则没人会注意到这个问题,可能会造成灾难。    
  24. #    
  25. #如果后台存储(持久化)操作进程再次工作,Redis会自动允许更新操作。    
  26. #    
  27. #然而,如果你已经恰当的配置了对Redis服务器的监视和备份,你也许想关掉这项功能。    
  28. #如此一来即使后台保存操作出错,redis也仍然可以继续像平常一样工作。    
  29. stop-writes-on-bgsave-error yes    
  30.     
  31. #是否在导出.rdb数据库文件的时候采用LZF压缩字符串和对象?    
  32. #默认情况下总是设置成‘yes’, 他看起来是一把双刃剑。    
  33. #如果你想在存储的子进程中节省一些CPU就设置成'no',    
  34. #但是这样如果你的kye/value是可压缩的,你的到处数据接就会很大。    
  35. rdbcompression yes    
  36.     
  37. #从版本RDB版本5开始,一个CRC64的校验就被放在了文件末尾。    
  38. #这会让格式更加耐攻击,但是当存储或者加载rbd文件的时候会有一个10%左右的性能下降,    
  39. #所以,为了达到性能的最大化,你可以关掉这个配置项。    
  40. #    
  41. #没有校验的RDB文件会有一个0校验位,来告诉加载代码跳过校验检查。    
  42. rdbchecksum yes    
  43.     
  44. # 导出数据库的文件名称    
  45. dbfilename dump.rdb    
  46.     
  47. # 工作目录    
  48. #    
  49. # 导出的数据库会被写入这个目录,文件名就是上面'dbfilename'配置项指定的文件名。    
  50. #     
  51. # 只增的文件也会在这个目录创建(这句话没看明白)    
  52. #     
  53. # 注意你一定要在这个配置一个工作目录,而不是文件名称。    
  54. dir ./    
        1.5 RDB的优缺点

        优点:
                (1)在数据量较小的情况下,执行速度比较快
                (2)由于RDB是以数据快照形式保存的,我们可以通过检索拷贝rdb文件轻松实现redis数据移植
        缺点:
                (1)如果redis出现故障,存在数据丢失的风险,丢失上一次持久化之后的操作数据(因为每次持久化,都会有操作次数以及时间间隔)
                (2)RDB采用的数据快照的形式进行的持久化,不适合实时性持久化
                (3)如果数据量庞大,在RDB持久化过程中生成数据快照子进程执行时间过长,会导致redis卡顿,因此Save的时间周期设置不宜过短(默认配置即可) 

        2.AOF
        2.1 AOF的原理

    redis将每一个成功的写操作写入aof文件中,当redis重启的时候就执行aof文件中的指令以恢复数据

        2.2 AOF触发持久化的条件:
AOF默认持久化配置
appendfsync always 只要进行成功写操作,aof就执行
appendfsync everysec 每秒进行一次aof(默认)
appendfsync no让redis执行决定aof


        redis默认是AOF未开启的;可以通过将redis配置文件中‘appendonly no’修改为‘appendonly yes’进行开启 ;AOF也可以设置aof路径,默认是‘appendfilename "appendonly.aof"’

        2.3 AOF持久化细节分析

1.可以通过拷贝aof文件jinxingredis数据移植
2.aof存储的是指令,而且会对指令进行整理,而RDB直接生成的数据快照,在数据量不大的时候会比较快
3.aof是对文件进行增量更新,更适合实时性持久化
4.redis官方建议是同时开启两种持久化策略,如果同时存在aof文件以及rdb文件,当我们需要进行数据移植的时候,优先选择aof(数据完整性会相对高一点) 

二、淘汰策略 

        1.什么是淘汰策略

        Redis中的数据太多可能导致内存溢出,Redis会根据情况淘汰一些数据。 Redis的内存上限:64位系统,上限就是内存上限;32位系统,最大是4G 配置最大内存:max-memory  配置0就是无上限(默认)。

        2.配置淘汰策略

        2.1 分类
淘汰策略的分类
noevication不淘汰(默认)
volatile-ttl在将过期键中淘汰存活时间短的键
volatile-lfu在将过期的键中淘汰使用频率较少的键
volatile-lru在将过期的键中淘汰很久前使用的键
volatile-random在将过期键中随机淘汰
allkeys-random在所有键中随机淘汰
allkeys-lfu在所有键中淘汰使用频率较少的键
allkeys-lru在所有键中使用LRU算法淘汰比较少使用的键 (推荐)

2.2 涉及的算法

主要是4种算法,针对不同的key,形成的策略。
算法:

  1. lru 最近很少的使用的key(根据时间,最不常用的淘汰)
  2. lfu 最近很少的使用的key (根据计数器,用的次数最少的key淘汰)
  3. random 随机淘汰
  4. ttl 快要过期的先淘汰
2.3内存淘汰算法的具体工作原理是

1.客户端执行一条新命令,导致数据库需要增加数据(比如set key value)

2.Redis会检查内存使用,如果内存使用超过 maxmemory,就会按照置换策略删除一些 key

3.新的命令执行成功

总结 

        redis的两种策略,都是为了提升机器的性能,针对不同的情况选择不同的处理方式,提升用户体验感。


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值