1.redis持久化
(1)简介
Redis的数据都放在内存中,如果没有配置持久化,Redis重启后数据就丢失了,于是需要开启Redis的持久化功能,将数据保存到磁盘上,当Redis重启后,可以从磁盘中恢复数据。
实际情况中,可能不开启持久化;数据不丢失需要开启aof always
(2)持久化方式RDB和AOF对比
RDB | AOF(append only file) | |
---|---|---|
持久化 | 在指定的时间间隔对你的数据进行快照存储。 | 记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据。 |
方式 | 客户端直接通过命令BGSAVE或者SAVE创建一个内存快照。BGSAVE调用fork来创建一个子进程,子进程负责将快照写入磁盘,而父进程仍然继续处理命令。SAVE执行SAVE命令过程,不再影响其他命令。在redis.conf中调整save配置选项,当在规定的时间内,Redis发送了写操作的个数满足条件会发生BGSAVE命令。#900秒内至少执行一次写操作save 900 1 | 开启AOF持久化appendonly yes AOF策略调整 #每次有数据修改时都会写入AOF文件appendfsync always #每秒钟同步一次,该策略为AOF的缺省策略 appendfsync everysec #从不同步。高效但是数据不会被持久化。appendfsync no |
优点 | 对性能影响小;RDB文件进行数据恢复比AOF快很多。 | 最安全;容灾;易读,可修改。 |
缺点 | 同步时丢失数据。如果数据集非常大且CPU不够强(比如单核CPU),Redis在fork子进程时可能消耗相对较长的时间,影响Redis对外提供服务的能力。 | 文件体积大;性能消耗比RDB高;数据恢复速度比RDB慢。 |
2.内存管理
(1)内存分配
不同数据类型的大小限制
类型 | 大小 |
---|---|
Strings | 一个String类型的value最大可以存储512M |
Lists | 元素个数最多为2^32-1个,也就是4294967295个 |
Sets | 元素个数最多为2^32-1个,也就是4294967295个 |
Hashes | 键值对个数最多为2^32-1个,也就是4294967295个 |
#最大内存控制
maxmemory 最大内存阈值
maxmemory-policy 到达阈值的执行策略
(2)内存压缩
#配置字段最多512个
hash-max-zipmap-entries 512
#配置value最大为64字节
hash-max-zipmap-value 64
##配置元素个数最多512个
list-max-ziplist-entries 512
(3)过期数据的处理策略
- 主动处理(redis主动触发检测key是否过期)每秒执行10次数。执行过程如下:
1.从具有相关过期的密钥集中测试20个随机密钥。
2.删除找到的所有密钥已过期。
3.如果超过25%的密钥已过期,则从步骤1重新开始。 - 被动处理
每次访问key的时候,发现超时后被动过期,清理掉。
数据恢复阶段过期数据的处理策略
- RDB方式
过期的key不会被持久化到文件中
载入时过期的key,会通过redis的主动和被动方式清理掉。 - AOF方式
当redis使用AOF方式持久化时,每次遇到过期的key redis会追加一条DEL命令到AOF文件, 也就是说只要我们顺序载入执行AOF命令文件就会删除过期的键。
【注意:过期数据的计算和计算机本身的时间是有直接联系的。】
(4)Redis内存回收策略
- 配置文件中设置:maxmemory-policy noeviction
- 动态调整:config set maxmemory-policy noeviction
回收策略 | 说明 |
---|---|
noeviction | 客户端尝试执行会让更多内存被使用的命令直接报错 |
allkeys-lru | 在所有key里执行LRU算法 |
volatile-lru | 在所有已经过期的key里执行LRU算法 |
volatile-lfu | 使用过期集在密钥中使用近似LFU进行驱逐 |
allkeys-lfu | 使用近似LFU逐出任何键 |
allkeys-random | 在所有key里随机回收 |
volatile-random | 在已经过期的key里随机回收 |
volatile-ttl | 回收已经过期的key,并且优先回收存活时间(TTL)较短的键 |
(5)LRU和LFU算法
LRU(Last recently used,最近最少使用):根据数据的历史访问记录来进行淘汰数据。
- 核心思想:如果数据最近被访问过,那么将来被访问的机率也更高。
- 注意:Redis的LRU算法并非完整的实现,完整实现的LRU实现是因为这需要太多的内存。
- 方法:通过对少量keys进行取样(50%),然后回收其中一个最好的key。
- 配置方式;maxmemory-samples 5
LFU算法
LFU(Least Frequently Used)根据数据的历史访问频率来淘汰数据
- 核心思想:如果数据过去被访问多次,那么将来被访问的频率也更高。
- Redis实现的是近似的实现,每次对key进行访问时,用基于概率的对数计算器(次数和存在时间的比值)来记录访问次数,同时这个计数器会随着时间推移而减小。
- 启用LFU算法后,可以使用热点数据分析功能。(redis-cli–hotkeys)