内存的消耗
可以使用info memory
查看内存消耗。
内存划分
- 对象内存 = sizeof(key) + sizeof(value) 应避免使用过长的key
- 缓冲内存
* Redis自身内存:消耗比较小可忽略不计
* 客户端缓存:所有接入Reids服务器的TCP连接的输入输出缓存
* 复制积压缓存区:可以有效避免全两复制
* AOF缓存:用户Redis重写期间保存最近的写入命令
* 内存碎片: 这里是重点需要注意的
* 子进程内存消耗:AOF/RDB重写时Redis创建的子进程消耗的内存。
内存管理
Redis主要通过设置内存上限和回收策略实现内存管理
-
设置内存上限
1)当内存超过上限时会通过LRU等策略释放空间
2)防止所有内存超过服务器的物理内存 -
回收策略
1)删除过期键对象
* 惰性删除:客户端读取对象时发现过期了才删除。
* 定时任务删除:
Redis自己维护的定时任务,默认每秒运行10次。从每个数据库随机检查20个键如果超过25%的键过期了则循环执行回收逻辑直到不足25%或者运行超时为止
2)内存溢出的控制策略策略 说明 noeviction
默认策略,拒绝写入单不删除,只响应读操作 volatitle-LRU
根据LRU算法删除过期的键,直到腾出足够空间,如果没有可删除的键则会退到默认策略 allkeys-LRU
根据LRU算法删除键,不管是否超时,直到腾出足够空间 allkeys-random
随机删除所有键,直到腾出足够空间为止 volatitle-random
随机删除过期键,直到腾出足够空间 volatitle-ttl
根据键对象的TTL,删除最近要过期的键。如果没有可删除的键则会退到默认策略 Redis4之后支持的内存策略
|volatile-LFU
|根据LFU算法来淘汰过期键。 |
|allkeys-LFU
| 根据LFU算法删除键,不管是否超时,直到腾出足够空间 | -
LRU 算法:
LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。
实现 LRU 算法除了需要 key/value 字典外,还需要附加一个链表,链表中的元素按照一定的顺序进行排列。当空间满的时候,会踢掉链表尾部的元素。当字典的某个元素被访问时,它在链表中的位置会被移动到表头。所以链表的元素排列顺序就是元素最近被访问的时间顺序。位于链表尾部的元素就是不被重用的元素,所以会被踢掉。位于表头的元素就是最近刚刚被人用过的元素,所以暂时不会被踢。 -
LFU算法
LFU 的全称是Least Frequently Used,表示按最近的访问频率进行淘汰,它比 LRU 更加精准地表示了一个 key 被访问的热度
内存优化
- 精简键值对的大小
- 使用高效二进制序列化工具
- 使用对象共享池(0-9999的对象池)优化小整数对象
- 数据优先使用整数,比字符串省空间
- 根据不同数据类型的内部编码优化内存
https://cachecloud.github.io/2017/02/16/Redis%E5%86%85%E5%AD%98%E4%BC%98%E5%8C%96/