前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis原理篇之通信协议和内存回收

Redis原理篇之通信协议和内存回收

作者头像
大忽悠爱学习
发布2022-05-31 10:39:03
2950
发布2022-05-31 10:39:03
举报
文章被收录于专栏:c++与qt学习

Redis原理篇之通信协议和内存回收


Redis通信协议

RESP

在这里插入图片描述
在这里插入图片描述

模拟Redis客户端

具体代码放在了下面的gitee仓库中:

https://gitee.com/DaHuYuXiXi/mock-redis-client


Redis内存回收策略

过期策略

通过expire命令可以给Redis的key设置TTL:

在这里插入图片描述
在这里插入图片描述

可以发现,当key的TTL过期后,再次访问name返回的是nil,说明这个key已经不存在了,从而起到了内存回收的目的。


这里有两个问题大家可以思考一下:

  • Redis是如何知道一个key是否过期呢?
  • 是不是TTL到期就立即删除了呢/

Redis本身是一个典型的key-value内存存储数据库,因此所有的key,value都保存在之前学习过的Dict结构中。

不过在其database结构体中,有两个Dict: 一个用来记录key-value,另一个记录key-TTL.

在这里插入图片描述
在这里插入图片描述

惰性删除

惰性删除: 并不是在TTL到期后就立刻删除,而是在访问一个Key的时候,检查该key的存活时间,如果已经过期了才会执行删除。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

周期删除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

小结

在这里插入图片描述
在这里插入图片描述

淘汰策略

内存淘汰: 就是当Redis内存使用达到设置的阈值时,Redis主动挑选部分Key删除以释放更多内存的流程。

Redis会在处理客户端命令的方法processCommand()中尝试做内存淘汰。

在这里插入图片描述
在这里插入图片描述

Redis在任何命令执行之前都会去做内存检查


八种策略

在这里插入图片描述
在这里插入图片描述

RedisObject

在这里插入图片描述
在这里插入图片描述

对于LFU而言,虽然统计的逻辑访问次数并不准确,但是

  • 第一次来,p为1,r<p,计数器一定会加1
  • 后面再来,p一定小于1,并且随着访问次数累加,p的值会越来越小,因此r<p的概率会越来小,计数器累加的可能性也会越来越小,但是只要你访问次数够多,计数器的值就会变大
  • 因此计数器的值越大,表明逻辑访问次数越来越大
  • 如果某个key在某段时间内被疯狂访问,以至于计数器已经到达最大上限值,但是过了这段时间,这个key长时间没人访问,那么计数器会随着时间衰减

流程图

在这里插入图片描述
在这里插入图片描述

有个问题: eviction_pool是会对传入的key进行升序排列的,然后每次删除key的时候,从池中取出最后一个key进行删除,那么不同的淘汰策略,eviction_pool按照什么规则进行排序呢?

  • 这里很巧妙的一点是redis的每种排序策略最终计算出来的都是统一的idleTime值,越大表示越该被淘汰,因此放入eviction_pool中时会判断池子是否已经满了,如果满了,那么判断当前key的idleTime是否比当前池中某个key的idleTime大,如果是的话会替换对应的key,即我比你还烂,我应该先被淘汰。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Redis原理篇之通信协议和内存回收
  • Redis通信协议
    • RESP
      • 模拟Redis客户端
      • Redis内存回收策略
        • 过期策略
          • 惰性删除
          • 周期删除
          • 小结
        • 淘汰策略
          • 八种策略
          • RedisObject
          • 流程图
      相关产品与服务
      云数据库 Redis
      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档