Redis
为什么需要缓存,缓存的意义和底层原理是什么
降低延迟:缓存将高频访问的数据存储在内存中,避免每次请求都访问磁盘或数据库,响应速度可提升数百倍 。
减轻数据库压力:通过缓存热点数据,减少数据库的读写次数,尤其在高并发场景下效果显著 。
为什么要用Redis缓存
基于内存读取:Redis的数据是存放在内存中的减少了磁盘的IO,在数据获取时是非常快的,单机轻松10w+
支持多种数据类型:String 、List、Set、Zset、Hash
支持高可用:主从复制、集群、数据持久化。
如何理解Redis的单线程与Redis的多线程
redis6.0之前是单线程的6.0之后是多线程的,单线程可节省CUP上下文切换的时间,同时避免各自加锁的逻辑。
版本区分:redis6.0之前是单线程,6.0之后是多线程执行。
主线程:主线程主要是进行数据的读写和网络I/O。
辅助线程:进行磁盘IO(RDB/AOP)和过期策略、淘汰策略。
性能提升:经过大牛测试多线程比单线程性能提升了1倍。
redis的数据类型有那些,底层是如何实现的
redis的数据类型都要两种数据结构实现,String是有三种编码方式,主要是根据数据类型和数据量区分使用不同的数据类型。
String:
底层是动态字符串结果 SDS(Simple Dynamic String),包含长度、空闲空间、字节数组三部分组成,根据数据类型和字节长度区分使用不同的编码方式:
int:存储整数值。
embStr:存储长度 ≤44 字节的字符串。
raw:存储长度 >44 字节的字符串
场景:缓存、计数器、锁、用户唯一信息、订单编号。
Hash:
ziplist:存储字段少(≤512 个)且值小(≤64 字节)的哈希表。
hashtable:字段或值超过阈值时使用,支持高效查询。
场景:用户不同的属性、活动不同的属性、用户明下不同状态的优惠券
List:
ziplist:元素少(≤512 个)且为数值时使用
quicklist:结合双向链表和 ziplist,解决大数据量时的增删性能问题
场景:走马灯,90天的拨打记录
Set:
intset:元素少(≤512 个)且为数值时使用
hashtable:元素非数组或元素多时使用
场景:支持交集、并集
Zset:
跳表(Skip List):保证元素有序性,支持快速范围查询
hashtable:存储元素到分数的映射,实现 O(1) 复杂度查询
场景:排行榜、3D福彩近一年开奖记录
讲一讲Redis的高级数据类型与运用场景
Bitmaps、布隆过滤器、HyperLogLog(做UV统计)、GEO(地理信息)
Redis事务
redis事务保证事务中的命令会全部执行,但单条命令失败不会触发回滚,后续命令仍继续执行,Redis事务只是保证事务中的操作顺序不会被其余操作影响。例子操作A、B、C在redis中执行如果B失败了,A不会回滚,C也会继续执行。
开启事务:可以使用mu开启事务,redi事务保证操作顺序时钟。
命令入队:客户端输入的命令按顺序存入队列,服务器返回QUEUED状态。
事务执行:通过EXEC命令触发队列中所有命令的依次执行。
事务取消:通过DISCARD命令取消事务,情况队列。
Redis的过期策略
惰性过期:当访问某个key时会先判断是否过期,如果没有过期则返回对应的值,如果过期了则删除key和对应数据,返回null,惰性过期减少CPU的占用,但是堆内存不友好。
定时过期:Redis默认每秒10次(可通过hz参数控制)扫描设置了过期时间的key,每次扫描20个,删除其中已经过期的key,如果过期的key超过25%则继续执行扫描删除,这里用的贪心算法。定时过期堆内存友好,但是对CPU不优化
使用方式:实际情况下是惰性过期和定时过期同时使用的,定时过期随机抽样进行删除过期的key,但是会有遗漏,惰性过期作为补充。
Redis的淘汰策略

全局淘汰:
淘汰最近最少使用(allkeys-lru): 移除最近最少使用(Least Recently Used)的键。这是最常用的策略,对业务影响较小
淘汰最近访问次数最少(allkeys-lfu):移除访问频率最低(Least Frequently Used)的键
随机淘汰(allkeys-random): 随机移除一些键
过期淘汰:
带有过期时间的淘汰最近最少使用(volatile-lru): 移除最近最少使用的过期键。
带有过期时间的随机淘汰(volatile-random): 随机移除一个过期键
优先移除剩余生存时间最短(volatile-ttl ):
不淘汰(noeviction):默认策略,当内存不足的时候响应OOM,但是运行读操作。
Redis淘汰策略的触发机制
redis的淘汰策略的触发机制主要是通过内存监控和策略执行,Redis默认会每秒10次检查内存是否达到了Maxmomery阈值,如果达到了则按照淘汰策略执行,若未设置maxmemory(默认值为0),则不会触发淘汰策略。
Redis有了过期策略为什么还要有淘汰策略呢

过期策略是主动预防性清理,淘汰策略是被动应急性兜底,二者针对的机制不同,过期策略是针对设置过期时间的数据,淘汰策略是内存不足时进行触发,二者是互补而非替代关系。
Redis主从机制下过期策略和淘汰策略是如何执行的
主节点维护所有键的过期时间,当键过期时,主节点会生成一个DEL命令并将其传播到所有从节点,从节点执行删除操作。
主节点维护淘汰策略,当淘汰了某些key后会向从节点发送DEL命令将其传播到所有从节点,从节点执行删除操作。
Redis的持久化方式
定期全量备份(RDB):
默认的持久化方式,在指定的时间间隔以快照的方式保存内存中全量的数据并生成二进制文件.rdb,这样的文件数据结构紧凑,数据量相对较少出现问题时可以快速恢复,时间间隔可通过配置文件配置。
实时增量日志(AOF):
需要手动开启,以日志的形式持久化指定时间间隔内的数据写操作,并将每次的日志追加进.aof文件中,文件体积大,恢复数据慢,但是可以减少数据丢失,时间间隔可通过配置文件配置。
实际场景:
实际场景中是混合使用,Redis 优先使用 AOF 文件恢复数据(若 AOF 文件损坏,则回退到 RDB 文件)。

浙公网安备 33010602011771号