List
列表,按照 String 元素插入顺序排序。其顺序为后进先出。由于其具有栈的特性,所以可以实现如“最新消息排行榜”这类的功能。
Set
String 元素组成的无序集合,通过哈希表实现(增删改查时间复杂度为 O(1)),不允许重复。
另外,当我们使用 Smembers 遍历 Set 中的元素时,其顺序也是不确定的,是通过 Hash 运算过后的结果。
Redis 还对集合提供了求交集、并集、差集等操作,可以实现如同共同关注,共同好友等功能。
Sorted Set
通过分数来为集合中的成员进行从小到大的排序。
更高级的 Redis 类型
用于计数的 HyperLogLog、用于支持存储地理位置信息的 Geo。
从海量 Key 里查询出某一个固定前缀的 Key
假设 Redis 中有十亿条 Key,如何从这么多 Key 中找到固定前缀的 Key?
方法 1:使用 Keys [pattern]:查找所有符合给定模式 Pattern 的 Key
使用 Keys [pattern] 指令可以找到所有符合 Pattern 条件的 Key,但是 Keys 会一次性返回所有符合条件的 Key,所以会造成 Redis 的卡顿。
假设 Redis 此时正在生产环境下,使用该命令就会造成隐患,另外如果一次性返回所有 Key,对内存的消耗在某些条件下也是巨大的。
例:
keys test* //返回所有以test为前缀的key
方法 2:使用 SCAN cursor [MATCH pattern] [COUNT count]
注:
- cursor:游标
- MATCH pattern:查询 Key 的条件
- Count:返回的条数
SCAN 是一个基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程。
SCAN 以 0 作为游标,开始一次新的迭代,直到命令返回游标 0 完成一次遍历。
此命令并不保证每次执行都返回某个给定数量的元素,甚至会返回 0 个元素,但只要游标不是 0,程序都不会认为 SCAN 命令结束,但是返回的元素数量大概率符合 Count 参数。另外,SCAN 支持模糊查询。
例:
SCAN 0 MATCH test* COUNT 10 //每次返回10条以test为前缀的key
如何通过 Redis 实现分布式锁
分布式锁
分布式锁是控制分布式系统之间共同访问共享资源的一种锁的实现。如果一个系统,或者不同系统的不同主机之间共享某个资源时,往往需要互斥,来排除干扰,满足数据一致性。
分布式锁需要解决的问题如下:
- 互斥性:任意时刻只有一个客户端获取到锁,不能有两个客户端同时获取到锁。
- 安全性:锁只能被持有该锁的客户端删除,不能由其他客户端删除。
- 死锁:获取锁的客户端因为某些原因而宕机继而无法释放锁,其他客户端再也无法获取锁而导致死锁,此时需要有特殊机制来避免死锁。
- 容错:当各个节点,如某个 Redis 节点宕机的时候,客户端仍然能够获取锁或释放锁。
如何使用 Redis 实现分布式锁
使用 SETNX 实现,SETNX key value:如果 Key 不存在,则创建并赋值。
该命令时间复杂度为 O(1),如果设置成功,则返回 1,否则返回 0。