Redis有哪些淘汰策略?分布式锁的实现原理是什么?
2 个回答
只有行动才能说明一切。罗云海## Redis 分布式锁的实现原理 ### 作用 - 在分布式系统中保证同一时间只有一个进程或线程执行特定代码段。 - 用于保证数据一致性,避免并发冲突。 ### 加锁原理 - 利用 Redis 的原子命令实现互斥。 - 最简单方式是使用 `SETNX`:只有 key 不存在时才设置成功,第一个客户端获得锁,其他客户端获取失败。 - 为避免持锁进程崩溃导致死锁,需要为锁设置过期时间。 - Redis 2.6.12 之后可使用 `SET key value NX PX 30000`,将“判断不存在、写入、设置过期时间”作为一个原子操作完成: ```redis SET resource_name my_random_value NX PX 30000 ``` - `NX`:key 不存在时才加锁成功。 - `PX`:设置过期时间,单位毫秒,防止客户端异常退出后锁长期不释放。 - `my_random_value`:应使用随机唯一值,标识锁的持有者。 ### 解锁原理 - 解锁时必须先判断当前客户端是否为锁的持有者,不能直接删除 key,避免误删其他客户端的锁。 - 使用 Lua 脚本保证“比较 value”和“删除 key”两个操作原子执行: ```lua if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end ``` 通过 `EVAL` 执行: ```redis EVAL 'if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end' 1 resource_name my_random_value ``` ### 基础方案的不足 - 业务还未执行完,锁可能已经过期释放。 - 锁默认不可重入。 - 获取锁失败时通常需要轮询,会消耗 CPU,缺少通知机制。 ### 生产实践 - 生产环境通常建议使用成熟的分布式锁类库,例如 Java 生态中的 Redisson。 - Redisson 基于 Redis 原子操作实现分布式锁,封装了加锁、解锁等能力,并提供更完善的锁机制。发布于 2026-10-28 09:09 •IP属地 宁夏举报评论收藏
优先考虑那些先考虑你的人毒斗罗## 作用 分布式锁用于在分布式系统中保证同一时间只有一个进程或线程执行特定代码段,从而实现对共享资源的互斥访问。 ## 原理 ### 1. 基于 SETNX 的基本实现 - Redis 可通过原子命令实现分布式锁。 - `SETNX` 的含义是:当 key 不存在时才设置 value。第一个成功设置 key 的客户端获得锁,其他客户端再设置时会失败。 - 为避免持锁进程崩溃后锁一直无法释放,需要为锁设置过期时间。早期通常结合 `EXPIRE` 命令实现,但这两个命令不是一个原子操作。 - Redis 2.6.12 之后,可以直接使用 `SET` 的 `NX` 和过期时间选项,原子地完成加锁: ```redis SET resource_name my_random_value NX PX 30000 ``` 参数含义: - `NX`:key 不存在时才设置成功,用于保证互斥。 - `PX 30000`:设置 30000 毫秒过期时间,防止持锁客户端异常退出后发生死锁。 - `my_random_value`:应使用随机值,用来标识锁的持有者。 ### 2. 释放锁 释放锁时不能直接删除 key,因为可能误删其他客户端持有的锁。必须先判断 value 是否等于当前客户端生成的随机值,只有锁的持有者才能删除。 由于“判断 value”和“删除 key”需要保证原子性,通常使用 Lua 脚本: ```lua if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end ``` 通过 `EVAL` 执行: ```redis EVAL 'if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end' 1 resource_name my_random_value ``` ### 3. 简单实现的不足 该方案存在以下问题: - 锁可能在业务事务未完成时过期。 - 不支持可重入锁。 - 没有通知机制,未获得锁的客户端只能轮询抢占,可能消耗较多 CPU。 ### 4. Redisson 实现 生产环境可使用封装好的 Redis 分布式锁库,例如 Redisson。它通过 Redis 的原子操作实现锁,基本使用方式为: ```java RLock lock = redisson.getLock("myLock"); try { lock.lock(); // 执行需要互斥保护的临界区代码 } finally { lock.unlock(); } ``` 其特点包括: - 基于 Redis,锁操作性能较高。 - 提供较易用的 API。 - 在节点故障、分区等场景下提供更高可靠性。 网页未介绍 Redis 的具体淘汰策略,只讲解了分布式锁的实现方式。发布于 2026-10-28 03:47 •IP属地 贵州举报评论收藏
公众号进入网站体验更佳

