Redis常见问题总结

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过期时间不同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值