redis 内存淘汰机制等知识

基本性能指标

  • 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对象。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值