Redis是一个内存的缓存中间件,依靠将数据加载到内存中,用空间换时间,这是它性能优异的一个原因,但是相对于硬盘等设备还是比较贵的。所以在使用redis时候还是需要可以尽可能芳节省内存。
Redis内存消耗分析
1.内存使用统计,进入redis并使用 info
命令。
下面表格列出redis统计内存命令info memory 返回的一些主要字段信息。
字段名 | 说明 |
used_memory | Redis内存分配器分配的内存量,也就是实际存储的内存总量 |
used_memory_human | 以可读的格式展示Redis使用的内存总量 |
used_memory_rss | 从操作系统角度,Redis进程所占用的物理内存 |
used_memory_peak | 内存分配器分配的最大内存,代表used_memory的历史峰值 |
used_memory_peak_human | 以人可读的格式展示内存消耗的峰值 |
used_memory_lua | Lua引擎所消耗的内存 |
men_fragmentaion_ratio | used_memory_rss/used_memory的比值,表示内存碎片率 |
mem_allocator | Redis所使用的内存分配器。默认是jemalloc |
2.内存消耗具体划分。
使用info命令只能查看redis一个全局的内存使用情况,但是对于每一个细节的地方不是更加细分。下图是Redis内存的划分
1)自身内存:Redis自身启动所消耗的内存,不过这个内存消耗比较低。
2)对象内存:Redis所缓存的key-value数据,包括五种数据结构(String,Hash,List,Set,Zset),BitMap等。
3)缓冲内存:Redis主从复制的复制数据缓冲区,AOF缓冲区等。
4)Lua内存:Lua引擎所消耗的内存,如果不使用则没有消耗。
5)内存碎片:Redis向操作系统申请内存空间,操作系统所分配的内存和Redis所使用的内存空间的差值,这个差值就是一个碎片。
3.子进程内存的消耗。
Redis执行持久化工作由子进程执行,执行RDB和AOF文件写入等操作。
Redis内存淘汰策略
Redis定义了以下几种策略:
1. noeviction(默认策略):对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外)。
2. allkeys-lru:从所有key中使用LRU(最近最少使用)算法进行淘汰。
3. volatile-lru:从设置了过期时间的key中使用LRU算法进行淘汰。
4. allkeys-random:从所有key中随机淘汰数据。
5. volatile-random:从设置了过期时间的key中随机淘汰。
6. volatile-ttl:在设置了过期时间的key中,根据key的过期时间进行淘汰,越早过期的越优先被淘汰。