1、为什么要使用缓存?
主要从高性能和高并发来看待问题,正常我们存取数据是在磁盘中进行的,每次存取意味着一次I/O,而I/O操作是比较慢的。如果把数据缓存到内存中,查询的效率就会大大提高。
而且直接操作缓存的并发数是远远大于操作数据库的。
2、什么是Redis?为什么选择使用Redis,Redis有什么好处?
Redis是一款基于内存的key-value数据库,它的查询效率非常高,读可以达到每秒10万次,写可以达到8万次左右。
Redis还支持丰富的数据结构:String、list、set、ZSet、hash,单个value可以存储1G数据
Redis还可以对存入的key-value设置过期时间
3、Redis常见的数据结构,和使用场景
String:简单的key-value类型,可以用来常规计数如粉丝数等。特殊功能命令:setnx只有key不存在时才存储、setex设置过期时间
hash:适合用来存储对象,用于存储商品信息、用户信息等
list:list可以用来存储多个可重复的列表数据,比如粉丝列表之类的。lpush+rpop还可以组成队列,用来做延时队列。lpush+lpop可以作为栈
set:set可以存储多个数据,数据不可重复,可以用来去重,统计交集sinter,用来进行垃圾图片的处理、共同粉丝的计算。特殊功能的命令:sunion并集、sdiff差集、sinter交集
ZSet:比set增加了一个score,可以进行排序,用来做排名、时间序列。
4、说一下Redis的删除策略和淘汰策略
①定时删除 在设置key过期时间(setex)的同时,设置一个定时器,在key过期时直接删除。缺点是占用CPU会比较多
②惰性删除 设置key过期时间之后不去管他,当使用key的时候检查key是否过期。对CPU非常友好,缺点是无法删除某些不使用的过期键
③定期删除 对key进行定期抽检,删除过期的key。是比较折中的办法,缺点是比较难确定执行的频率,并且有脏数据的风险,可能会查 到一些没有及时删除的过期key。
Redis中采用定期删除+惰性删除,检查时间定为每秒10次。
淘汰策略:即使有了删除策略,也有可能数据量过多,内存都被占满了。这时Redis就可以按照一定的规则将数据从内存中删除掉,常见的淘汰策略有
noeviction(默认) 不删除任何数据,内存不足则报错
volatile-lru 设置了过期时间的key,淘汰最久没使用的数据(least recently used)
volatile-lfu 设置了过期时间的key,淘汰最近使用频率较低的key(least frequently used)
volatile-ttl 淘汰即将过期的key
volatile-random 随机淘汰
allkeys-lru 所有key,淘汰最久没使用的key
allkeys-lfu 所有key,淘汰最近使用频率较低的key
allkeys-random 随机淘汰
5、什么是穿透、击穿、雪崩?怎么解决
穿透就是访问了一个数据库中没有的key,由于数据库中没有,在Redis中也就没有缓存,每次请求都会会直接查询数据库。这样就有被攻击的风险,解决的办法可以在查询数据库之后往Redis中存入一个null值。
但是这样做也有坏处,就是如果一旦缓存的null值没有失效,而时间数据库已经更新了该key,就会导致查询到脏数据。于是我们可以借助布隆过滤器来进行拦截。
击穿就是在一个热点数据刚好失效时,大量的请求直接访问到了数据库,造成数据库的压力剧增。解决的方法,可以设置热点数据永不过期。
雪崩就是大量的热点数据,设置了相同的过期时间,在同一时刻失效,导致大量请求访问到数据库,可能会导致数据库宕机。解决的方法,可以对过期时间设置一个随机值。
6、常见的缓存同步方案有哪些
同步方案:直接修改增删改的业务代码,在数据库操作完毕直接同步操作缓存
异步方案:借助MQ进行发送异步消息,消费者从MQ中取出数据同步缓存
canal方案:使用阿里旗下的canal组件实现数据同步,它的实现原理是将自己伪装成一个mysql的从节点,从mysql中读取binlog数据。我们通过部署canal服务,从canal中获取数据更新缓存即可,不需要改动源代码。
7、Redis数据持久化方案有哪些?
RDB Redis Database Backup file 它是数据备份文件,这种持久化方式是采用了内存快照的机制,对整个内存进行备份。备份的时机,可以手动保存,也可以在规定的时间内修改了一定量的数据后进行触发,或者是在服务正常关闭前,也会进行保存。它的好处就是数据的恢复速度快,文件的体积相对较小;缺点是不能保证数据的完整性,两次备份之间可能会有数据丢失的风险。对系统资源的占用会比较高,备份的时候会阻塞线程,影响性能。它的使用场景就是可以容忍几分钟的数据丢失,追求更快的启动速度的情况。
AOF Append Only File 追加文件,这种持久化文件实际上是记录了Redis每次写(增删改)操作的日志。刷盘的时机默认是每秒钟进行记录,也可以配置在每次操作之后进行记录。它的好处是数据完整性好,默认情况也最多丢失1s的数据,因此数据恢复的优先级高;缺点是宕机的恢复速度比较慢,需要重新执行一遍命令,重写时对CPU和内存的占用比较高,有可能会记录一些无用的命令导致文件的体积很大,需要进行bgrewriteaof重写;应用场景是数据完整性要求比较高的情况。
8、Redis有哪些集群方案?
1、主从+哨兵:解决读写隔离、单点故障、高可用问题
2、分片集群:解决以上问题+海量数据问题
9、说一说Redis哈希槽的概念?
说到分片集群,就必须提到哈希槽的概念,Redis为分片集群提供了16384个散列的哈希槽。这些槽会均分给所有的master,通过对key的hash计算并对16384取余,可以决定key在哈希槽中的位置,这样也可以定向key在那个库中。
10、SpringBoot整合Redis的步骤:
①、在pom.xml中引入依赖,spring-boot-starter-data-redis
②、在application.yml中添加Redis相关配置,如:访问IP和端口、密码、操作数据库、连接池配置
③、注入RedisTemplate对象,调用方法