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. mysql查看工具——mysql profiler sql

    http://www.profilesql.com/download/ 开发同学的福利--mysql监控工具sqlprofiler,类似sqlserver的profiler工具 https://www ...

  2. EF Core Migration

    //添加migrations dotnet ef migrations add [名称] //根据model更新sql表结构 dotnet ef database update //删除最新的migr ...

  3. curl请求https请求

    function curl_https($url,$data){ $ch = curl_init (); curl_setopt ( $ch, CURLOPT_URL, $url ); curl_se ...

  4. jquery源码 整体架构

    一.对外提供接口 对外提供了jQuery. //可以通过jQuery或者$来找到jQuery (function(window,undefined){ //(21,94) 定义了一些变量和函数 jQu ...

  5. 【bzoj4031】[HEOI2015]小Z的房间

    题解: 矩阵树定理入门题 一个图的邻接矩阵G:对于无向图的边(u,v),G[u][v]++,G[v][u]++ 一个图的度数矩阵D:对于无向图的边(u,v),D[u][u]++,D[v][v]++; ...

  6. C# 之 比较两个word文档的内容

    利用 Microsoft.Office.Interop.Word 组件进行比较.引入命名空间:using Word2013 = Microsoft.Office.Interop.Word; 代码如下: ...

  7. jenkins(8): 实战jenkins+gitlab持续集成发布php项目(代码不需要编译)

    一. jenkins 的配置 1.前提条件安装了GitLab Plugin (源码管理使用),GitLab Hook(gitlab webhook需要) Manage Jenkins--->Ma ...

  8. Best Reward 拓展kmp

    Problem Description After an uphill battle, General Li won a great victory. Now the head of state de ...

  9. Python图表数据可视化Seaborn:3. 线性关系数据| 时间线图表| 热图

    1. 线性关系数据可视化 lmplot( ) import numpy as np import pandas as pd import matplotlib.pyplot as plt import ...

  10. JavaScript深拷贝实现原理简析

    原文:http://www.cnblogs.com/xie-zhan/p/6020954.html JavaScript实现继承的时候,需要进行对象的拷贝:而为了不影响拷贝后的数据对原数据造成影响,也 ...