Redis数据结构和主要命令( 二 )


绝对不会找出现两个请求得到一样的返回值的情况 。
例 2:自增序列生成
实现类似于 RDBMS 的 Sequence 功能 , 生成一系列唯一的序列号
设置序列起始值:
SET sequence "10000"
获取一个序列值:
INCR sequence
直接将返回值作为序列使用即可 。
获取一批(如 100 个)序列值:
INCRBY sequence 100
假设返回值为 N , 那么 [N - 99 ~ N] 的数值都是可用的序列值 。
当多个客户端同时向 Redis 申请自增序列时 , Redis 能够确保每个客户端得到的序列值或序列范围都是全局唯一的 。
绝对不会出现不同客户端得到了重复的序列值的情况 。
常用命令三:List
Redis 的 List 是链表型的数据结构 , 可以使用 LPUSH/RPUSH/LPOP/RPOP 等命令在 List 的两端执行插入元素和弹出元素的操作 。
虽然 List 也支持在特定 index 上插入和读取元素的功能 , 但其时间复杂度较高(O(N)) , 应小心使用 。
与 List 相关的常用命令:
LPUSH:向指定 List 的左侧(即头部)插入 1 个或多个元素 , 返回插入后的 List 长度 。时间复杂度 O(N) , N 为插入元素的数量
RPUSH:同 LPUSH , 向指定 List 的右侧(即尾部)插入 1 或多个元素
LPOP:从指定 List 的左侧(即头部)移除一个元素并返回 , 时间复杂度 O(1)
RPOP:同 LPOP , 从指定 List 的右侧(即尾部)移除 1 个元素并返回
LPUSHX/RPUSHX:与 LPUSH/RPUSH 类似 , 区别在于 , 
LPUSHX/RPUSHX 操作的 key 如果不存在 , 则不会进行任何操作
LLEN:返回指定 List 的长度 , 时间复杂度 O(1)
LRANGE:返回指定 List 中指定范围的元素(双端包含 , 即 LRANGE key 0 10 会返回 11 个元素) , 时间复杂度 O(N) 。
应尽可能控制一次获取的元素数量 , 一次获取过大范围的 List 元素会导致延迟 。
同时对长度不可预知的 List , 避免使用 LRANGE key 0 -1 这样的完整遍历操作 。
应谨慎使用的 List 相关命令:
LINDEX:返回指定 List 指定 index 上的元素 , 如果 index 越界 , 返回 nil 。
index 数值是回环的 , 即 - 1 代表 List 最后一个位置 , -2 代表 List 倒数第二个位置 。时间复杂度 O(N)
LSET:将指定 List 指定 index 上的元素设置为 value , 如果 index 越界则返回错误 , 时间复杂度 O(N) 。
如果操作的是头 / 尾部的元素 , 则时间复杂度为 O(1)
LINSERT:向指定 List 中指定元素之前 / 之后插入一个新元素 , 并返回操作后的 List 长度 。
如果指定的元素不存在 , 返回 - 1 。如果指定 key 不存在 , 不会进行任何操作 , 时间复杂度 O(N)
由于 Redis 的 List 是链表结构的 , 上述的三个命令的算法效率较低 , 需要对 List 进行遍历 。
命令的耗时无法预估 , 在 List 长度大的情况下耗时会明显增加 , 应谨慎使用 。
换句话说 , Redis 的 List 实际是设计来用于实现队列 , 而不是用于实现类似 ArrayList 这样的列表的 。
如果你不是想要实现一个双端出入的队列 , 那么请尽量不要使用 Redis 的 List 数据结构 。
为了更好支持队列的特性 , Redis 还提供了一系列阻塞式的操作命令 , 如 BLPOP/BRPOP 等 , 能够实现类似于 BlockingQueue 的能力 。
即在 List 为空时 , 阻塞该连接 , 直到 List 中有对象可以出队时再返回 。
常用命令四:Hash
Hash 即哈希表 , Redis 的 Hash 和传统的哈希表一样 , 是一种 field-value 型的数据结构 , 可以理解成将 HashMap 搬入 Redis 。
Hash 非常适合用于表现对象类型的数据 , 用 Hash 中的 field 对应对象的 field 即可 。
Hash 的优点包括:
可以实现二元查找 , 如” 查找 ID 为 1000 的用户的年龄”
比起将整个对象序列化后作为 String 存储的方法 , Hash 能够有效地减少网络传输的消耗 。
当使用 Hash 维护一个集合时 , 提供了比 List 效率高得多的随机访问命令
与 Hash 相关的常用命令:
HSET:将 key 对应的 Hash 中的 field 设置为 value 。如果该 Hash 不存在 , 会自动创建一个 。时间复杂度 O(1)


推荐阅读