Redis主要数据类型有哪些?雪崩、击穿、穿透?
1、数据类型
-
String:⽤于缓存、计数器、分布式锁等场景。
-
Hash:⽤于存储对象,例如⽤户信息、商品信息等。
-
List:可以进⾏队列和栈的操作常⽤于消息队列、任务队列等场景。
-
Set:可以进⾏集合运算,例如并集、交集、差集等操作常⽤于标签、好友列表等场景
-
ZSet:可以按照分数排序,也可以进⾏范围查询。常⽤于排⾏榜、计分系统等场景。
2、缓存问题
- 缓存穿透:当⼀个查询的数据在缓存中不存在,但在数据库中也不存在时,这个查询会穿透到数据库,导致数据库负载过⾼ 解决⽅法使⽤布隆过滤器,将不存在于数据库的数据进⾏过滤;对于查询结果为空的 key,设置空值缓存,有效时间设置短⼀些。
- 缓存击穿:当⼀个热点数据过期时,⼤量的请求会同时访问数据库,导致数据库负载过⾼。解决⽅法有:设置热点数据永不过期,定期更新缓存。
- 缓存雪崩:当⼤量的缓存数据同时过期时,⼤量的请求会同时访问数据库,导致数据库负载过⾼ 解决⽅法:给缓存的key设置随机过期时间,防⽌⼤量的缓存数据同时过期。
Redis key过期策略?内存淘汰机制?
1、过期策略
基于惰性删除的策略:当访问⼀个已经过期的key时,Redis会⽴即将它删除。
基于定期删除的策略:Redis会定期地检查所有key是否过期,将过期的key删除。
基于内存淘汰的策略:当Redis的内存达到⼀定限制时,Redis会通过⼀些算法,将⼀些冷⻔的、不常使⽤的key删除,腾出空间。
2、简单记忆
-
最近最少使⽤(LRU)算法:淘汰最近最少使⽤的key。
-
最不经常使⽤(LFU)算法:淘汰最近使⽤次数最少的key。
-
随机淘汰算法:随机选择⼀个key进⾏淘汰。
-
根据ttl:⽣存时间
-
默认是不进⾏淘汰,直接返回异常
Redis持久化策略?RDB与AOF区别?底层原理?
- RDB: 是⼀种快照式持久化⽅式,当触发某些特定的事件时,Redis会将内存中的数据保存到磁盘上⼀个指定的⽂件中,⽂件后缀⼀般为rdb 。RDB持久化的优点是备份⽂件⼩、加载速度快,适合⽤于⼤规模数据恢复。缺点是数据可能会丢失,因为数据并不是实时保存的。
- AOF: 则是将所有写操作追加到⼀个⽇志⽂件中,即追加式持久化⽅式。在AOF模式下,每个写操作都会以⽂本的形式记录在⼀个追加⽂件中,从⽽记录了所有数据的历史操作 OF持久化的优点是数据不会丢失,因为每个写操作都会记录在追加⽂件中,可以避免因为某个事件没有触发⽽导致数据丢失。缺点是备份⽂件⼤、加载速度相对RDB慢,适合⽤于⼩规模数据恢复。
如何实现分布式锁?
- 基于 Redis 实现分布式锁:Redis 的 SETNX 命令可以⽤来实现分布式锁。当需要获得锁时,调⽤ SETNX 命令尝试将⼀个字符串作为 key 插⼊到 Redis 中,如果插⼊成功则表示获得了锁,否则表示锁已被其他线程占⽤。释放锁时,删除该 key 即可。为避免死锁,需要为锁设置⼀个过期时间。
- 使⽤ Redisson 实现分布式锁:Redisson 是⼀个基于 Redis 的分布式 Java 对象框架,提供了分布式锁的实现。通过 Redisson 的 getLock ⽅法可以获得⼀个锁对象,调⽤锁对象的lock 和 unlock ⽅法即可获得和释放锁。Redisson ⽀持多种锁模式,包括可重⼊锁、公平锁、联锁等。