内存
一、认识
二、内存分析
Redis
通过 info memory
可以查看 内存 使用情况
-
used_memory
:Redis
分配器分配的内存量, 也就是实际存储数据的内存总量。used_memory
包括:-
自身内存:
800k
左右 -
对象内存:
key
和Value
。key
不要过长, 数据量大的情况下, 不容忽视。value
通过ziplist
、intset
等优化方式 -
缓冲内存: 包括 客户端缓冲区、复制缓冲区、
AOF
缓冲区。客户端缓冲区: 可以通过client list
命令查看。包括 普通客户端缓冲区normal
、Slave
客户端缓冲区slave
, 从节点用于复制, 伪装成客户端、PubSub
客户端缓冲区pubsub
。对应的配置为client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
, 其中,class
表示 客户端类型;hard limit
表示如果客户端使用的输出缓冲区大于hard limit
,客户端会被立即关闭;soft limit
和soft seconds
表示如果客户端使用的输出缓冲区超过了soft limit
并且持续了soft seconds
秒, 客户端会被立即关闭。普通客户端缓冲区normal
默认配置为:client-output-buffer-limit normal 0 0 0
;Slave
客户端缓冲区slave
默认配置为client-output-buffer-limit slave 256mb 64mb 60
, 当主从延迟较高, 或者从节点过多, 可能会超过limit
限制, 所以可以适当设置的大一些, 防止客户端被关闭。PubSub
客户端缓冲区pubsub
默认配置为client-output-buffer-limit pubsub 32mb 8mb 60
。 -
Lua
内存
-
-
used_memory_rss
: 从操作系统的角度,Redis
进程占用的总物理内存 -
mem_fragmentation_ratio
:use_memory_rss / used_memory
比值, 表示内存碎片率 -
use_memory-rss - use_memory
: 内存碎片
三、内存回收
3.1 删除过期键值
删除过期键值 Redis
不保证精确的到期时间,因为过期键的删除是由后台线程或访问触发的。Redis
使用 惰性删除 和 定期删除 机制处理过期键。惰性删除:只有当过期键被访问时才会检查并删除。定期删除:Redis
会定期扫描一部分键来删除已过期的键。
3.2 内存溢出控制策略
当 Redis
使用的内存超过 maxmemory
后会触发相应策略, 由 maxmemory-policy
控制。策略如下:
-
Noeviction
, 默认策略, 不会删除任何数据, 拒绝所有写入操作并返回端错误信息 -
Volatile-lru
: 根据LRU
算法删除设置了超时属性Expire
的键, 直到腾出足够的空间为止。如果没有可删除的键对象, 回退到noeviction
策略。 -
Allkeys-lru
: 根据LRU
算法删除键, 不管数据有没有设置超时属性, 直到腾出足够空间为止。 -
Allkeys-random
: 随机删除所有键, 直到腾出足够空间为止。 -
volatile-random
: 随机删除过期键, 直到腾出足够空间为止。 -
volatile-ttl
: 根据键值对象的ttl
属性, 删除最近将要过期数据。如果没有,回退到noeviction
策略。