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
「基本实现步骤」
- 「加锁」 使用
SETNX
- 「设置超时时间」 为了避免死锁的情况,需要为锁设置一个超时时间,可以使用
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 中实现一个简单但是相对安全的分布式锁。