一,redis是单线程还是多线程
1、Redis5及之前是单线程版本
2、Redis6开始引入多线程版本(实际上是 单线程+多线程 版本)
Redis5及之前的版本使用的是 单线程,只有一个 worker队列,读写操作都要在这一个队列进行操作,好处是线程安全。缺点:读写占用大部分cpu时间。
Redis6引入了多线程机制,有 “一个 worker线程+多个IO子线程”,在 IO 就绪之后使用多线程读写解析数据,单线程操作内存数据,单线程+多线程机制,提高了cpu使用效率。
请求是多线程的,内存读写操作仍然是单线程。
二,redis存在线程安全问题吗
从Redis 服务端层面,redis单线程执行操作命令,线程安全。
从Redis客户端层面,有多个客户端同时执行多个指令的情况,无法保证原子性。
三,遇到过缓存穿透吗?
缓存穿透就是缓存和数据库中都没有的数据,短时间大量请求全到数据库上造成数据库压力。
解决:接口层增加校验,用户鉴权校验,短时间大量请求直接拦截。
四, 遇到过缓存击穿吗?
缓存击穿是指缓存中没有数据库中有的数据,大量请求直接查数据库。
解决:热点数据设置更长的过期时间。
五,如何避免缓存雪崩
缓存雪崩是指 缓存同一时间大面积失效,数据库压力增大。
解决:过期时间设置随机,避免同一时间大量失效
加锁排队
六,缓存预热
系统上线后,将相关的缓存数据直接加载到缓存系统。
方式:定时刷新缓存
七,数据库与缓存不一致如何解决
1,读写串行化,但吞吐量大幅降低
2,更新完数据库后删除缓存
八,redis持久化方式
RDB(默认):redis缩写快照
AOF:记录以 redis 命令请求
AOF比RDB更安全
RDB性能更好
AOF比RDB更新频率高
九,redis 单线程主要是指redis在网络io和键值对读写采用一个线程来完成,redis的单线主要是指redis在网络io和键值对读写采用一个线程来完成
对于其他redis功能来说比如持久化,集群同步数据等都是由其他额外线程执行的
单线程优势:
减少线程切换的资源消耗
由于一个线程,所以数据是安全的,避免多线程的线程安全问题
劣势:
不能发挥cpu多核优势
删除大键导致线程阻塞
4.0和6.0出现多线程机制
6.0多线程io模型需要手动开启
线程数要小于机器核数 io-threads: 6
缓存穿透 缓存击穿 缓存雪崩 缓存预热
穿透击穿预热雪崩