redis是单线程还是多线程?
redis是单线程的,但在6.0后,支持了多线程,但命令还是以单线程为主
redis为什么比较快
1. 用C语言编写
2. 数据都在内存中,单线程操作,没有涉及到cpu上下文切换等问题,所以效率较高
各数据类型的使用场景
String :
- 分布式锁 (setnx)
- 计数器
- 对象存储(json)
list:
- 消息排队
- 消息队列
- 栈
set:
- 数据去重
- 共同关注(sinter 交集)
hash:
- 用户信息(session)
- 更适合存储对象
zset:
- 排序数据
- 权重判断
- 排行榜
geo(地理位置):
- 计算坐标
- 附件的人
Hyperloglog(基数统计):
- 网站的UV
bitmaps(位图,操作二进制来进行记录):
- 打卡
- 签到
redis事物常见问题
- redis的单条命令是原子性的,但事物不保证原子性,没有隔离级别的概念
- 当命令有错时,redis事务中的命令都不执行;(编译型异常);事务队列存在语法性错误,其他命令正常执行,错误命令抛出问题(运行时异常)
- watch监听的机制
1. 当监听的key执行事务时,没有被其他线程改动,则事务执行成功。
2. 当监听的key在执行事务时,被其他线程改动过,则事务执行失败。
3. 如果事务执行失败,先unwatch解锁,再watch加锁,再执行事务
-
整合SpringBoot
在SpringBoot 2.x之后,redis模板由原来的jedis,变为了lettuce
区别
- jedis:采用的直连方式,多线线程操作,是不安全的;要避免不安全的情况,需要使用连接池,开销大(类似与BIO)
- lettuce:采用netty,实例可以在多个线程中进行共享(NIO)
持久化
RDB(默认开启)
保存文件是:dump.rdb(默认)
触发机制:
1. 配置文件中save条件满足时,会自动触发
2. 执行flushall命令
3. 退出redis
如何恢复数据:只需要将rdb文件放到redis启动目录即可(配置文件中可配置)
优点:
1. 适合大规模的数据恢复
2. 适用于对数据完整性要求不高的地方
3. 二进制文件,容量小,便于传输。
原理: 父进程单独fork一条子进程出来,将内存文件写入临时的rdb文件,快照写入完成后,替换掉正式的rdb文件。
AOF
保存文件是:appendonly.aof(配置文件可修改)
触发机制:
1 always
2 eversec
3 no
如何恢复数据:aof文件是一个文本文件,保存的是每一个写操作,所以在数据恢复时,是将文件中的命令全部执行一遍
优点:
1. 数据完整性好
缺点:文本文件,比较大;将命令全部执行一遍,效率较低
原理:以日志的形式来记录每一个写操作,只许追加文件,不能改写文件。在redis启动时,把所以文件中的命令执行一遍。
注意:aof文件若有损坏或错误,redis将启动失败。
修复:redis提供了一个工具,redis-check-aof,可以修复aof文件。
主从复制
数据复制都是单向的,只能由主节点到从节点。
主节点负责写操作,从节点负责读操作。
默认情况下,每个redis节点都是主节点,在配置主从节点时,只用配置从节点即可。
info replication 查看当前节点信息
slaveof ip port 主从配置(在从机里配置 是命令配置,临时的)
配置文件中,replicaof 处修改,是永久配置
主机可以写,从机不能写,只能读。主机中所有的信息和数据都会被从机保存。
在没有哨兵的情况下,主机断开连接,从机依然是连接到主机的,可以读,但没有写操作;若主机恢复连接,主从功能仍然能够正常运行。
若只用命令行配置从机,从机断开连接,重连回来后,又恢复到了默认情况,不能拿到主机数据;若将其再次配置为从机,则立马可以从主机拿回所有数据。
两种复制策略:
全量复制(第一次连接时)
增量复制 (后续操作)
哨兵模式
自动选举master的模式
哨兵:以独立的进程监控redis节点是否正常运行
原理:
当哨兵发现主节点挂掉之后,会自以为主节点不可用,当后续其他哨兵也发现主节点不可用,且达到一定数量时,会发起投票机制,选出新的主节点。
优点: 哨兵集群,基于主从复制模式,使其从手动到自动,更加健壮;主从可以自动切换,可用性比较好。
缓存穿透
缓存中没有,数据库也没有;导致DB压力比较大
解决方案:布隆过滤器;缓存空对象
缓存击穿
热点数据,key过期;导致大量请求访问DB,DB承受不住。
解决方案:不设置过期时间;加分布式锁,保证只有一个线程访问。
缓存雪崩
redis中的key大量集体失效,或redis宕机,DB承受不住。
解决方案:
- 限流降级,停掉一些服务,保证可用
- 搭建reids集群,保证高可用 (异地多活)
- 数据预热,设置key过期时间不同