* [Redis 是什么](#redis-是什么) * [Redis 的五种基本类型](#redis-的五种基本类型) * [键的过期时间](#键的过期时间) * [发布与订阅](#发布与订阅) * [事务](#事务) * [持久化](#持久化) * [1. 快照持久化](#1-快照持久化) * [2. AOF 持久化](#2-aof-持久化) * [复制](#复制) * [处理故障](#处理故障) * [分片](#分片) * [事件](#事件) * [Redis 与 Memcached 的区别](#redis-与-memcached-的区别) * [Redis 适用场景](#redis-适用场景) * [数据淘汰策略](#数据淘汰策略) * [一个简单的论坛系统分析](#一个简单的论坛系统分析) * [参考资料](#参考资料) # Redis 是什么 Redis 是速度非常快的非关系型(nosql)内存键值数据库,可以存储键和五种不同类型的值之间的映射。 五种类型数据类型为:字符串、列表、集合、有序集合、散列表。 Redis 支持很多特性,例如可以将内存中的数据持久化到硬盘中,可以使用复制来扩展读性能,可以使用分片来扩展写性能。 # Redis 的五种基本类型 | 数据类型 | 可以存储的值 | 操作 | | -- | -- | -- | | STRING | 字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行操作; 对整数和浮点数执行自增或者自减操作 | | LIST | 链表 | 从两端压入或者弹出元素; 读取单个或者多个元素; 进行修剪,只保留一个范围内的元素。 | | SET | 无序集合 | 添加、获取、移除单个元素; 检查一个元素是否存在于集合中; 计算交集、并集、差集; 从集合里面随机获取元素。 | | HASH | 包含键值对的无序散列表 | 添加、获取、移除单个键值对; 获取所有键值对; 检查某个键是否存在。| | ZSET | 有序集合 1 | 添加、获取、删除元素个元素; 根据分值范围或者成员来获取元素; 计算一个键的排名。 | 注 1:有序集合的每个集合元素都对应一个分值,根据这个分值的大小来对集合元素进行排序。有因此有序集合相当于是有序的散列表,键是集合元素,值为元素对应的分值。 # 键的过期时间 Redis 可以为每个键设置过期时间,当键过期时,会自动删除该键。 对于散列表这种容器,只能为整个键设置过期时间(整个散列表),而不能为键里面的单个元素设置过期时间。 过期时间对于清理缓存数据非常有用。 # 发布与订阅 发布与订阅实际上是观察者模式,订阅者订阅了频道之后,发布者向频道发送字符串消息会被所有订阅者接收到。 发布与订阅有一些问题,很少使用它,而是使用替代的解决方案。问题如下: 1. 如果订阅者读取消息的速度很慢,会使得消息不断积压在发布者的输出缓存区中,造成内存占用过多; 2. 如果订阅者在执行订阅的过程中网络出现问题,那么就会丢失断线期间发送的所有消息。 # 事务 Redis 最简单的事务实现方式是使用 MULTI 和 EXEC 命令将事务操作包围起来。 MULTI 和 EXEC 中的操作将会一次性发送给服务器,而不是一条一条发送,这种方式称为流水线,它可以减少客户端与服务器之间的网络通信次数从而提升性能。 # 持久化 Redis 是内存型数据库,为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上。 ## 1. 快照持久化 将某个时间点的所有数据都存放到硬盘上。 可以将快照复制到其它服务器从而创建具有相同数据的服务器副本。 如果系统发生故障,将会丢失最后一次创建快照之后的数据。并且如果数据量很大,保存快照的时间也会很长。 ## 2. AOF 持久化 AOF 持久化将写命令添加到 AOF 文件(Append Only File)的末尾。 对硬盘的文件进行写入时,写入的内容首先会被存储到缓冲区,然后由操作系统决定什么时候将该内容同步到硬盘,用户可以调用 file.flush() 方法请求操作系统尽快将缓冲区存储的数据同步到硬盘。因此将写命令添加到 AOF 文件时,要根据需求来保证何时将添加的数据同步到硬盘上,有以下同步选项: | 选项 | 同步频率 | | -- | -- | | always | 每个写命令都同步 | | everysec | 每秒同步一次 | | no | 让操作系统来决定何时同步 | always 选项会严重减低服务器的性能;everysec 选项比较合适,可以保证系统奔溃时只会丢失一秒左右的数据,并且 Redis 每秒执行一次同步对服务器性能几乎没有任何影响;no 选项并不能给服务器性能带来多大的提升,而且也会增加系统奔溃时数据丢失的数量。 随着服务器写请求的增多,AOF 文件会越来越大;Redis 提供了一种将 AOF 重写的特性,能够去除 AOF 文件中的冗余写命令。 # 复制 通过使用 slaveof host port 命令来让一个服务器成为另一个服务器的从服务器。 一个从服务器只能有一个主服务器,并且不支持主主复制。 **1. 从服务器连接主服务器的过程** (1) 主服务器创建快照文件,发送给从服务器,并在发送期间使用缓冲区记录执行的写命令。快照文件发送完毕之后,开始向从服务器发送存储在缓冲区中的写命令; (2) 从服务器丢弃所有旧数据,载入主服务器发来的快照文件,之后从服务器开始接受主服务器发来的写命令; (3) 主服务器每执行一次写命令,就向从服务器发送相同的写命令。 **2. 主从链** 随着负载不断上升,主服务器可能无法很快地更新所有从服务器,或者重新连接和重新同步从服务器而导致系统超载。为了解决这个问题,可以创建一个中间层来分担主服务器的复制工作。中间层的服务器是最上层服务器的从服务器,又是最下层服务器的主服务器。