1、Redis常用的五种数据类型
- String 字符串
- Hash 哈希
- list 队列
- Set 集合
- ZSert 有序集合
2、Redis如何保证缓存数据与数据库同步
- 设计合理的过期时间
- 进行删操作时同步删除redis缓存数据,改操作同步时修改redis数据
3、Redis如何实现分布式锁
就是利用redis中的setnx的特性如果存在就不存入,不存在就存入并设置超时时间。利用该返回结果作为共享锁。共享锁使用完之后需要del释放。
分布式锁不能解决超时的问题,当程序1的执行超出锁的超时时间,锁就会被释放,等待的线程就会去枪锁,当线程a抢到之后就会上锁,这时程序1执行完了,会 进行释放锁【这时释放的锁不是自己的而是线程a的锁】这便是问题的根本。所以我们往往会使用看门狗进行检测,来解决锁超时时间。
4、Redis内存淘汰策略?
[1]volatile-lru:从已设置过期时间的数据集(server. db[i]. expires)中挑
选最近最少使用的数据淘汰。
[2]volatile-ttl:从已设置过期时间的数据集(server. db[i]. expires)中挑
选将要过期的数据淘汰。
[3]volatile-random:从已设置过期时间的数据集(server. db[i]. expires)中
任意选择数据淘汰。
[4]allkeys-lru:从数据集(server. db[i]. dict)中挑选最近最少使用的数据
淘汰。
[5]allkeys-random:从数据集(server. db[i]. dict)中任意选择数据淘汰。
[6]no-enviction(驱逐):禁止驱逐数据。
5、什么是缓存穿透以及如何解决缓存问题
缓存穿透:查询的数据在数据库中不存在在缓存中也不存在,这时时有人恶意访问这种数据,请求会到达数据库
解决方案:
第一步:在controller层 校验数据,对一些不合法的数据过滤掉
第二步:使用bloom布隆过滤器
第三步:存放一个空对象,并且设置过期时间不能超过5分钟
6、什么是缓存击穿以及如何解决
缓存击穿:数据库中存在,但是缓存中该数据过期了,这时有大量的请求访问该过期的数据。压力给到数据库
解决方案:
1、使用互斥锁
2、设置永不过期
7、什么是缓存雪崩以及如何解决
缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统比如(DB)带来很大压力
解决方案:
1、设置散列的过期时间
2、预热数据
3、搭建redis集群