Redis11问

Redis11问

https://blog.csdn.net/qq_31960623/article/details/116427752

1 基本数据类型

  • String
  • list
  • hash
  • set
  • zset

2 redis为什么块

  1. 内存操作
  2. 优化过的数据结构
  3. 单线程无上下文切换
  4. 基于非阻塞的IO多路复用

3 redis6.0为什么改为多线程

redis使用多线程并不是放弃单线程 还是单线程模型处理客户端请求 多线程处理数据的读写和协议的解析 执行命令还是单线程;

这样做的目的 redis的瓶颈时在IO而不是CPU 使用多线程提升IO

4 热key解决方案

  1. 提前将热key打撒到不同的服务器
  2. 加入二级缓存 走内存查询

5 缓存击穿 穿透 雪崩

  1. 击穿 单key并发访问过万 过期导致请求DB

    • 对key加锁更新
    • 异步刷新过期时间
  2. 穿透 查询不存在的值

    • key对应null值
    • 布隆过滤器 为0一定不存在; 存在的会误判雪崩
  3. 雪崩 多key失效 请求到DB

    • key不同失效时间
    • DB限流
    • 二级缓存 同热key

6 redis过期策略

  1. 惰性删除 key查询对key检测 key过期?删除
  2. 定期删除 随机取key检查

7 惰性+定期没有删除过期key怎么办?

走到redis内存淘汰机制 已设置过期=定期

  1. volatile-lru: 定期key中 删除最近最少使用
  2. volatile-ttl: 定期key中 移除将要过期key
  3. volatile-random: 定期key中 随机
  4. allkeys-lru
  5. allkeys-random
  6. 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有没有被改变 有改变就放弃事物

原文地址:https://www.cnblogs.com/albertXe/p/14947898.html