Redis优化内存方案
1.Redis内存分析
Localhost:8379> info memory
因为内存碎片的存在,Used_memory_rss通常大于used_memory,如果开启磁盘swap作为内存,此时出现used_memory_rss小于used_memory,因为磁盘读写速度远小于内存读写速度,所以开启swap影响redis性能。
2.Redis内存消耗在哪里?
Redis的读写、操作都在内存上。内存占用主要分为客户端KV缓存、内存碎片、Redis自身占用;
2.1.客户端KV缓存
Redis存储五种基本类型string、hash、list、set、zset;以及基于string的bitMap和HyperLogLog类型等,由于这部分属于业务数据,一般需要优化业务模块。
2.2.内存碎片
Redis在存储和回收之后,会造成不连续的内存碎片。
2.3.Redis自身占用
Redis自身消耗内存包括客户端缓存、复制积压缓存、AOF缓冲区等
2.3.1.客户端缓存
Redis主从复制时,主节点为每个从节点开辟一个TCP缓冲区,用于同步发送数据,如果缓存区较大而从节点较多,则占用内存较多,缓存配置为
Client-output-buffer-limit slave 256MB 64MB 60
Redis订阅功能中,主节点为每个业务客户端开辟订阅区缓存,订阅客户端多且生产慢于消费时,内存占用上升
Client-output-buffer-limit pubsub 32MB 8MB 60
Redis普通功能,一般不占用缓存区
Client-output-buffer-limit normal 1000
因此Redis主要限制连接数,需要注意几点:
maxclients最大连接数配置必不可少
单次读写TTL不易过大
禁止keys等大吞吐量指令
2.3.2.复制积压缓存
2.3.3.AOF缓冲区
Redis开启AOF持久化时,AOF刷盘时会增量数据写到该缓冲区
2.3.4.Fork子进程透明大页THP
持久化写时复制从4KB增大到2MB,高并发下消耗内存大,选择性关闭
3.Redis内存管理
3.1.最大连接数限制
Localhost:8379> config set maxmemory {}
3.2.内存回收策略
3.2.1.自动回收
惰性回收:访问时惰性删除过期键
定时回收:每秒10次Redis随机扫描并删除过期间,若回收比例超过1/4则自动递归回收
持久化时回收:RDB不复制过期数据;AOF给过期数据追加del指令
3.2.2.溢出回收
Redis达到内存最大值时触发回收机制,包括六种方案:
Noevication:不回收,抛错
Volatile-lru:在过期数据中回收最近最少使用的
Volatile-random:在过期数据中随机回收
Allkeys-lru:所有数据中回收最近最少使用的
Allkeys-random:所有数据中随机删除
Volatile-ttl:删除最近过期数据
4.结论
从服务端考虑,订阅功能和连接数会造成额外内存开销,可减少额外开销或减少连接数,或增加主库。同时开启RDB'/AOF持久化有助于清理过期数据
从客户端考虑,同时大量订阅和连接会造成服务端额外内存开销,数据应设置过期值,有助于服务端通过自动回收和回收策略及时释放内存
本文来自博客园,作者:SArtOnline,转载请注明原文链接:https://www.cnblogs.com/sartonline/p/16132320.html