Redis的读书笔记

我看的资料是同学给的,
https://github.com/Snailclimb/JavaGuide/blob/master/docs/database/Redis/redis-all.md#1-%E7%AE%80%E5%8D%95%E4%BB%8B%E7%BB%8D%E4%B8%80%E4%B8%8B-redis-%E5%91%97

有的地方看不懂,对其中的疑问做一下记录。

什么是AOF重写

参考博客
https://blog.csdn.net/hezhiqiang1314/article/details/69396887

AOF重写的原因
  • AOF 持久化是通过保存被执行的写命令来记录数据库状态的,所以AOF文件的大小随着时间的流逝一定会越来越大;影响包括但不限于:对于Redis服务器,计算机的存储压力;AOF还原出数据库状态的时间增加;
  • 为了解决AOF文件体积膨胀的问题,Redis提供了AOF重写功能:Redis服务器可以创建一个新的AOF文件来替代现有的AOF文件,新旧两个文件所保存的数据库状态是相同的,但是新的AOF文件不会包含任何浪费空间的冗余命令,通常体积会较旧AOF文件小很多。
AOF重写的实现
  • AOF重写并不需要对原有AOF文件进行任何的读取,写入,分析等操作,这个功能是通过读取服务器当前的数据库状态来实现的。

假设服务器对键list执行了以下命令s;

127.0.0.1:6379> RPUSH list "A" "B"
(integer) 2
127.0.0.1:6379> RPUSH list "C"
(integer) 3
127.0.0.1:6379> RPUSH list "D" "E"
(integer) 5
127.0.0.1:6379> LPOP list
"A"
127.0.0.1:6379> LPOP list
"B"
127.0.0.1:6379> RPUSH list "F" "G"
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "C"
2) "D"
3) "E"
4) "F"
5) "G"
127.0.0.1:6379>
  • 当前列表键list在数据库中的值就为[“C”, “D”, “E”, “F”, “G”]。要使用尽量少的命令来记录list键的状态,最简单的方式不是去读取和分析现有AOF文件的内容,,而是直接读取list键在数据库中的当前值,然后用一条RPUSH list “C” “D” “E” “F” "G"代替前面的6条命令。
Redis线程模型的描述

https://blog.csdn.net/qq_34337272/article/details/80012284
redis 内部使用文件事件处理器 file event handler,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。

文件事件处理器的结构包含 4 个部分:

多个 socket
IO 多路复用程序
文件事件分派器
事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)
多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。

Redis事务的watch

watch命令可以监控一个或多个键,一旦有一个键被修改,之后的事务不会执行。执行EXEC命令后会取消对所有键的监控,如果不想执行事务中的命令也可以使用UNWATCH命令来取消所有键的监控。

为什么Redis不支持事务回滚

(1)大多数事务失败是因为语法错误或者运行错误,这两种错误,在开发阶段都是可以预见的。
2.如果在一个事务中的命令出现语法错误,那么所有的命令都不会执行;
3.如果在一个事务命令出现运行错误,那么只有正确的命令会被执行
(2)Redis 为了性能方面就忽略了事务回滚。

Redis集群方案

https://segmentfault.com/a/1190000022028642 讲得非常好

总结

Redis集群方案有三种模式. 其中主从复制模式能实现读写分离,但是不能自动转移故障,master或clave宕机都可能导致客户端请求失败。哨兵基于主从复制模式,能够自动故障转移,达到高可用,但是与主从复制模式一样,不能在线扩容,容量收到单机的配置。cluster模式是无中心化架构,实现了分布式存储,方便扩展,高可用,但是对批量操作和事务操作支持性不好。

什么是跳表

Redis只在两个地方用了跳表,一个是有序集合sorted set,另一个是在集群节点中用作内部数据结构。

为什么不用红黑树而使用跳表
  1. 做范围查找的时候,红黑树需要中序遍历,比skiplist要麻烦。
  2. 平衡树的插入和删除操作都会引发子树的调整,逻辑复杂。skiplist只需要修改相邻节点的指针。
  3. 内存占用来说,skip比平衡树更灵活。平衡树的每个节点包含2个指针,而skiplist的包含1/(1-p), 在redis中,取p为1/4,那么一个节点就包含4/3个指针。
Redis的数据结构和使用场景

https://juejin.im/post/6844903951502934030

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值