一、Redis是什么?
redis是使用c语言编写的一个高速缓存数据,是以key-value的形式存储数据,而且其支持的数据类型丰富。
二、Redis有哪些使用场景
(1)热点数据的缓存
(2)计时器
(3)排行榜
(4)实现分布式锁
(5)使用session的共存,相同数据
三、Redis支持的数据类型有哪些?
(1)String(字符串)
(2)Hash (哈希)
(3)List (列表)
(4)Set (集合)
(5)Zset (有序集合)
四、Redis为什么是单线程?
Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,就顺理成章地采用单线程的模式了。
五、Redis真的是单线程吗?
redis并不是真的单线程,在其RDB持久化的方式中,bgsave命令就会创建一个子线程。
六、Redis持久化方式有哪些?
(1)RDB
Rdb时Redis默认的持久化方式。按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件。即Snapshot快照存储,对应产生的我数据文件为dump.rdb,通过配置文件的save参数来定义快照的周期。(快照可以是其表示数据的一个副本,也可以是数据的一个复制品)
(2)AOF
Redis会将每一个收到的写命令通过write函数追加到文件最后,类似于mysql的binlog。当redis重启时通过重新执行文件中保存的写命令在内存中重建整个数据的内容。当两种方式同时开启时,数据恢复redis会优先选择aof恢复。
七、什么是缓存穿透?怎么解决?
缓存穿透时在查询数据时,数据库中不存在该数据,缓存中也不存在该数据。这时可能会受到恶意攻击的可能,大量请求会访问数据库,从而出现数据库压力过大。
情景:
(1)id不合法 (2)数据库确实不存在该数据
解决方式:
(1)在控制层进行校验
(2)可以使用布隆过滤器
(3)可以在缓存中存入一个空对象,但要注意该对象的过期时间不要太长,一般不超过5分钟。
八、如何保证缓存和数据库数据一致性?
(1)设置合理的过期时间
(2)当执行增删改时删除缓存数据
九、什么是缓存雪崩?怎么解决?
缓存雪崩是在某一时刻出现大量数据过期,而此时又有大量的请求访问这些数据。
情景:
(1)新项目刚上线时
(2)redis服务器宕机
(3) 缓存数据真实过期
解决方式:
(1)项目上线前进行数据预热
(2)集群
(3) 设置过期时间时分散设置
十、Redis怎么实现分布式锁?
使用redis中的setnx命令---->占锁,当业务代码执行完毕后释放锁资源,释放锁命令是del。
十一、Redis在分布式锁时有什么缺陷
超时问题:业务代码执行时间超过锁时间,使用watchDog机制,使用第三方组件redisson。
十二、Redis淘汰策略有哪些?
(1)volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据进行淘汰。
(2)volatitle-ttl: 从已设置过期时间的数据集中挑选将要过期的数据进行淘汰。
(3)volatile-random:从已设置过期时间的数据集中任意选择数据进行淘汰。
(4)allkeys-lru:从数据集中挑选最近最少使用的数据进行淘汰。
(5)allkeys-random:从数据集中任意选择数据进行淘汰。
(6)no-enviction:禁止数据淘汰,新写入操作时会报错。