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 ...
随机推荐
- HDU 2588 GCD(欧拉函数)
GCD Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- tp5.0整合七牛云图片上传
转:https://www.cnblogs.com/adobe-lin/p/7699638.html 这里以上传图片为例 上传其他文件也是大同小异 使用composer安装gmars/tp5-qini ...
- android 如何调用 隐藏的 API 接口
怎样查看并且使用 Android 隐藏 API 和内部 APIhttps://www.jianshu.com/p/fbf45770ecc8 android 隐藏API显式调用以及内部资源使用方法htt ...
- Oracle数据库表索引失效,解决办法:修改Oracle数据库优化器模式
ALTER SYSTEM SET OPTIMIZER_MODE=RULE scope=both; 其他可以选择的模式还有ALL_ROWS/CHOOSE/FIRST_ROWS/ALL_ROWS. 应用系 ...
- Typora开启行内公式
文件→偏好设置→Markdown,勾选内联公式,重启typora 输入$,按Esc键会自动在后面加上一个$,然后在这两个$之间输入公式.
- Redis都有哪些数据类型
string 这是最基本的类型了,就是普通的set和get,做简单的kv缓存 hash 这个是类似map的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对象)给缓存 ...
- 【BZOJ2560】串珠子
题解: 跟n个点有标号的无向连通图个数几乎一模一样 直接上代码了 代码: #include <bits/stdc++.h> using namespace std; #define ll ...
- 元素滚动到底部或顶部时阻止body滚动
移动端的弹窗内容有滚动条,滚动到底部或顶部时或影响弹窗下的body滚动,某些浏览器滚动到顶部时不松手就触发了刷新页面的情况,如果不需要这样的默认体验,就需要加一下判断了. var startX,sta ...
- jav实验二
实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验内容 1.参考Intellj ID ...
- BZOJ4816 [Sdoi2017]数字表格 数论 莫比乌斯反演
原文链接http://www.cnblogs.com/zhouzhendong/p/8666106.html 题目传送门 - BZOJ4816 题意 定义$f(0)=0,f(1)=1,f(i)=f(i ...