Redis知识点记录

一、Redis都有哪些使用场景?

  1. Redis是基于内存的nosql数据库,可以通过新建线程的形式进行持久化,不影响Redis单线程的读写操作
  2. 通过list取最新的N条数据
  3. 模拟类似于token这种需要设置过期时间的场景
  4. 发布订阅消息系统
  5. 定时器、计数器

二、Redis支持的数据类型有哪些?

字符串、hash、List、Set、ZSet

(redis取list集合命令,lrang  key  startIndex(下标)  endIndex(下标))

三、Redis持久化有几种方式?

redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。

RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;

AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。

其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。

如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。

四、Redis的内存淘汰策略是指?

当redis的使用率已经达到了Maxmemory 的上限的时候,就会触发内存释放的一个行为。

四种淘汰算法

1. 随机移除某个key(random算法)

2. TTL算法 在设置了过期时间的key里,找到更早过期的key移除

3. LRU算法,表示最近很少使用,也可以理解成最久没有使用

4. LFU算法 和LRU算法类似(redis4新增加),LFU增加了访问频率这个判断纬度

一共有8种,分别针对过期字典和所有数据。

volatile-lru:针对设置了过期时间的key,使用lru算法进行淘汰。
allkeys-lru:针对所有key使用lru算法进行淘汰。
volatile-lfu:针对设置了过期时间的key,使用lfu算法进行淘汰。
allkeys-lfu:针对所有key使用lfu算法进行淘汰。

volatile-random:从所有设置了过期时间的key中使用随机淘汰的方式进行淘汰。
allkeys-random:针对所有的key使用随机淘汰机制进行淘汰。
volatile-ttl:针对设置了过期时间的key,越早过期的越先被淘汰。
noeviction:不会淘汰任何数据,当使用的内存空间超过 maxmemory 值时,再有写请求来时返回错误。

总结:针对设置过期时间key、所有key,分别采用lru、lfu、随机移除,一共6种;

        针对设置过期时间key使用ttl;不会淘汰任何数据。

五、Redis的过期策略有哪些?

定时删除,定期删除,惰性删除

定时删除

在设置键的时候同时设置过期时间,当key过期了,定时器马上删除该key。

惰性删除

key过期后依旧在内存中不做处理,当请求操作对应的key时,检查是否过期,如果过期则删除该key.没有正常返回该key。

定期删除

Redis每隔1秒随机抽取expires字典中的20个key进行检查,过期则删除,如果过期的key占总数的1/4.则重复该操作。

默认采用的是定时+惰性删除策略。

六、缓存的三大问题以及解决方案

缓存穿透,缓存击穿,缓存雪崩。

缓冲穿透:缓存穿透是指对应的key,在缓存和数据库中都没有数据,而不断有请求访问该资源,一直查询数据库,从而导致数据库压力变大或挂掉

解决方法:

缓存空值
参数校验
布隆过滤器
缓存击穿:缓存击穿是指热点数据过期之后,大量并发请求访问热点数据,因为缓存过期了,所有并发请求都落到数据库中,从而导致数据库压力变大或挂掉

解决方法:

多层次缓存
热点数据用户过期
加锁、熔断降级
缓存雪崩:同一时间大量的key过期,出现了大量请求去访问数据库,造成系统的宕机

解决方法:

key增加过期随机性
熔断降级
多层次缓存

七、如何保证redis和数据库数据的一致性?

1、淘汰缓存

数据如果为较为复杂的数据时,进行缓存的更新操作就会变得异常复杂,因此一般推荐选择淘汰缓存,而不是更新缓存。

2、选择先淘汰缓存,再更新数据库

假如先更新数据库,再淘汰缓存,如果淘汰缓存失败,那么后面的请求都会得到脏数据,直至缓存过期。

假如先淘汰缓存再更新数据库,如果更新数据库失败,只会产生一次缓存穿透,相比较而言,后者对业务则没有本质上的影响。

3、延时双删策略

如下场景:同时有一个请求A进行更新操作,另一个请求B进行查询操作。

请求A进行写操作,删除缓存
请求B查询发现缓存不存在
请求B去数据库查询得到旧值
请求B将旧值写入缓存
请求A将新值写入数据库
 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值