Redis11问
Redis11问
https://blog.csdn.net/qq_31960623/article/details/116427752
1 基本数据类型
- String
- list
- hash
- set
- zset
2 redis为什么块
- 内存操作
- 优化过的数据结构
- 单线程无上下文切换
- 基于非阻塞的IO多路复用
3 redis6.0为什么改为多线程
redis使用多线程并不是放弃单线程 还是单线程模型处理客户端请求 多线程处理数据的读写和协议的解析 执行命令还是单线程;
这样做的目的 redis的瓶颈时在IO而不是CPU 使用多线程提升IO
4 热key解决方案
- 提前将热key打撒到不同的服务器
- 加入二级缓存 走内存查询
5 缓存击穿 穿透 雪崩
-
击穿 单key并发访问过万 过期导致请求DB
- 对key加锁更新
- 异步刷新过期时间
-
穿透 查询不存在的值
- key对应null值
- 布隆过滤器 为0一定不存在; 存在的会误判雪崩
-
雪崩 多key失效 请求到DB
- key不同失效时间
- DB限流
- 二级缓存 同热key
6 redis过期策略
- 惰性删除 key查询对key检测 key过期?删除
- 定期删除 随机取key检查
7 惰性+定期没有删除过期key怎么办?
走到redis内存淘汰机制 已设置过期=定期
- volatile-lru: 定期key中 删除最近最少使用
- volatile-ttl: 定期key中 移除将要过期key
- volatile-random: 定期key中 随机
- allkeys-lru
- allkeys-random
- noeviction: 内存达到阈值 写入报错
8 持久化方式有哪些?区别?
RDB 可以通过 save阻塞 bgsave不阻塞 执行
AOF 调用flushAppendOnlyFile函数决定是否要将aof_buf的内容保存到AOF文件中,可以通过配置appendfsync来决定。
9 实现redis高可用?
方案一: 主从架构 不能故障自动转移
master挂了 需要手动修改配置
方案二: 哨兵架构 故障自动转移 监控 通知功能
master挂了 自动将slave提升为master
10 redis集群原理
redis集群是redis提供的分布式数据存储方案,集群通过数据分片sharding来进行数据的共享,同时提供复制和故障转移的功能。
节点
槽slot
redis通过集群分片的形式来保存数据,整个集群数据库被分为16384个slot,集群中的每个节点可以处理0-16383个slot,当数据库16384个slot都有节点在处理时,集群处于上线状态
当客户端向节点发送命令,如果刚好找到slot属于当前节点,那么节点就执行命令,反之,则会返回一个MOVED命令到客户端指引客户端转向正确的节点。(MOVED过程是自动的)
故障转移
如果节点A向节点B发送ping消息,节点B没有在规定的时间内响应pong,那么节点A会标记节点B为pfail疑似下线状态,同时把B的状态通过消息的形式发送给其他节点,如果超过半数以上的节点都标记B为pfail状态,B就会被标记为fail下线状态,此时将会发生故障转移,优先从复制数据较多的从节点选择一个成为主节点,并且接管下线节点的slot,整个过程和哨兵非常类似,都是基于Raft协议做选举。
11 redis的事务机制
Multi 开启事物 事物未开始前出错 不会执行
Exec 执行事物 执行出线错误不会回滚 继续执行
discard 放弃
watch机制 事物开始前监听key有没有被改变 有改变就放弃事物