Redis 实战

REDIS 实战

一. 初识 Redis

一些数据库和缓存服务器的特性和功能

1. Redis 数据结构简介

1.1 Redis 中的字符串

字符串示例:

字符串命令:

1.2 Redis 中的列表

列表示例:

列表命令:

1.3 Redis 的集合

集合示例:

集合命令:

1.4 Redis 的散列

散列示例:

散列命令:

1.5 Redis 的有序集合

有序集合示例:

有序集合命令:


二. Redis 命令

1. 字符串

字符串可以存储以下3种类型的值:

  • 字节串(byte string)
  • 整数(取值范围为long integer)
  • 浮点数

自增和自减命令:

  • 若键原本不存在或键保存的是空串,那么redis在执行自增/自减操作时会将其当为0值处理。
  • 若键对应的值无法被转换为整数或浮点数,则会返回一个错误。

处理子串和二进制位的命令:

  • SETRANGE/SETBIT命令对字符串进行写入时,若字符串长度不满足写入要求,那么redis会自动使用空字节扩展字符串长度,然后再执行写入或者更新操作。
  • GETRANGE读取字符串时,超出字符串末尾的数据会被视为空串。
  • GETBIT读取二进制位串时,超出字符串末尾的数据会被视为0.

2. 列表

常用列表命令:

列表间移动元素命令及阻塞式的弹出命令:

3. 集合

常用集合命令:

处理多个集合的命令:

4. 散列

常用散列命令:

散列高级特性:

5. 有序集合

常用有序集合命令:

进阶命令:

6. 发布与订阅

7. 其他命令

7.1 排序

sort命令:

7.2 基本的 Redis 事务

五大命令:

  • WATCH
  • MULTI
  • EXEC
  • UNWATCH
  • DISCARD

7.3 键的过期时间


三. 数据安全与性能保障

1. 持久化选项

两种持久化方法:

  • 快照(snapshotting):将存在于某一时刻的所有数据都写入硬盘。
  • 只追加文件(append-only file,AOF):在执行写命令式,将被执行的写命令复制到硬盘里面。

1.1 快照持久化

Redis 可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。

创建快照的办法:

  • BGSAVE命令(不支持Windows)

    Redis 调用fork来创建一个子进程,然后子进程负责将快照写入硬盘,而父进程则继续处理命令请求。

  • SAVE命令

    接到SAVE命令的redis服务器在快照创建完毕之前不再响应任何其他命令。不常用,通常只会在没有足够内存执行BGSAVE命令或不在意等待持久化操作执行完毕的情况下使用。

  • save配置选项

    若用户设置了save配置选项,如save 60 10000,即在60秒内有10000次写入时触发BGSAVE命令。若设置了多个save配置选项,那么任意一个被满足时都会触发BGSAVE命令。

  • SHUTDOWN/标准TERM命令

    收到该命令时,会执行一个SAVE命令,阻塞所有客户端,不再执行客户端发送的任何命令,并在SAVE命令执行完毕后关闭服务器。

  • SYNC命令

    当一个redis服务器连接另一个redis服务器,并向对方发送SYNC命令来开始一次复制操作时,如果主服务器没有执行BGSAVE操作,或者主服务器并非刚刚执行完BGSAVE操作,那么主服务器就会执行BGSAVE命令。

应用场景:

  • 个人开发
  • 对日志进行聚合计算
  • 大数据

1.2 AOF 持久化

AOF 持久化会将被执行的写命令写到 AOF 文件的末尾,redis只要从头到尾重新执行一次 AOF 文件包含的所有写命令,就可以恢复 AOF 文件所记录的数据集。

appendfsync配置选项:

1.3 重写/压缩 AOF 文件

为了解决 AOF 文件体积不断增大的问题,用户可以向Redis发送BGREWRITEAOF命令,这个命令会通过移除AOF文件中的冗余命令来重写AOF文件,使AOF文件变得尽量小。其工作原理类似于BGSAVE,均需要创建一个子进程。

2. 复制

redis通常使用一个主服务器向多个从服务器发送更新,并使用从服务器来处理所有读请求。

在需要扩展读请求时,或在需要写入临时数据时,用户可以通过设置额外的redis从服务器来保存数据集的副本。

在接收到主服务器发送的数据初始副本之后,客户端每次向主服务器进行写入时,从服务器都会实时更新。

在部署好主从服务器后,客户端就可以向任意一个从服务器发送读请求了,即实现了负载均衡。

2.1 相关选项配置

slaveof host port配置选项:根据给定的IP地址和端口来连接主服务器。

SLAVEOF no one命令:终止复制操作,不再接受主服务器的数据更新。

SLAVEOF host port命令:开始复制一个新的主服务器。

2.2 启动过程

Redis 不支持主主复制。

当多个从服务器尝试连接同一个主服务器时,会出现以下情况:

2.3 主从链

从服务器也可以拥有自己的从服务器,从而形成主从链。

从从复制与主从复制的唯一区别在于,若从服务器X拥有从服务器Y,那么当X在执行复制的步骤4时,它将断开与Y的连接,导致Y需要重新连接并重新同步。

2.4 检验硬盘写入

为了验证主服务器是否已经将数据发送至从服务器,用户需要主服务器写入真正的数据之后,再向主服务器写入一个唯一的虚构值,然后通过检查虚构值是否存在于从服务器来判断写数据是否已经到达从服务器。

判断数据是否已经被保存到硬盘里面的方法:检查INFO命令的输出结果中aof_pending_bio_fsync属性的值是否为0,若为0,则表示数据已经存入硬盘中。

3. 处理系统故障

3.1 验证快照文件和 AOF 文件

修复 AOF 文件和快照文件的命令:

  • redis-check-aof

    –fix参数,修复AOF文件,扫描给定的AOF文件,寻找不正确或不完整的命令,并删除第一个出错的命令及其之后的所有命令。

  • redis-check-dump

    目前并没有办法可以修复出错的快照文件,由于快照文件本身经过了压缩,其中出现的错误可能会导致整个文件都不可读,因而无法修复。

3.2 更换故障主服务器

更换主服务器的方法:

  • 首先向从服务器B发送一个SAVE命令,让它创建一个新的快照文件。
  • 将该快照文件发送给新的主服务器C,并在C上启动Redis。
  • 最后让B成为C的从服务器。

另一种创建新的主服务器方法:将从服务器升级为主服务器,并为升级后的主服务器创建从服务器。

4. Redis 事务

5. 非事务型流水线


四. 使用 Redis 构建支持程序

1. 使用 Redis 来记录日志

Linux和Unix两种常见的记录日志的方法:

  • 日志记录到文件中,然后不断添加日志行

    缺点:不同服务会创建不同的日志,这些服务轮换(rolling)日志的机制各不相同,并且也缺少一种能够方便地聚合所有日志并对其进行处理的常用方法。

  • syslog 服务

    运行在514号TCP端口和UDP端口上。

    syslog接受其他程序发来的日志消息,并将这些信息路由至存储在硬盘上的各个日志文件里,还负责旧日志的轮换和删除工作。

2. 计数器和统计数据

3. 查找 IP 所属城市以及国家

4. 服务的发现与配置