Redis分布式锁的核心是通过SETNX命令实现加锁:SET key value NX PX 30000,其中NX表示只有key不存在时才设置,PX设置30秒过期时间。解锁时使用Lua脚本确保原子性:if redis.call('get',KEYS[1])==ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end。查看锁状态用redis-cli命令:redis-cli get lock_key,检查是否持有锁;用redis-cli ttl lock_key查看剩余时间。代码示例:public boolean unlock(String key, String value) { String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; ...}
Redis锁加锁解锁完整流程
加锁:String result = jedis.set(lockKey, lockValue, "NX", "PX", expireTime);解锁:使用Lua脚本原子释放:local lockedValue = redis.call('get', KEYS[1]);if(ARGV[1] == lockedValue) then redis.call('del', KEYS[1]);return 1;end;return 0;查看技巧:用redis-cli monitor命令实时监控锁操作;keys * | grep lock_key查看所有锁键;type lock_key确认类型为string;info keyspace查看db中键数量和过期统计。
Redis锁常见问题与查看方法
解锁查看技巧:1. redis-cli get mylock 检查锁值是否匹配线程ID。2. redis-cli ttl mylock 查看锁剩余TTL,避免死锁。3. redis-cli scan 0 MATCH '*lock*' 获取所有锁键扫描。4. 使用redis-cli --scan --pattern 'lock:*' 安全扫描。5. 监控:redis-cli monitor | grep setnx 观察加锁行为。确保加锁带唯一value,解锁校验value一致。
Redlock算法解锁验证
Redlock多节点锁解锁:对多数节点执行del。查看:for每个节点redis-cli -h host get lock:key 检查一致性。脚本:#!/bin/bash redis-cli -p 6379 get lockkey && redis-cli -p 6380 get lockkey。TTL检查脚本:redis-cli ttl lockkey >0 && echo "alive" || echo "expired"。
实际生产环境锁调试
解锁查看命令合集:redis-cli keys "*lock*" | xargs -n1 redis-cli ttl 显示所有锁TTL;redis-cli --bigkeys 检查大锁占用;慢查询日志scan锁操作。代码中log.info("锁剩余时间: " + jedis.ttl(key));异常时强制del但检查value。
锁可视化工具
RedisInsight查看锁:连接Redis,键浏览器搜索lock,显示value、TTL;实时命令追踪SETNX/DEL。rdcli脚本自动化:echo "get $1" | redis-cli;if [ $? -eq 0 ]; then echo "锁存在"; fi。
FAQ
Q: 如何快速检查Redis锁是否存在?
A: 用redis-cli get lock_key,如果返回nil则无锁。
Q: 锁过期后怎么查看?
A: redis-cli ttl lock_key 返回-2表示不存在,-1无过期。
Q: Lua脚本解锁为什么必要?
A: 防止解锁时锁已过期被其他线程持有导致误删。
Q: 死锁怎么排查?
A: keys *lock* 检查所有锁,ttl确认无过期,手动del。