概述

Remote Dictionary Server (Redis) 是一个开源的、使用ANSI C言编写、遵守BSD协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,是跨平台的 非关系型数据库NoSQL (Not Only SQL)
Windows Redis GitHub releases(下载发行版本)

基本数据类型及操作

Redis 通常被称为数据结构服务器,因为值可以是 string、hash、list、set、sorted set/z-set 等类型。

string 可以为整形、浮点型和字符串,统称为元素
string是Redis中最常用的类型,是一个由字节组成的序列,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据。Value最多可以容纳的数据长度为512MB。

常用命令 作用
set [key] [value] [过期秒数] [过期毫秒数] [NX|XX] 添加/修改string
get [key] 查询string
append [key] [value] 追加字符串
strlen [key] 查询字符串长度
incrby [key]、incrbyfloat [key] 使整型/浮点型自增
decrby [key]、decrbyfloat [key] 使整型/浮点型自减
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
127.0.0.1:6379> set name jack
OK
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> set money 1.1
OK
127.0.0.1:6379> get name
"jack"
127.0.0.1:6379> append name son
(integer) 7
127.0.0.1:6379> get name
"jackson"
127.0.0.1:6379> get age
"18"
127.0.0.1:6379> incrby age 0
(integer) 18
127.0.0.1:6379> incrbyfloat money 0
"1.1"
127.0.0.1:6379> incrbyfloat money 0.1
"1.2"

hash是一个string类型的field和value的映射表,可以看做是一个Map表结构容器。

命令 作用
del [key] 删除
expire [key] 设置过期时间
ttl [key] 查询剩余时间(秒)
pttl [key] 查询剩余时间(毫秒)
keys [pattern] 查询key列表
* 匹配任意数量的任意符号
? 配合一个任意符号
[] 匹配一个指定符号
rename [key] [newkey] 改名
renamenx [key] [newkey] 在newkey不存在时才进行修改
命令 作用
flushdb 删除当前数据库数据
flushall 删除所有
help 命令名称 获取命令帮助文档
help @组名 获取组中所有命令信息,例help @string help @generic
clear 清除屏幕中的信息
quitexit 退出

主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。

主从复制的作用主要包括:

  • 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  • 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
  • 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
  • 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

使用

主从复制的开启,完全是在从节点发起的;不需要我们在主节点做任何事情。
从节点开启主从复制,有3种方式:

  • 配置文件

    • 复制一个redis的从服务器,在配置文件中配置端口(搜索port 6379改成其他端口)
      port 6380
    • 修改slaveof <masterip> <masterport>
      slaveof 127.0.0.1 6379
    • 启动主服务器
    • 在从服务器目录使用配置文件启动即可实现主从复制,windows版命令:
      redis-server redis.windows.conf
  • 启动命令
    redis-server --slaveof <masterip> <masterport>

  • 客户端命令
    Redis服务器启动后,直接通过客户端执行命令:slaveof <masterip> <masterport>,则该Redis实例成为从节点。

断开复制

从节点执行slaveof no one即可断开复制。需要注意的是,从节点断开复制后,不会删除已有的数据,只是不再接受主节点新的数据变化。

查询状态

使用replication指令以查看主从状态

运作原理

无论是初次连接还是重新连接, 当建立一个从服务器时, 从服务器都将向主服务器发送一个 SYNC 命令。
接到 SYNC 命令的主服务器将开始执行 BGSAVE , 并在保存操作执行期间, 将所有新执行的写入命令都保存到一个缓冲区里面。
当 BGSAVE 执行完毕后, 主服务器将执行保存操作所得的 .rdb 文件发送给从服务器, 从服务器接收这个 .rdb 文件, 并将文件中的数据载入到内存中。
之后主服务器会以 Redis 命令协议的格式, 将写命令缓冲区中积累的所有内容都发送给从服务器。
你可以通过 telnet 命令来亲自验证这个同步过程: 首先连上一个正在处理命令请求的 Redis 服务器, 然后向它发送 SYNC 命令, 过一阵子, 你将看到 telnet 会话(session)接收到服务器发来的大段数据(.rdb 文件), 之后还会看到, 所有在服务器执行过的写命令, 都会重新发送到 telnet 会话来。
即使有多个从服务器同时向主服务器发送 SYNC , 主服务器也只需执行一次 BGSAVE 命令, 就可以处理所有这些从服务器的同步请求。
从服务器可以在主从服务器之间的连接断开时进行自动重连, 在 Redis 2.8 版本之前, 断线之后重连的从服务器总要执行一次完整重同步(full resynchronization)操作, 但是从 Redis 2.8 版本开始, 从服务器可以根据主服务器的情况来选择执行完整重同步还是部分重同步(partial resynchronization)。

哨兵(Sentinel)模式

主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例
当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

用文字描述一下故障切换(failover)的过程。假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。(原文地址)

使用

  • 在哨兵服务目录下创建sentinel.conf配置文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    port 26379
    bind 127.0.0.1

    # 禁止保护模式(如果是yes,要是配置里没有指定bind和密码,redis只会本地进行访问,拒绝外部访问。)
    protected-mode no

    # 守护进程模式
    # 在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中
    # 此时redis将一直运行,除非手动kill该进程。
    # daemonize yes

    ################################# mymaster #################################

    # 配置监听的主服务器:mymaster代表服务器的名称,127.0.0.1 6379代表监控的主服务器
    # 2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover故障切换操作。
    sentinel monitor mymaster 127.0.0.1 6379 2

    # 设置master和slaves验证密码
    # sentinel auth-pass mymaster 123456

    # master或slave多长时间(默认30秒)不能使用后标记为s_down状态。
    sentinel down-after-milliseconds mymaster 5000

    # 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步
    # 这个数字越小,完成failover所需的时间就越长
    # 这个数字越大,就意味着越多的slave因为replication而不可用
    # 可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
    sentinel parallel-syncs mymaster 1

    # 若sentinel在该配置值内未能完成failover故障切换操作,则认为本次failover失败。
    sentinel failover-timeout mymaster 15000

    # 哨兵程序自动添加的部分
    sentinel config-epoch mymaster 0
    sentinel leader-epoch mymaster 1

    # 可以配置多个master节点
    ################################# mymaster2 #################################
  • 复制多个哨兵,改一下端口号,运行即可

Redis的持久化

Redis 提供了2个不同形式的持久化方式。
RDB (Redis DataBase) 参考链接
AOF (Append Of File) 参考链接

RDB(快照形式保存)

RDB在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot(快照),它恢复时是将快照文件直接读到内存里。

关于fork

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,等持久化过程结束,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。

如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。
RDB的缺点是最后一次持久化后的数据可能丢失

在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Linux中引入了“写时复制技术”,一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。

使用

配置

  • 可以配置文件名称dbfilename dump.rdb,默认为dump.rdb
  • rdb文件的保存路径也可以修改dir /myredis,默认为Redis启动时命令行所在的目录下。
  • rdb的保存策略
    1
    2
    3
    4
    5
    6
    # 900秒内执行1次set操作 则进行持久化
    save 900 1
    # 300秒内执行10次set操作 则进行持久化
    save 300 10
    # 60秒内执行1万次set操作 则进行持久化
    save 60 10000

手动保存

  • save 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。
  • bgsave fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。 Redis 服务器在bgsave执行期间仍然可以继续处理客户端的请求。

AOF(日志形式记录)

AOF日志 的形式来记录每个操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,Redis启动之初会读取该文件重新构建数据,换言之,Redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

使用

  • AOF默认不开启,需要手动在配置文件中配置appendonly yes
  • 可以配置文件名称appendfilename "appendonly.aof",默认为appendonly.aof
  • AOF文件的保存路径同RDB的路径一致。

如遇到AOF文件损坏,可通过redis-check-aof --fix appendonly.aof进行恢复

同步频率设置

AOF同步频率和简单来说就是持久化的频率,和rdb一样也可以通过修改配置来修改同步频率。

  • appendfsync always:始终同步,每次Redis的写入都会立刻记入日志;性能较差但数据完整性比较好
  • appendfsync everysec:每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。
  • appendfsync no:redis不主动进行同步,把同步时机交给操作系统。

AOF和RDB用哪个好

官方推荐两个都启用。
如果对数据不敏感,可以选单独用RDB。
不建议单独用 AOF,因为可能会出现Bug。
如果只是做纯内存缓存,可以都不用。