1、什么是Redis?
Redis 是一个key-value数据结构存储系统,常用作内存数据库
可以做缓存、队列,有16个数据库
单线程,数据存储在内存中
2、Reids数据类型有哪些?
String(字符串)、List(列表)、Set(集合)、Hash(哈希)(value为map类型)、Zset(有序集合)
Geo(地理位置)(底层是Zset)、Hyperloglog(基数统计算法)、BitMap(位存储)(操作二进制用0和1来记录)
3、Redis事务是什么?
Redis事务本质是一组命令的集合。事务不保证原子性,只保证单条命令的原子性
事务中的所有命令都被序列化并一次执行,取消事务所有命令取消
4、Redis监控(Watch)是什么?
使用监控(Watch)实现乐观锁,用以解决共享数据冲突
5、Redis内存达到上限的处理策略有哪些?
(1)volatile-lru:只对设置了过期时间的key进行LRU(默认值)
(2)allkeys-lru : 删除lru算法的key
(3)volatile-random:随机删除即将过期key
(4)allkeys-random:随机删除
(5)volatile-ttl : 删除即将过期的
(6)noeviction : 永不过期,返回错误
6、简述Redis持久化方式
RDB与AOF,默认使用RDB的方式进行持久化
RDB原理:主线程fork一个子线程进行RDB操作,自己继续处理新的请求;
子线程将内存中的内容写入临时的RDB文件中,全部写入完成之后将临时的RDB文件替换之前的RDB文件
AOF原理:主线程fork一个子线程进行AOF操作,自己继续处理新的请求;
子线程将内存中的内容写入临时的AOF文件中,全部写完之后再通知主线程;
这段使时间之内,主线程会将新的命令请求写入到旧的AOF文件中并缓存起来,
当子线程结束之后,主线程将缓存中的命令写入到新的AOF文件中,写入完成之后,主线程将新的AOF文件替换旧的AOF文件
RDB效率高适合大规模数据恢复,但是数据完整性较低,两次RDB间隔内的数据可能丢失;AOF效率较低,但数据完整性更高
7、什么是Redis发布订阅?
Redis发布订阅是一种消息模式,发布者发布消息,订阅者接收消息
发布订阅原理:
客户端前通过sub命令订阅了一个频道之后,Redis-server会维护了一个字典,字典中有许多key-value结构的频道,
每一个频道的value是一个由订阅这个频道的客户端组成的链表,发布者通过publish指定频道的key进行消息发布,
redis-server接收到指定的频道之后找到该频道上的链表,遍历链表上的所有客户端,将消息发布给订阅者
8、什么是Redis主从复制?
将主节点上Redis服务器的数据复制到从节点Redis服务器上,哨兵和集群的基础
主从复制原理:
从节点服务器启动之后,向主节点服务器发送同步请求
主节点接收到请求之后开始启动存盘操作,并且接收所有修改数据的命令,执行完毕之后将数据文件发送给从节点服务器,完成同步
9、什么是Redis哨兵模式?
监控服务器故障,当Redis主服务器发生故障时,投票自动将主库转换成从库
哨兵是一个独立进程,通过发送命令监控服务器运行状态,
当主服务器宕机时,自动转换从服务器为主服务器并且通过发布订阅的方式通知其它从服务器更改配置文件以及切换主机
多哨兵模式:哨兵之间互相监控
单个哨兵发现主服务不可用的情况称为主观下线,多个哨兵发现主服务器不可用就会进行投票,将从服务器转换成主服务器
切换成功之后,各个哨兵通过发布订阅通知它们监控的服务器更改配置文件以及切换主机,称为客观下线
10、简述Redis缓存穿透、缓存击穿、缓存雪崩
缓存穿透:请求查询的key在数据源中不存在,导致直接查询数据库,当很多请求查询这个数据时会造成缓存穿透
解决方案:1、布隆过滤器
在控制层校验,丢弃不符合规格的查询,减小查询压力
2、缓存空对象
请求的数据在数据源中不存在时,返回空对象缓存起来,之后再有请求查询这个数据时,直接从缓存中获取这个空对象
缓存击穿:请求查询的key在数据源中存在,当这个数据在失效的那一瞬间,同时有大量请求过来,击穿缓存直接查询数据库
解决方案:1、设置数据永不过期
2、加互斥锁
使用分布式锁控制控制一个key同时只有一个线程去查询
缓存雪崩:某一时间缓存集中失效或者Redis服务器宕机
解决方案:1、搭建Redis集群
2、数据预热
手动加载缓存中的,将数据提前加载到缓存中,并且设置不同过期时间
3、限流降级
缓存失效后,通过加锁或者队列来控制读写数据的线程数量