Redis设计与实现:读书笔记之二
1.数据库
- Redis服务器一般包含多个db,默认16个。
- 切换数据库
每个redis客户端都有自己的目标数据库,默认为0,可以通过select 1,切换数据库。
- 设置键的生存周期和过期时间
PTTL key
获取key的有效毫秒数
TTL key
获取key的有效时间(单位:秒)
PERSIST key
移除key的过期时间
EXPIREAT key timestamp
设置一个UNIX时间戳的过期时间
PEXPIRE key milliseconds
设置一个key的过期的毫秒数
PEXPIREAT key milliseconds-timestamp
设置一个带毫秒的UNIX时间戳的过期时间
- 过期键的删除策略
- 定时删除:设置键的过期时间时,自动创建timer,让定时器自动立即删除。
- 惰性删除:在获取键值时,判断是否过期,如果过期,则删除。
- 定期删除:每隔一段时间对数据库做一次检测,删除过期键值
- Redis的删除策略:惰性删除+定期删除
2.RDB持久化
RDB持久化是对数据库状态磁盘存储。
RDB文件是一个经过压缩的二进制文件。
通过RDB文件可以恢复数据库状态。
通过SAVE、BGSAVE命令可以备份数据库
Save命令会阻塞Redis服务器进程。
BGSave会派生一个子进程进行备份,原有进程继续提供服务。
RDB文件在还原时,服务是阻塞的。
可以在Redis配置文件中,设置BGSAVE的自动备份策略。例如:
Save 900 1 --服务器在900s内,如果有大于1次修改,触发自动备份
Save 300 10 --服务器在300s内,如果有大于10次的修改,触发自动备份
Save 60 10000 --服务器在60s内,如果有大于10000次的修改,触发自动备份
Redis服务器每个100毫秒(默认)会检测一次自动备份策略是否满足
因为AOF的更新频率比RDB要高,如果Redis开启了两个备份策略,那么AOF会先于RDB还原数据库状态。支持关闭AOF的时候,RDB才有效。
RDB文件结构:其中REDIS、EOF是常量
3.AOF持久化
AOF:Appent only file
原理:通过保存数据库的写命令来记录数据库状态的。
Redis服务器会在内存中保存一个写命令缓冲区,通过appendfsync可配置写入AOF文件的频率。
AOF文件还原过程
AOF重写:AOF是通过保存写命令来记录数据库状态的。随着时间的变化,AOF文件会越来越大,会存在很多垃圾命令。AOF重写就是解决此问题的。AOF重写不是对就文件的整理,而是对数据库状态的重新备份。
4.事件
文件事件:Redis客户端与服务器的通讯会产生文件事件。文件事件就是服务器对socket操作的抽象。
时间事件:特定时间指定特定动作。
5.发布订阅
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似。
pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者在物理部署上的耦合。redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能
订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel)。
当发布者通过publish命令向redis server发送特定类型的消息时
订阅该消息类型的全部client都会收到此消息。这里消息的传递是多对多的。一个client可以订阅多个 channel,也可以向多个channel发送消息
redis的pub/sub还是有点太单薄(实现才用150行代码)。在安全,认证,可靠性这方便都没有太多支持。
6.事物
Redis事物提供了一种将多个命令请求打包,然后一次性、按顺序的执行多个命令的机制。并且在事物执行期间,服务器不会中断事物,而去响应其他客户端的命令请求。
事物从开始到结束经过三个阶段:
- 事物开始:multi命令,将执行命令的客户端从非事物状态转为事物状态
- 命令入队:当客户端处于非事物状态时,客户端命令是被服务器立即执行的,但是客户端处于事物状态时,服务端收到的命令不会立即执行,而是进入一个队列(Exec、discard、watch、multi命令除外)。
- 事物执行:当收到exec命令后,服务端会立即执行队列中的命令。
Watch:给指定的key加锁,只有当前客户端可以修改,其他客户端的修改都会导致事物不被执行(注意不是执行失败)。
事物的原子性:Redis事物中的命令要么全部执行,不要一个都不执行,是具有原子性的。但是,没有回滚机制,在命令列表中,即使第一个命令执行失败了,后面命令也会被执行到。
事物的一致性:Redis通过谨慎的错误检查和简单的设计来保证事物的一致性。
入队错误:命令语法错误,将导致事物无法执行。(2.6.5之前版本不支持)
执行错误:执行过程中出现错误的,出错的命令不执行回滚,不影响其他命令。
服务端停机:RDB模式无影响、AOF模式无影响、不持久化模式无影响。
事物的隔离线:Redis使用单线程模式执行事务,Redis的事物总是串行执行的。
事物的耐久性:(耐久性:当一个事物执行完毕后,数据是存储到磁盘中的)与具体的持久化策略有关系。
7.慢查询日志
Redis慢查询日志用于记录执行时间超过给定值的命令请求。
Slowlog-log-slower-than:执行时间超过多少微秒,记录日志
Slowlog-max-len:最多保存多少条慢日志。
慢日志查看:通过slowlog get命令可以获取到
8.Monitor
redis客户端可以通过monitor命令把自己变为监视器,通过此功能可以看到redis服务执行的命令请求。
9.数据库复制
老版本:
新版本
从服务器离线后,SYNC命令变为PSYNC。
PSYNC具有两种模式:完整重同步、部分重同步。完整重同步用于第一次同步的场景、部分重同步用于离线后同步的场景。
原理:从服务器每次更新后记录偏移量,短线重新同步时,通过偏移量计算需要同步的命令。
心跳检查
从服务器默认每秒向主服务器发送一次心跳检测命令:replconf ack <replication_offset>.其中replication_offset是当前从服务器的偏移量。
命令主要有三个作用:
1.检测主从服务器间的网络状态
2.辅助检查min-slaves选项:当从服务器数量小于3个,或者三个从服务器的延迟值大于或者等于10秒,主服务器拒绝写命令。
Min-slaves-to-write 3
Min-slaves-max-lag 10
3.检测命令丢失
10.sentinal
Redis的HA官方解决方案
用途:
1.监控所有主从服务器
2.当主服务器下线后,自动把主服务器下属的一个从服务器升级为主服务器。
11.集群
加入集群:一个Redis集群可有多个node组成。通过向一个阶段发送:cluster meet <ip> <port>命令,把节点加入到集群中(需要启用集群模式)
集群建立之后,每个node都具有一份完整的节点状态信息。
槽指派:redis服务器通过对键分片的方式实现集群。整个数据库被分为16384个槽(slot),数据库中的每个键都被分配存储到16384个槽中其中一个。集群的每个节点可以处理0到16384个槽。当16384个槽都被集群处理时,数据库集群才处于上线状态。
Slotnum= CRC16(key) & 16383
每个集群节点都完整了记录了16384个槽与node直接的映射关系。可以通过命令:cluster addslots <slot>[<slot>…]为当前node添加槽。
客户端根据Slot与Node的映射关系,处理来自于客户端的数据请求。
从节点:可通过命令:Cluster replicate <node-id>,把一个集群中的node设置为当前服务器的主服务器。设置后,所有对node-id的写命令都将在当前集群node中备份。
当主服务器down后,从服务器自动在从服务器中挑选一个从服务器并设置为主服务器,当down的主服务器还原后,自动设置为从服务器。
Redis设计与实现:读书笔记之二的更多相关文章
- Redis设计与实现读书笔记(二) 链表
链表作为最基础的数据结构,在许多高级语言上已经有了很好的实现.由于redis采用C语言编写,需要自己实现链表,于是redis在adlist.h定义了链表类型.作者对于这部分没什么好说,源码比较简单,如 ...
- Redis设计与实现读书笔记——简单动态字符串
前言 项目里用到了redis数据结构,不想只是简单的调用api,这里对我的读书笔记做一下记录.原文地址: http://www.redisbook.com/en/latest/internal-dat ...
- Redis设计与实现读书笔记(一) SDS
作为redis最基础的底层数据结构之一,SDS提供了许多C风格字符串所不具备的功能,为之后redis内存管理提供了许多方便.它们分别是: 二进制安全 减少字符串长度获取时间复杂度 杜绝字符串溢出 减少 ...
- Redis 设计与实现读书笔记一 Redis字符串
1 Redis 是C语言实现的 2 C字符串是 /0 结束的字符数组 3 Redis具体的动态字符串实现 /* * 保存字符串对象的结构 */ struct sdshdr { // buf 中已占用空 ...
- <<redis设计和实现>>读书笔记
redis如何实现主从同步的高效率?? 主从复制的同步有一个命令数据的同步文本,然后利用两个不同服务器的偏移量来进行进行同步,避免每次都是全部同步(并非会保存所有的命令数据,而是会有一个缓冲区(比如1 ...
- Redis设计与实现读书笔记——双链表
前言 首先,贴一下参考链接: http://www.redisbook.com/en/latest/internal-datastruct/adlist.html, 另外真赞文章的作者,一个90后的小 ...
- Redis 设计与实现读书笔记一 Redis List
list结构体 adlist.h/list(源码位置) /* * 双端链表结构 */ typedef struct list { // 表头节点 listNode *head; // 表尾节点 lis ...
- 《Data-Intensive Text Processing with mapReduce》读书笔记之二:mapreduce编程、框架及运行
搜狐视频的屌丝男士第二季大结局了,惊现波多野老师,怀揣着无比鸡冻的心情啊,可惜随着剧情的推进发展,并没有出现期待中的屌丝奇遇,大鹏还是没敢冲破尺度的界线.想百度些种子吧,又不想让电脑留下污点证据,要知 ...
- 《图解tcp/ip》读书笔记(二)
<图解tcp/ip>读书笔记(二) 本周主要阅读的是本书的第三章--数据链路. 当然了,从某些角度讲,我认为这一章就是计算机网络的最基本的内容之一.整章讲述了数据链路层的作用和相关技术,主 ...
- 图解TCP/IP读书笔记(二)
图解TCP/IP读书笔记(二) 第二章.TCP/IP基础知识 一.TCP/IP出现的背景及其历史 年份 事件 20世纪60年代后半叶 应DoD(美国国防部)要求,美国开始进行通信技术相关的研发 196 ...
随机推荐
- Caused by: java.lang.ClassNotFoundException: Didn't find class "io.grpc.helloworldexample.HelloworldActivity" on path: DexPathList
FAQ: Android app 编译好后安装到手机,运行时闪退,报如下错误: java.lang.RuntimeException: Unable to instantiate activity ...
- python---实现多个有序列表的合并
我觉得不用抄书上的代码. 遇到实现问题,应该结合python本身的功能去解决. 比如,当合并有序列表时,为什么一定要一项一项比较,而不是使用list的sort函数呢? # coding = utf-8 ...
- 使用 curses 函数库管理基于文本的屏幕
curses 函数库提供了终端无关的方式来编写全屏幕的基于字符的程序.curses 还可以管理键盘,提供了一种简单易用的非阻塞字符输入模式. curses 函数库能够优化光标的移动并最小化需要对屏幕进 ...
- BZOJ 1706
题解: 倍增+floyd 首先这题比较容易想到是把每个点拆点做dij 但是这样复杂度是knlogn的 这道题的k较大,所以不行 我们考虑到每走一步,其实就是在进行一次floyd 而这个可以看成矩阵乘法 ...
- Python初次安装使用教程
Python官网: https://www.python.org/downloads/ 当前版本为3.7.0 下载(64位系统)exe文件进行安装. 双击安装运行 选择自定义安装路径 ...
- sparkStreaming运行yarn,提交任务报错
op.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:302) ...
- redis 配置命令
Redis:是一个key/v 型数据 是nosql的一种 CAP 理论: C:多个数据节点上的数据一致: A:用户发出请求后的有限时间范围内返回结果: P:network partition,网络发 ...
- AtCoder Grand Contest 006 (AGC006) C - Rabbit Exercise 概率期望
原文链接https://www.cnblogs.com/zhouzhendong/p/AGC006C.html 题目传送门 - AGC006C 题意 有 $n$ 个兔子,从 $1$ 到 $n$ 编号, ...
- sql对于字符串的处理
- react 性能优化
React 最基本的优化方式是使用PureRenderMixin,安装工具 npm i react-addons-pure-render-mixin --save,然后在组件中引用并使用 import ...