基本性能指标
- used_memory 是Redis使用的内存总量,它包含了实际缓存占用的内存和Redis自身运行所占用的内存(如元数据、lua)。包括了物理内存数据和虚拟内存数据之和。
- used_memory_human 中的Human指给人看的数据,哈哈哈。
- used_memory_rss:是redis的工作内存,即存放在物理内存里的数据量。
- used_memory_peak 是 used_memory 的峰值。
- mem_fragmentation_ratio 是 物理内存 里的数据(包含了有内存碎片)与 used_memory 的比值。
- maxmemory 是用于回收内存的指标,当use_memory超过maxmemory就会删除过期的数据。
- 这只是其中一种策略,还有一种删除策略是基于抽查概率来触发的,定时删除任务。
- 关于 maxmemory 这个参数又会衍生出6种选择策略,对过期key进行删除。
- 为什么redis那么重视Key的删除呢?因为redis作为缓存,那么合理的做法就是大部分都是有过期时间的,而且作为专业的缓存组件也应该提供专业的缓存回收算法,而不应该让系统本身自己来设计缓存策略,除非很有必要的时候。
- redis有6种主键回收策略。
- 先说说两种回收算法。
- 将临近过期的回收,就像超市对临近保质期商品清仓一样。
- LRU,将最近最少使用的数据回收。
- 再说说redis,redis有两种key。
- 一种是有设置TTL的,也就是允许删除的。
- 另一种是没用TTL的,也就是持久化的。
- 了解上面的情况后,我们两两组合就可以得知3种redis内存回收策略。
(没有TTL的key没有临近过期的说法) - 其中回收算法才是精髓,至于redis的TTL只是看我们如何定位redis的角色,理论上应该把redis看作是缓存,然后对所有key设置TTL。
- redis还有一种极端的做法,就是不允许回收内存,一旦内存不足
(usememory接近maxmemory),申请内存就会抛异常。
- 这种极端策略是用于自定义回收策略。
Redis提供了下面几种淘汰策略
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
noeviction:禁止驱逐数据,当内存使用达到阈值的时候,所有引起申请内存的命令会报错
作者:yjwlyy
链接:https://www.jianshu.com/p/ad8f35c2c0d0
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- redis的对象,分为Key对象和value对象。
- evicted_keys属性就是被回收的keys的数量
- 如果evicted_keys增加速度比较快,说明一部分CPU被征用来回收Key
- maxmemory是用来控制内存回收的常用手段,简化内存回收频率从而提高响应速度。但是浪费内存。
- 作为开发,既要保证性能也要合理使用数据结构去兼顾内存空间。
- 但是如果为了cpu响应速度,迟迟不回收内存则会引发数据臃肿导致内存置换,最终响应速度降低。
- 分片的方法:
- 求余桶分片
- 虚拟桶分片(采用一个配置文件来对应物理桶和虚拟桶)
- ringbuff(哈希一致性算法)
- 代理分片,如Twitter的Twemproxy,豌豆荚的codis。(中间件,类似虚拟桶)
- 常用性能指标,use_memory,use_memory_rss, mem_fragmentation_ratio,maxmemory-policy,evicted_keys.
- 当开启并触发快照功能时,Redis会fork一个子进程把当前内存中的数据完全复制一份写入到硬盘上。
- total_commands_processed 字段显示了Redis服务处理命令的总数
- 由于redis是单线程执行命令,如果出现慢查询,那么后面的命令会被阻塞,导致total_commands_processed字段增速下降,redis响应超时。
- LPUSH、MSET等批命令性能比LSET这种每次添加一次的命令要快(因为redis单线程)。
- pipeline可以减少网络延迟,可以提速数百倍。
- Redis-cli --latency -h 127.0.0.1 -p 6379 跟踪redis的命令延迟。
- slowlog 查询redis的慢查询,执行时间超过10ms就会被记录到日志。
- 假如只需要查看最后10个慢命令,输入slowlog get 10即可。(关注第3个字段,查询执行时间)
- 字段(connected_clients)显示当前实例客户端连接的总数。
- 内存碎片通常是分配算法和回收算法有误差引起的,要么换分配器,或者重启进程。
- set,和hash很像,大数据用hashtable,小数据用ziplist
- zset,小数据用万金油,ziplist,大数据用跳表。
- ziplist,就是键值对并且一起放在数据组里面。
疑问
- 为什么选用合适的数据结构会缩小redis的内存占用呢?
- 因为面对长字符串或者大hash表,redis为了提高搜索性能采用hashmap这种大内存数据结构,来支持hash对象。