Redis 存储的数据类型
Redis 是一个开源的使用 ANSI C 语言编写、支持网络、基于内存、可选持久性的键值对存储数据库。Redis 支持多种类型的数据结构,以下是主要的数据类型:
「字符串(String)」
字符串是 Redis 最基本的数据类型,一个键最多能存储 512MB。
「列表(List)」
列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
「集合(Set)」
集合是字符串的无序集合。它是通过哈希表实现的,所以添加、删除、查找的复杂度都是 O(1)。
「有序集合(Sorted Set)」
有序集合和集合一样也是字符串集合,不同的是每个元素都会关联一个浮点数分数。Redis 正是通过分数来为集合中的成员进行从小到大的排序。
「哈希(Hash)」
哈希是一个键值对集合。它是一个字符串字段和字符串值之间的映射表,所以它适合用于存储对象。
「位图(Bitmap)」
位图本质上是字符串,但是可以对字符串的位进行操作,每个位上的值只能是 0 或 1。
「HyperLogLog」
这是一种概率性数据结构,用来做基数统计的算法。
「地理空间(Geo)」
Redis 提供了地理空间索引功能,可以存储地理位置信息,并进行半径查询和定位。
Redis 分布式锁的实现
Redis 分布式锁主要是利用了 Redis 的原子性操作来实现的。最常见的实现方式是使用 SETNX
命令(SET if Not eXists),这个命令只有在键不存在时才会设置键值。
「基本实现步骤」
- 「加锁」 使用
SETNX
设置一个锁键,值可以是一个唯一标识(如 UUID),这样可以避免锁被其他进程释放。 - 「设置超时时间」 为了避免死锁的情况,需要为锁设置一个超时时间,可以使用
EXPIRE
命令来实现。 - 「释放锁」 当任务执行完成后,通过发送
DEL
命令来释放锁。为了确保锁的安全性,需要先检查锁的值是否是设置时的唯一标识,只有匹配时才执行删除操作。
「改进的实现」
在 Redis 2.6.12 版本之后,可以使用 SET
命令的 NX
和 PX
参数来原子性地设置锁键和超时时间,这样可以减少网络通信次数,提高效率。
SET lock_key unique_value NX PX 30000
这条命令会尝试设置一个名为 lock_key
的锁,值为 unique_value
,只有当锁不存在时才会设置成功,并且锁会在 30000 毫秒后自动释放。
「安全性考虑」
为了确保分布式锁的安全性,需要确保以下几点:
- 锁必须是互斥的,同一时间只有一个客户端能持有锁。
- 不要使用
SETNX
和EXPIRE
的组合来设置锁,因为这两个操作不是原子的。 - 解锁时必须确保是锁的持有者才能解锁,可以通过 Lua 脚本来原子性地检查和删除锁。
- 设置合理的锁超时时间,防止因为某些原因导致锁没有被释放。
通过以上的方法,可以在 Redis 中实现一个简单但是相对安全的分布式锁。