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设计与实现:读书笔记之二的更多相关文章

  1. Redis设计与实现读书笔记(二) 链表

    链表作为最基础的数据结构,在许多高级语言上已经有了很好的实现.由于redis采用C语言编写,需要自己实现链表,于是redis在adlist.h定义了链表类型.作者对于这部分没什么好说,源码比较简单,如 ...

  2. Redis设计与实现读书笔记——简单动态字符串

    前言 项目里用到了redis数据结构,不想只是简单的调用api,这里对我的读书笔记做一下记录.原文地址: http://www.redisbook.com/en/latest/internal-dat ...

  3. Redis设计与实现读书笔记(一) SDS

    作为redis最基础的底层数据结构之一,SDS提供了许多C风格字符串所不具备的功能,为之后redis内存管理提供了许多方便.它们分别是: 二进制安全 减少字符串长度获取时间复杂度 杜绝字符串溢出 减少 ...

  4. Redis 设计与实现读书笔记一 Redis字符串

    1 Redis 是C语言实现的 2 C字符串是 /0 结束的字符数组 3 Redis具体的动态字符串实现 /* * 保存字符串对象的结构 */ struct sdshdr { // buf 中已占用空 ...

  5. <<redis设计和实现>>读书笔记

    redis如何实现主从同步的高效率?? 主从复制的同步有一个命令数据的同步文本,然后利用两个不同服务器的偏移量来进行进行同步,避免每次都是全部同步(并非会保存所有的命令数据,而是会有一个缓冲区(比如1 ...

  6. Redis设计与实现读书笔记——双链表

    前言 首先,贴一下参考链接: http://www.redisbook.com/en/latest/internal-datastruct/adlist.html, 另外真赞文章的作者,一个90后的小 ...

  7. Redis 设计与实现读书笔记一 Redis List

    list结构体 adlist.h/list(源码位置) /* * 双端链表结构 */ typedef struct list { // 表头节点 listNode *head; // 表尾节点 lis ...

  8. 《Data-Intensive Text Processing with mapReduce》读书笔记之二:mapreduce编程、框架及运行

    搜狐视频的屌丝男士第二季大结局了,惊现波多野老师,怀揣着无比鸡冻的心情啊,可惜随着剧情的推进发展,并没有出现期待中的屌丝奇遇,大鹏还是没敢冲破尺度的界线.想百度些种子吧,又不想让电脑留下污点证据,要知 ...

  9. 《图解tcp/ip》读书笔记(二)

    <图解tcp/ip>读书笔记(二) 本周主要阅读的是本书的第三章--数据链路. 当然了,从某些角度讲,我认为这一章就是计算机网络的最基本的内容之一.整章讲述了数据链路层的作用和相关技术,主 ...

  10. 图解TCP/IP读书笔记(二)

    图解TCP/IP读书笔记(二) 第二章.TCP/IP基础知识 一.TCP/IP出现的背景及其历史 年份 事件 20世纪60年代后半叶 应DoD(美国国防部)要求,美国开始进行通信技术相关的研发 196 ...

随机推荐

  1. 编写UEditor插件

    UE.registerUI('beijing', function (editor, uiName) { // 注册按钮执行时的command命令 editor.registerCommand(uiN ...

  2. Linux(centos)系统各个目录的作用详解 推荐

    文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.SHELL脚本.二进制的可执行文件等,可用cat ...

  3. 删除Apache服务的命令

    转到\Apache24\bin目录下,使用cmd命令sc delete apache2.2

  4. java.net.ConnectException: Call From slaver1/192.168.19.128 to slaver1:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org

    1:练习spark的时候,操作大概如我读取hdfs上面的文件,然后spark懒加载以后,我读取详细信息出现如下所示的错误,错误虽然不大,我感觉有必要记录一下,因为错误的起因是对命令的不熟悉造成的,错误 ...

  5. [转] 最详尽的 JS 原型与原型链终极详解

    四. __proto__ JS 在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__ 的内置属性,用于指向创建它的构造函数的原型对象. 对象 person1 有一个 __pr ...

  6. luogu 1471

    题意: 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. 操作1:1 x y k ,表示将第x到第y项每项加上k,k为一实数. 操作2:2 x y ...

  7. mysql数据类型(三)

    MySQL 数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 数值类型 MySQL支持所有标准S ...

  8. python 将列表(也可以是file.readlines())输出多个文件

    open_diff = open('yanggao.txt', 'r',encoding='utf-8')diff_line = open_diff.readlines() diff_match_sp ...

  9. web实现下拉列表多选加搜索

    实现如图所示的下拉多选还能带有搜索功能. <!DOCTYPE html> <html> <head> <title></title> < ...

  10. P1135 奇怪的电梯 dp

    题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第ii层楼(1 \le i \le N)(1≤i≤N)上有一个数字K_i(0 \le K_i \le N)K ...