redis存储什么类型的数据?redis分布式锁怎么实现的?

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: redis存储什么类型的数据?redis分布式锁怎么实现的?

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),这个命令只有在键不存在时才会设置键值。

「基本实现步骤」

  1. 「加锁」 使用 SETNX 设置一个锁键,值可以是一个唯一标识(如 UUID),这样可以避免锁被其他进程释放。
  2. 「设置超时时间」 为了避免死锁的情况,需要为锁设置一个超时时间,可以使用 EXPIRE 命令来实现。
  3. 「释放锁」 当任务执行完成后,通过发送 DEL 命令来释放锁。为了确保锁的安全性,需要先检查锁的值是否是设置时的唯一标识,只有匹配时才执行删除操作。

「改进的实现」

在 Redis 2.6.12 版本之后,可以使用 SET 命令的 NXPX 参数来原子性地设置锁键和超时时间,这样可以减少网络通信次数,提高效率。

SET lock_key unique_value NX PX 30000

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

「安全性考虑」

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

  • 锁必须是互斥的,同一时间只有一个客户端能持有锁。
  • 不要使用 SETNXEXPIRE 的组合来设置锁,因为这两个操作不是原子的。
  • 解锁时必须确保是锁的持有者才能解锁,可以通过 Lua 脚本来原子性地检查和删除锁。
  • 设置合理的锁超时时间,防止因为某些原因导致锁没有被释放。

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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
11天前
|
NoSQL Java 中间件
【📕分布式锁通关指南 02】基于Redis实现的分布式锁
本文介绍了从单机锁到分布式锁的演变,重点探讨了使用Redis实现分布式锁的方法。分布式锁用于控制分布式系统中多个实例对共享资源的同步访问,需满足互斥性、可重入性、锁超时防死锁和锁释放正确防误删等特性。文章通过具体示例展示了如何利用Redis的`setnx`命令实现加锁,并分析了简化版分布式锁存在的问题,如锁超时和误删。为了解决这些问题,文中提出了设置锁过期时间和在解锁前验证持有锁的线程身份的优化方案。最后指出,尽管当前设计已解决部分问题,但仍存在进一步优化的空间,将在后续章节继续探讨。
446 131
【📕分布式锁通关指南 02】基于Redis实现的分布式锁
|
15天前
|
NoSQL Java Redis
Springboot使用Redis实现分布式锁
通过这些步骤和示例,您可以系统地了解如何在Spring Boot中使用Redis实现分布式锁,并在实际项目中应用。希望这些内容对您的学习和工作有所帮助。
138 83
|
1天前
|
存储 人工智能 固态存储
DeepSeek开源周第五弹之一!3FS:支撑V3/R1模型数据访问的高性能分布式文件系统
3FS是DeepSeek开源的高性能分布式文件系统,专为AI训练和推理任务设计,提供高达6.6 TiB/s的读取吞吐量,支持强一致性保障和通用文件接口,优化AI工作负载。
61 2
DeepSeek开源周第五弹之一!3FS:支撑V3/R1模型数据访问的高性能分布式文件系统
|
10天前
|
缓存 NoSQL 搜索推荐
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
本文介绍了如何通过Lua脚本在Redis中实现分布式锁的原子性操作,避免并发问题。首先讲解了Lua脚本的基本概念及其在Redis中的使用方法,包括通过`eval`指令执行Lua脚本和通过`script load`指令缓存脚本。接着详细展示了如何用Lua脚本实现加锁、解锁及可重入锁的功能,确保同一线程可以多次获取锁而不发生死锁。最后,通过代码示例演示了如何在实际业务中调用这些Lua脚本,确保锁操作的原子性和安全性。
36 6
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
|
23天前
|
缓存 NoSQL 中间件
Redis,分布式缓存演化之路
本文介绍了基于Redis的分布式缓存演化,探讨了分布式锁和缓存一致性问题及其解决方案。首先分析了本地缓存和分布式缓存的区别与优劣,接着深入讲解了分布式远程缓存带来的并发、缓存失效(穿透、雪崩、击穿)等问题及应对策略。文章还详细描述了如何使用Redis实现分布式锁,确保高并发场景下的数据一致性和系统稳定性。最后,通过双写模式和失效模式讨论了缓存一致性问题,并提出了多种解决方案,如引入Canal中间件等。希望这些内容能为读者在设计分布式缓存系统时提供有价值的参考。感谢您的阅读!
112 6
Redis,分布式缓存演化之路
|
3天前
|
缓存 NoSQL 关系型数据库
Redis应用—1.在用户数据里的应用
本文主要介绍了社区电商的业务闭环及Redis缓存架构中遇到的典型生产问题及其解决方案。通过介绍的设计和优化,社区电商平台能够在高并发读取和少量写入的情况下,保持高性能和数据一致性。
Redis应用—1.在用户数据里的应用
|
6天前
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
3天前
|
运维 NoSQL 算法
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
本文深入探讨了基于Redis实现分布式锁时遇到的细节问题及解决方案。首先,针对锁续期问题,提出了通过独立服务、获取锁进程自己续期和异步线程三种方式,并详细介绍了如何利用Lua脚本和守护线程实现自动续期。接着,解决了锁阻塞问题,引入了带超时时间的`tryLock`机制,确保在高并发场景下不会无限等待锁。最后,作为知识扩展,讲解了RedLock算法原理及其在实际业务中的局限性。文章强调,在并发量不高的场景中手写分布式锁可行,但推荐使用更成熟的Redisson框架来实现分布式锁,以保证系统的稳定性和可靠性。
15 0
|
3月前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
196 85