1、项目中用到了Redis的哪些数据类型,底层的数据结构实现?
我在项目主要用类型有String类型,对于经常访问的接口如小程序的首页、登录接口这类访问频率很高的接口用redis存储响应数据能很好的减少数据库查询频次。
-
String(字符串) :这是 Redis 最基本的数据类型,适用于键值对存储、计数器、缓存等场景。
RedisTemplate
提供了丰富的操作方法来处理字符串类型的数据,例如opsForValue()
方法用于简单的 K-V 操作。 -
Hash(哈希表) :用于存储对象信息,适合存储复杂的数据结构。
RedisTemplate
提供了opsForHash()
方法来操作哈希表。 -
List(列表) :类似于 Java 的 List,支持有序集合,可以进行插入、删除等操作。
RedisTemplate
提供了opsForList()
方法来操作列表。 -
Set(集合) :无序且不重复的集合,适合存储不重复的元素。
RedisTemplate
提供了opsForSet()
方法来操作集合。 -
Sorted Set(有序集合) :类似于 Set,但元素可以按分数排序,适合存储排名等有序数据。
RedisTemplate
提供了opsForZSet()
方法来操作有序集合
2、redis的持久化
RDB(Reds DataBase)持久化内存数据到磁盘
redis服务端fork一个子进程,可根据配置文件设置根据时间间隔或修改次数自动触发条件写入磁盘dump.rdb文件也可手动触发。
AOF(Append Only File)持久化修改数据的命令
客户端发起修改命令请求,命令会被追加到AOF缓冲区,当缓冲区达到配置的阈值时将内容写入磁盘。
上述两种方法的优缺点:RDB,存储的是二进制文件,持久化速度快,适合全量备份,但是数据丢失风险高因为只有在触发条件时才会生成快照;AOF,存储redis命令,数据安全性高但是性能开销大,适合增加存储。
所以在redis4.0版本以上出现了混合持久化
在RDB持久化的基础上,同时记录AOF日志。当RDB文件生成时,会将AOF日志重写为RDB格式,从而减少AOF文件的体积。
3、redis的缓存击穿/雪崩/穿透
缓存穿透
当用户发起的请求本身就不存在缓存时,在高并发或攻击的情况下会造成大量请求打到DB
缓存击穿
当缓存过期失效,此时存在高并发的情况,导致大量请求达到DB,造成数据库压力过大
缓存雪崩
大面积的缓存击穿或服务不可用
4、redis的淘汰策略
是内存管理的重要组成部分,当内存达到最大限制时决定哪些数据需要被移除,以便为新数据腾出空间。
从 Redis 4.0 开始,引入了 allkeys-lfu
和 volatile-lfu
策略,这两种策略是基于键的访问频率来决定哪些键应该被优先淘汰。这与传统的 LRU(Least Recently Used)策略不同,LRU 策略是基于最近最少使用的原则。
选择合适的淘汰策略
CONFIG SET maxmemory-policy allkeys-lfu
这会设置 Redis 使用 allkeys-lfu
作为内存淘汰策略。确保在设置之前已经设置了足够的 maxmemory
值,以避免内存不足导致的问题。例如:
CONFIG SET maxmemory 2gb
这样,Redis 将使用 allkeys-lfu
策略来管理内存,根据键的使用频率来决定哪些键应该被淘汰。
-
noeviction(不驱逐)
这是 Redis 默认的淘汰策略。当内存达到最大限制时,Redis 不会删除任何数据,而是拒绝所有写操作(如 SET、LPUSH 等),但仍然允许读取操作。这种策略适用于数据量较小且不允许丢失数据的场景。 -
volatile-lru (Least Recently Used): 仅对设置了过期时间的键进行淘汰,其中最少使用的键会被优先淘汰。
-
allkeys-lru (Least Recently Used): 针对所有键进行淘汰,其中最少使用的键会被优先淘汰。
-
volatile-lfu (Least Frequently Used): 仅对设置了过期时间的键进行淘汰,其中最不常用的键(即使用频率最低的键)会被优先淘汰。
-
allkeys-lfu (Least Frequently Used): 针对所有键进行淘汰,其中最不常用的键(即使用频率最低的键)会被优先淘汰。
-
volatile-random: 随机淘汰设置了过期时间的键。
-
allkeys-random: 随机淘汰所有键。
-
volatile-ttl: 淘汰那些最近过期的键(剩余存活时间 TTL 短的键)。
-
volatile-lru 和 allkeys-lru:适用于希望优先淘汰那些设置了过期时间的键,但又希望基于使用频率进行淘汰的情况。
-
volatile-lfu 和 allkeys-lfu:适用于希望基于键的使用频率进行淘汰的情况,这对于不常访问但偶尔访问的键非常有用。
-
volatile-random 和 allkeys-random:适用于不关心具体哪些键被淘汰,只想要随机选择键进行淘汰的情况。
-
volatile-ttl:适用于希望优先淘汰那些即将过期的键。