1.初始Redis
Redis是一个速度非常快的非关系型数据库,他可以存储键和五种不同的值之间的映射,可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能。
1.1 与其他数据库和软件对比
名称 | 类型 | 数据存储选项 | 查询类型 | 附加功能 |
---|---|---|---|---|
Redis | 使用内存存储的非关系数据库 | 字符串、列表、集合、散列、有序集合 | 每种类型有自己的专属命令,不完全的事务支持 | 发布订阅、主从复制、持久化、脚本 |
MySql | 关系数据库 | 每个数据库有多个表,表有多个行 | select\update\insert\delete\函数\存储过程 | InnoDB类型支持ACID性质、主从复制、主主复制 |
MongoDB | 使用硬盘存储的非关系型数据库 | 数据库->表->文档 | 增删改查 | 支持map-reduce操作、主从复制、分片、空间索引 |
1.2 Redis数据结构简介
redis可以存储键与五种不同数据结构类型之间的映射,这5中数据结构分别是String、List、Set、Hash、ZSet。有一部分命令对这5中数据结构是通用的,比如DEL、TYPE、RENAME。
结构类型 | 结构存储的值 | 结构的读写能力 |
---|---|---|
String(字符串) | 可以是字符串、整数或者浮点数 | 对整个字符串或者其中的一部分执行操作,对正数和浮点数执行自增或者自减 |
List(列表) | 链表,每个节点包含一个字符串 | 从链表的两端推入或者弹出元素,基于偏移量修建链表、基于下表读取单个或者多个元素 |
Set(集合) | 无须的不重复的集合 | 检查一个元素是否存在、计算交集、并集、差集、随机读取元素 |
Hash(散列) | 包含键值对的无序散列表 | 添加、获取、移除某个键值对、获取所有键值对 |
ZSet(有序集合) | 字符串成员与浮点数分值之间的有序映射,排列顺序由分值大小决定 | 添加、获取、删除某个元素 |
1.2.1 String字符串
命令 | 行为 | 返回值 |
---|---|---|
GET | 获取存储在给定键中的值 | 值 |
SET | 设置值 | OK |
DEL | 删除键中的值(这个命令可以用于所有类型) | 删除的个数(0或1) |
SETEX | 为指定的key设置值和过期时间,如果key已经存在,覆盖 | OK |
1.2.2 List列表
LPUSH和RPUSH 分别表示用于将元素推入列表的左端和右端。
下面展示了一些list中的基本命令:
命令 | 行为 | 返回值 | 备注 |
---|---|---|---|
LPUSH | 将给定值推入列表的左端 | 数组长度 | |
RPUSH | 推入右端 | 数组长度 | |
LRANGE | 根据下表获取元素 | 元素集合 | lrange 0 -1,取出所有,如果第二个参数超过数组长度,也会返回所有的元素 |
LINDEX | 根据下表获取元素 | ||
LPOP | 从链表左端弹出(取出)元素 | 弹出的元素 | 取出后列表中就不存在 |
RPOP | 同上 |
1.2.3 Set集合
list和set都可以存储多个字符串,不同之处在于,set是无序的并且set通过散列来确定自己存储的每一个字符串都是唯一的。
命令 | 行为 | 返回值 |
---|---|---|
SADD | 给定元素添加到集合 | 0,1 |
SMEMBERS | 返回集合中所有元素 | |
SISMEMBER | 检查给定元素是否存在于集合中 | 0,1 |
SREM | 移除指定元素 | 0,1 |
1.2.4 散列Hash
散列可以存储多个键值对之间的映射。
散列在很多方面就像是一个微缩版的Redis,很多字符串命令都有相应的散列版本。
命令 | 行为 | 返回值 |
---|---|---|
HSET | 设置指定的键值对 | 已存在返回0,但会执行更新操作。正常添加返回 |
HGT | 获取指定散列键的值 | 没有返回null |
HGETALL | 返回散列所有的键值对 | |
HDEL | 删除指定的键值对 | 0,不存在。1,正常删除 |
HLEN | 获取散列中字段的数量 |
1.2.5 有序集合ZSet
有序集合和散列一样,都用于存储键值对,这一点要注意,和set不一样,set集合是存储字符串的,zset中键值对的键称为成员(member),而且具有唯一性,值成为分值(score),分值必须为浮点数。
有序集合是Redis里面唯一一个既可以根据成员访问元素,又可以根据分值以及分值的排列顺序来访问元素结构的。
命令 | 行为 | 示例 |
---|---|---|
ZADD | 将一个带有给定分值的成员添加到有序集合里面 | ZADD zset-key 728 member1 |
ZRANGE | 根据元素位置获取多个元素 | ZRANGE zset-key 0 -1 withscores |
ZRANGEBYSCORE | 根据分值范围获取多个元素 | ZRANGEBYSCORE zset-key 0 900 withscores |
ZREM | 根据成员删除元素 | ZREM zset-key member1 |
ZSCORE | 根据成员获取分值 | ZSCORE zset-key member0 |
ZREMRANGEBYRANK | 移除两个参数(下标表)之间的元素,0表示第一个元素,负数表示倒数第几个,例如(0,-26)表示移除第一个到倒数第26个之间的元素,这样最后会剩下25个 | 移除的元素个数 |
现在我们已经简单了解Redis的五种结构,下面即将展示如何通过结合散列的数据存储能力和有序集合内建的排序能力来解决一个常见问题。