Redis存储的区域主要是内存
内存分配:
不同数据类型的大小限制:
String类型:一个String类型的value最大可以存512M。
Lists类型:list的元素个数最多为2^32-1个,也就是4294967295个。
Sets类型:元素个数最多为2^32-1个,也就是4294967295个。
Hashes类型:键值对个数最多为2^32-1个,也就是4294967295个。
最大内存控制,在redis.conf配置文件:
maxmemory 最大内存阈值
maxmemory-policy 达到阈值的执行策略
内存压缩,Redis的内存压缩配置,大小超出压缩范围,溢出后Redis将自动将其转换为正常大小,不在压缩,为了降低CPU运用。
#配置字段最多512个
hash-max-zipmap-entries 512
#配置value最大为64字节
hash-max-zipmap-value 64
#配置元素个数最多512个
list-max-ziplist-entries 512
#配置value最大为64字节
list-max-ziplist-value 64
#配置元素个数最多512个
set-max-intset-entries 512
#配置元素个数最多128个
zset-max-ziplist-entries 128
#配置value最大为64字节
zset-max-ziplist-value 64
过期数据的处理策略:
主动处理(redis主动触发检测key是否过期)每秒执行10次。过程如下:
-
从具有相关过期的密钥集中测试20个随机密钥(收集带有设置过期时间的key)
-
删除找到的所有密钥已过期(删除过期的key)
-
如果超过25%的密钥已过期,请从步骤1重新开始
被动处理:
-
每次访问key的时候,发现超时后被动过期,清理掉
数据恢复阶段过期数据的处理策略:
RDB方式:
-
过期的key不会被持久化到文件中。
-
载入时过期的key,会通过redis的主动和被动方式清理掉(例:key设置了过期时间5秒,当第3秒Redis服务挂掉了,5秒后重启,重启加载RDB会根据当前系统时间判断是否过期,然后对过期数据进行主动处理策略)
AOF方式:
-
当redis使用AOF方式持久化时,每次遇到过期的key redis会追加一条DEL 命令到 AOF文件,也就是说只要我们顺序载入执行AOF命令文件就会删除过期的键。
注意:过期数据的计算和计算机本身的时间是有直接联系的!
Redis内存回收策略:
在redis.conf修改配置:
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 |
在已经过期的可以里随机回收 |
volatile-ttl |
回收已经过期的key,并且优先回收存活时间(TTL)较短的键 |
lru:当内存不足的时候首先清除最久没有被访问的数据
lfu:当内存不足的时候首先清除概率计算被访问次数最少的数据
LRU算法:
LRU(Least recently used,最近最少使用):根据数据的历史访问记录来进行淘汰数据
-
核心思想:如果数据最近被访问,那么将来被访问的几率也更高。
-
注意:Redis的LRU算法并非完整的实现,完整的LRU实现是因为这需要太多的内存。
-
方法:通过对少量kyes进行抽样(50%),然后回收其中一个最好的key。
-
配置方式,在redis.conf文件配置:maxmemory-samples 5
LFU算法:
LFU(Least Frequently Used)根据数据的历史访问频率来淘汰数据
-
核心思想:如果数据过去被访问多次,那么将来被访问的频率也更高。
-
Redis实现的是近似的实现,每次对key进行访问时,用于概率的对数计算器来记录访问的次数,同时这个是计算器会随着时间推移而减小。
-
Morris counter算法依据:https://en.wikipedia.org/wiki/Approximate_counting_algorithm
-
启动LFU算法后,可以使用热点数据分析功能。(redis-cli --hotkeys),如查看热点数据是哪些。