redis分布式锁
2023-09-14 09:12:10 时间
redis 实现分布式锁 高并发下回出现数据错乱 如何解决 1 使用 redis 的setnx Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值 $goods_id = 1; $exists redis->setnx(goods_id,"value"); if(!$exits){ return false; // 如果上面设置redis成功 说明是第一次进来,否则就是第二次 第三次,进来 直接返回false } // 执行逻辑 2 上面的问题 没有释放锁,那么这个商品,就永远没有其他人可以操作了。 解决办法 执行完成后释放锁 try{ $exists redis->setnx(goods_id,"value"); if(!$exits){ return false; // 如果上面设置redis成功 说明是第一次进来,否则就是第二次 第三次,进来 直接返回false } // 执行逻辑 }finally{ $redis->delete(key); } 3. 上面程序问题,加入执行到finally之前,程序挂掉了,那锁还是永久没有被释放 解决办法 设置redis的时候,设置超时时间 并且是原子的 设置值和超时时间一起设置 4.上面程序问题 加入我程序还没执行完成,redis锁设置的超时时间到了 外面等着一堆请求进来,这个时候,当前请求执行完成,我的锁已经自动过期了,我然后把刚刚进来的锁给释放了 相当于释放了别人的锁。这样也许这把锁就永久都用不上,我放了别人的锁,第三个又进来,第二个又放了 第三个的锁 解决办法 只能释放自己的锁 redis设置值得时候,弄一个唯一值作为键值 这样就不会释放到别人的锁了 $value = md5(microtime(); $redis->setnx($key,$value,10); finally{ $value = $redis->get($key) if($value == $value){ $redis->delete(); } } 5 .上面程序还有问题 如何控制我在程序还没有执行完的时候,redis锁不因为redis ttl自动过期 思路 可以启动定时器,在上面过期时间三分之一的时候,补齐时间,比如十秒自动过期 , 定时器检测,当本程序还没执行完,而且到了三秒了,补齐为10s java有个现成的 Redisson php https://github.com/ronnylt/redlock-php
相关文章
- redis的bigkey扫描脚本深入介绍
- Redis在分布式缓存中的应用(redis分布式缓存)
- 拨开红色购物车,Unleash Redis魔力(购物车redis)
- 如何使用Redis实现分布式队列功能(怎么实现redis队列)
- 异构系统间Redis迁移之桥异构鸿沟(异构鸿沟redis迁移)
- 如何在笔记本上安装Redis教程(笔记本安装redis教程)
- 深度理解Redis从源码视角观察(看redis源码的意义)
- 搭建分布式Redis系统的架构图(架构图redis)
- 深入探究Redis,玩转分布式数据库(深入探索redis)
- 云Redis简单易用的极速存储服务(云redis怎么用)
- 华为云Redis清除缓存中垃圾信息,提升性能(华为云redis清理缓存)
- 基于Redis的分布式锁实现方案(分布式锁redis的实现)
- Redis实战打造分布式缓存(分布式缓存redis实战)
- 利用Redis实现分布式缓存(分布式缓存-redis)
- 分布式Redis缓存更新优化表现(分布式redis缓存更新)
- 分布式Redis 为业务提速打开新大门(分布式redis的作用)
- 揭秘如何利用分布式Redis完成数据同步(分布式redis如何同步)
- 使用多表关联从Redis缓存中获取数据(多表关联存redis)
- 基于Redis实现多级评论功能(多级评论redis)
- 多个进程共同使用Redis提升效率(多个进程redis)
- 基于Redis瞬间抢购,实现快速分布式秒杀(基于redis处理秒杀)
- 实现Redis灵活分布式集群多配置法(多redis配置)
- 使用Redis哨兵保障安全验证(redis验证哨兵)
- 解决Redis集群存储空间紧张定期清理数据计划(redis集群清理数据)
- Redis实现有效利用缓存空间(redis 设置缓存大小)
- 利用Redis给视频设置访问密码保护(redis视频访问密码)
- Redis实现的分布式运行逻辑(redis运行逻辑)