Redis(二)原理

Java中操作使用jedis

Redis高级特性,发布订阅、事务、Lua脚本
底层工作原理,单线程工作机制、内存回收、持久化

发布订阅模式

publish subscribe
unsubscribe
这个模式了解一下,专业还是用mq的

Redis事务

Redis(二)原理_第1张图片
multi开启事务,exec执行事务,discard取消事务。watch监视变化

Lua脚本

c语言编写的,为什么用Lua?
好处,
1.多个命令一次发送执行,
2.原子性
3.复杂命令放到文件

Redis(二)原理_第2张图片
写入文件中
通过ip访问次数限制
Redis(二)原理_第3张图片
在这里插入图片描述

Redis为什么这么快

每秒钟接收请求10万·

  1. 纯内存中,kv结构,时间复杂度o(1)
  2. 单线程,无需创建销毁线程,避免上下文切换导致的消耗,无需关心多线程资源问题。单线程就够用了
  3. 异步非阻塞i/o,多路复用

主存是内存,辅存是磁盘
Redis(二)原理_第4张图片

内存回收

expire过期策略,达到上限触发内存回收策略

定时过期 到了时间主动淘汰
惰性过期 下一次访问判断是否需要淘汰,被动淘汰。或者set的时候发现内存多,释放内存
定期过期 拿一些出来进行删除,设置扫描时间

redis使用的是惰性过期+定期过期两种方式结合起来
达到最大内存上限,会进行删除。还有就是访问的时候会调用expireifneed方法进行删除

如果不设置ttl,达到内存上限如何处理?
内存上限可以在redis中进行设置maxmemory,不设置不限制

淘汰策略

Redis(二)原理_第5张图片
lru算法,最近最少使用的优先淘汰
lfu,最不常用的优先淘汰
random,随机算法,随机删除,一般不用
ttl,最近要过期的删除
noeviction,不做淘汰

LRU算法实现,有个采样的配置,从数据库随机选择5个key,热度低的删除
在这里插入图片描述
redisObject中有lru,redis有serverCron方法,隔100毫秒时间改变全局变量global lru_lock的值,评估热度根据lru_lock减去对象中lru差值的结果判断,越大热度低
Redis(二)原理_第6张图片

Redis(二)原理_第7张图片
Redis(二)原理_第8张图片
LFU算法,频率
redisObject中lru8位会记录频率
基于概率的对数计数器
Redis(二)原理_第9张图片
使用updateLFU进行更新
Redis(二)原理_第10张图片
控制计数器增长和减少
Redis(二)原理_第11张图片
LRU和LFU最常见的。

Redis持久化机制

重启后数据不丢失,和modb区别

RDB

redis database (默认持久化机制) dump.rdb文件
什么时候触发生成文件。
Redis(二)原理_第12张图片
通过配置操作
Redis(二)原理_第13张图片

触发生成dump.rdb文件方式

停机,flushall,多少秒内被修改多少key修改会触发

手动触发生成文件,执行save命令,会阻塞
bgsave,异步,子进程进行操作
可以使用lastsave查看快照生成时间

备份这个文件,防止数据丢失

如果刚好时间间隔之内数据丢失,就会使用aof机制

AOF

append only file

通过配置appendonly yes开启
生成appendonly.aof,里面会保存指令,可以恢复数据
也不是实时写入,多久从缓存写入磁盘?
Redis(二)原理_第14张图片
推荐第二种,每一秒种把缓存种数据写入磁盘
如果文件越来越大,因为存储的hi指令,我们将aof文件中的内容变成可以恢复文件的最小的指令集。
通过命令进行重写
在这里插入图片描述
如果可以忍受一些数据丢失的话,RDB性能要比AOF好

也可以两种方式结合使用

你可能感兴趣的:(redis,redis)