redis 存储什么类型的数据?redis 分布式锁怎么实现的?
redis 存储什么类型的数据?redis 分布式锁怎么实现的?
程序员朱永胜有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准
https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。https://store.amazingmemo.com/chapterDetail/1685324709017001`
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
参数来原子性地设置锁键和超时时间,这样可以减少网络通信次数,提高效率。
1 | SET lock_key unique_value NX PX 30000 |
这条命令会尝试设置一个名为 lock_key
的锁,值为 unique_value
,只有当锁不存在时才会设置成功,并且锁会在 30000 毫秒后自动释放。
安全性考虑
为了确保分布式锁的安全性,需要确保以下几点:
- 锁必须是互斥的,同一时间只有一个客户端能持有锁。
- 不要使用
SETNX
和EXPIRE
的组合来设置锁,因为这两个操作不是原子的。 - 解锁时必须确保是锁的持有者才能解锁,可以通过 Lua 脚本来原子性地检查和删除锁。
- 设置合理的锁超时时间,防止因为某些原因导致锁没有被释放。
通过以上的方法,可以在 Redis 中实现一个简单但是相对安全的分布式锁。