Redis原理篇之通信协议和内存回收
2023-09-14 09:13:33 时间
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,即我比你还烂,我应该先被淘汰。
相关文章
- php+redis,延迟任务 实现自动取消订单,自动完成订单
- windows redis:Uncaught exception 'RedisException' with message 'Redis server went away'
- Redis学习(2)-redis安装
- 节约内存:Instagram的Redis实践(转)
- redis竟然还有哨兵模式,所以更加不能再扩展了,必须要在已有的基础上进行深挖!!!
- [Node.js]31. Level 7: Redis coming for Node.js, Simple Redis Commands
- windows x64安装与测试redis
- Redis-Cluster实战--5.使用redis-cli安装
- Redis的三种启动方式
- 配置redis外网可访问
- tomcat配置tomcat-redis-session-manager
- Redis-Cluster实战--5.使用redis-cli安装
- redis集群之REDIS CLUSTER
- redis配置文件redis.conf参数说明
- Redis 切片集群:数据增多了,是该加内存还是加实例?
- Redis 单机部署redis实例
- Redis 客户端的管理 输入缓冲区
- redis 内存淘汰策略和内存大小限制
- C#中使用Redis不同数据结构的内存占有量的疑问和对比测试
- 一个最简单的例子学会使用nodejs redis库进行数据库操作
- 〖Python 数据库开发实战 - Python与Redis交互篇⑥〗- redis-py 的事务函数
- Python:缓存库mo-cache支持内存、文件、Redis
- Redis 作者 Antirez 讲如何实现分布式锁?Redis 实现分布式锁天然的缺陷分析&Redis分布式锁的正确使用姿势!...
- redis_05 _ 内存快照:宕机后,Redis如何实现快速恢复
- redis_02 _ 数据结构:快速的Redis有哪些慢操作?
- redis哨兵
- Redis内存碎片
- redis为什么内存不宜过大
- 设置Redis最大占用内存
- redis设置密码和redis主从复制
- 关于python语言使用redis时,连接是否需要关闭的问题
- 【云原生】Redis on k8s 编排部署讲解与实战操作
- 【redis】Redis缓存失效、雪崩、穿透、击穿、并发等案例分析难题解决方案
- Redis is configured to save RDB snapshots redis的 rdb持久化错误
- Redis 优化之内存分配控制 vm.overcommit_memory
- Redis_09_Redis内存回收机制