复习笔记——redis

1.所谓redis单线程,是在执行客户端命令时,采用单线程执行,无论哪个客户端发送来的命令,都排队单线程执行。而对于其他功能,如日志等,都是另起线程执行。

2.redis尾数是奇数版本是不稳定版本,偶数版本是稳定版本。

3.对于频繁的与redis交互而言,可以使用批量命令模式或pipleline技术对命令进行合并,与redis服务端进行交互,这样避免频繁发送redis命令,占用网络带宽。

4.redis保证原子性操作: lua脚本或事务。redis事务是弱一致性事务,正常执行可以保证原子性。如果有命令出现异常,不会回滚,会继续往下执行。

5.redis订阅发布模式

6.日志: aof和rdb。默认是rdb,rdb是一个压缩二进制日志,分为save同步模式和bgsave异步模式。常用于全量复制,灾难备份等场景。
aof日志记录每次写命令。rdb是快照文件,恢复起来比aof快。但是在重启redis命令时,如果开启了aof日志,优先加载aof日志,没有开启aof日志才加载rdb日志。

aof日志写入文件间隔可以在配置文件里配置,分别为:每条命令写入一次aof文件、每秒写入一次aof文件、由操作系统决定写入aof日志。其中每个命令写入一次aof最安全,但是影响性能。每秒写入一次aof存在丢失1秒钟数据的风险。
rdb日志复制需要经历几分钟的时间。所以,在复制过程中如果宕机,则没有复制的数据会丢失。因此,rdb丢失数据风险更大。

7.集群:
主从复制: 只实现了数据备份,没有实现高可用,主节点挂了之后无法切换从节点为主节点。
哨兵模式: 加入哨兵节点,监测redis主从节点状态,并可以切换主节点
Cluster模式: hash槽位对数据分片,支持主节点切换
相关算法: hash取余、一致性hash算法、hash槽算法

8.分布式锁:利用redis单线程执行客户端命令特性制作分布式锁,使用setnx 命令。
redis锁常见问题:
死锁问题,抢到锁的程序崩了,没有释放锁。
解决方案:设置锁的过期时间。

释放了其他程序的锁: 锁过期了,第一个抢到锁的程序才执行完业务,此时再执行释放锁命令,就释放了其他抢到锁的程序的锁
解决方案: 设置锁的uuid,释放锁时看uuid是否是自己程序的uuid,再释放。
看门狗线程,对快过期的锁做续期操作。

集群主节点挂掉问题:使用redis做分布式锁,不能单独用主从模式,因为主节点挂掉之后,无法进行写操作,就无法抢锁了。在其他集群模式中,如果主节点挂了,而此时锁数据还没同步到从节点中,也会出现问题。这个问题不好解决。

9.redis做缓存存在的问题:

缓存与数据库一致性问题:
当对数据库数据做修改时,如何同步缓存数据:
删除类: 先删除缓存,再更新数据库
先更新数据库,再删除缓存
修改类: 先修改缓存,再修改数据库
先修改数据库,再修改缓存

缓存穿透:查询一个缓存中没有的数据,一直请求数据库,用布隆过滤器

缓存击穿: 某个热点数据失效,大量请求访问到数据库。解决: 看门狗线程,加锁的方式去访问数据库。

缓存雪崩: 缓存key大面积失效, 解决: 设置redis集群,热点key过期时间错峰设置

猜你喜欢

转载自blog.csdn.net/qq1309664161/article/details/127248725
今日推荐