redis个人记录

参考大佬的《Redis深度历险》

LRU是最近用到,LFU是最近访问频率。
《Redis深度历险》中有说,如果一个key很长时间没被用到,只是突然被用了一下,LRU下会认为这个KEY是热点key,就不太好。redis的LRU其实是近似LRU,里面也还是通过每个redis对象都有的24位的时间戳来算,当有新key来时,就会触发LRU,随机选5个,比较时间戳,淘汰最旧的(每个key的时间戳到全局时间最久到会被淘汰)并不是类似java实现的每调用一个key就将它移动到链表的头。如果还是超过最大内存,就再选5个
LFU到话,是那个24位到值分为16位到时间和8位到数量,每过段时间数量就会下降,按数量来排序,最小到会被淘汰。
JAVA实现:https://blog.csdn.net/z69183787/article/details/90712377

关于过期时间:
redis对设置了过期时间对key会放入一个独立对字典中,然后会定时遍历。除此之外,还会惰性删除,就是在访问这个key对时候检查一下过期时间。
定时遍历:集中处理 惰性删除:零散处理
定时处理,默认每10秒一次,而且不是所有key,是随机20个。如果这20个里面过期对超过1/4,就重新挑20再来一次。为了不过度循环,还设置了扫描时间上限是25ms.这个扫描好像是阻塞主线程对,如果大量key过期了,然后有用户请求过来,就会阻塞25ms。 那么,如果客户端程序对连接超时时间设置的比25ms短,那么就会出现大量链接因超时而关闭,所以设置过期时间的时候需要随机设置,不能在同一个时间设置。
从节点没有定时删除,是主节点删除时候AOF中会有一个del命令。

使用list作为队列,要注意空轮询,简单点可以thread.sleep,不过对性能有影响,可以用阻塞队列,不过会因为阻塞导致被认为无效链接,要在代码里写重试。

RDB对fork子进程,是COW,将内存分成多个段,每段4k左右,然后子进程持久化原来对,如果对某个段有修改,就复制那一段对数据出来让主进程来修改,和子进程无关。
AOF对重写,bgrewriteaof,就是开一个子进程对内存进行遍历,转换成一系列redis指令,生成到一个新的aof文件中,然后将遍历前发生到AOF命令追加到文件中。

关于redis的管道,redis底层还是TCP协议
https://www.cnblogs.com/kex1n/p/6501977.html
在这里插入图片描述
《Redis深度历险》中的完整交互流程,感觉比较重要就手打一遍:
1.客户端进程调用write将消息写到操作系统内核为套接字分配的发送缓冲区 send buffer中
2.客户端内核将缓冲区的内容发送到网卡,网卡硬件将数据通过"网际路由"送到服务器的网卡
3.服务器内核将网卡的数据放到为套接字分配的接收缓冲区 recv buffer
4.服务器进程调用read从接收缓冲区取出消息并处理
5.服务器调用write将消息写入send buffer,重发回客户端,然后结束。

其中,
write值负责将数据写入send buffer就返回了,剩下的交给系统内核异步将数据发送到目标机器,如果send buffer满了,那么就要等待空出,这个是write IO真正耗时的地方。
read只负责将数据从系统内核recv buffer取出数据,但如果是空但,就要等待,这是read IO真正耗时的地方。

所以,一个简单的命令, value = redis.get(key),write操作几乎没有耗时,但是read要等消息经过网络,然后服务器重发回到recv buffer,这就是真正的耗时开销。
所以PipeLine改变原有的write-read-write-read,变成write-write-read-read,写基本没耗时。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值