redis内部原理解密

一.过期时间设置和原理分析

过期时间设置:expire key seconds
原理:
消极方法(passive way)
积极防范:周期性的从设置了过期时间的key中选择一部分的key进行删除(为了节省内存)
1.随机测试20个带有timeout信息的key
2.删除所有超时的key
3.如果超过25%的key被删除,则重复执行整个流程

二.发布订阅模式

pub/sub
消息的发送和接收,不支持持久化
对指定channel进行订阅,支持正则匹配channel名称

三.redis持久化原理分析

RDB,AOF(两种持久化的方式)
RDB:当符合条件的时候,fork一个子进程生成一个dump.rdb快照文件(覆盖原有文件)
1.配置规则  
save  seconds  changes
save   900      1    (900秒内有一个key被更改)
save   300      10    (。。。)
save   60       10000    (。。。)
此配置是或的关系

2.save(会阻塞所有客户端请求)或者bgsave(异步快照任务,不会阻塞客户端请求)

3.flushall(清空)执行此命令,如果配置的规则存在,就会通过触发配置进行快照的生成

4.执行复制操作:主从复制去触发配置进行快照的生成

缺点:两次快照生成之间如果存在不触发快照生成的内存操作(比如修改值)就会导致数据丢失,如果数据量大,fork也非常消耗性能

AOF:只针对数据变更的操作,会把数据写入到磁盘(默认关闭)
优点:大大降低数据丢失
缺点:性能会很差

如果AOF开启会默认去AOF生成的文件中获取数据
AOF会记录所有的事务操作(插入,更新等),会导致文件越来越大,有配置进行文件内容重写
重写是把内存中的数据进行写入,并不是重写原有文件,重写的时候会生成一个重写缓存,会将重写文件执行时的相关指令追加到重写文件中


四.redis的内存回收策略

LRU:内存管理的一种页面置换算法,对于在内存中但又不用的数据块
如果物理内存1G,如果实际使用内存超过1G,操作系统会从磁盘中划分出一部分用作虚拟内存,此时性能开销会变高,当内存不够的时候redis会进行淘汰一部分对象进行内存的回收操作

maxmemory-policy  noevicition(默认配置)

allkeys-lru 最少使用的数据去淘汰
allkeys-random
volatile-random(从已经设置了过期时间的数据中进行淘汰)/lru(从已经设置了过期时间的数据中使用较少的进行淘汰)/ttl(挑选一些即将过期的)

五.redis单线程为什么性能高

redis的瓶颈:内存和网络带宽
使用单线程处理所有的并发请求
采用多路复用,并且redis是内存操作,单线程也可以减少共同资源的内存竞争

同步阻塞(BIO客户端向服务端发送请求,持续等待直到服务端返回或者链接超时),同步非阻塞(客户端向服务端发送请求,服务端直接返回并同时处理请求,客户端再轮循发送请求直到获取到结果),异步阻塞IO(IO多
路复用,客户端向服务端发送请求(非阻塞,此时客户端会有一个监视的动作),服务端处理完请求后告诉客户端哪一个请求可以执行了,客户端再去执行相关请求),异步非阻塞
同步:用户线程和内核的交互方式
阻塞:线程调用内核做IO操作的时候产生的
样例:主线程启动异步子线程但是2个线程同时访问数据库并做修改,2个线程是异步的,但是访问数据库同一跳记录的时候会阻塞,只有等待第一个先到的线程执行完第二个线程才能执行

虽然redis是单线程的,但是在分布式架构中任然存在操作原子性的问题
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值