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

「基本实现步骤」

  1. 「加锁」 使用 SETNX
  2. 「设置超时时间」 为了避免死锁的情况,需要为锁设置一个超时时间,可以使用 EXPIRE
  3. 「释放锁」 当任务执行完成后,通过发送 DEL

「改进的实现」

在 Redis 2.6.12 版本之后,可以使用 SET 命令的 NXPX

SET lock_key unique_value NX PX 30000

这条命令会尝试设置一个名为 lock_key 的锁,值为 unique_value,只有当锁不存在时才会设置成功,并且锁会在 30000 毫秒后自动释放。

「安全性考虑」

为了确保分布式锁的安全性,需要确保以下几点:

  • 锁必须是互斥的,同一时间只有一个客户端能持有锁。

SETNX

EXPIRE

  • 解锁时必须确保是锁的持有者才能解锁,可以通过 Lua 脚本来原子性地检查和删除锁。
  • 设置合理的锁超时时间,防止因为某些原因导致锁没有被释放。

通过以上的方法,可以在 Redis 中实现一个简单但是相对安全的分布式锁。