redis分布式锁如何实现


redis分布式锁如何实现

redis分布式锁:
1、实现原理
利用redis中的set命令来实现分布式锁。

从Redis 2.6.12版本开始,set可以使用下列参数:

SET KEY VALUE [EX seconds] [PX milliseconds] [NX|XX]    

EX second :设置键的过期时间为second秒。 SET key value EX second效果等同于SETEX key second value 。
PX millisecond :设置键的过期时间为millisecond毫秒。 SET key value PX millisecond效果等同于PSETEX key millisecond value 。
NX :只在键不存在时,才对键进行设置操作。 SET key value NX效果等同于SETNX key value 。
XX :只在键已经存在时,才对键进行设置操作。
返回值:
SET 在设置操作成功完成时,才返回OK 。
如果设置了NX或者XX ,但因为条件没达到而造成设置操作未执行,那么命令返回空批量回复(NULL Bulk Reply)。
命令:
> SET key value EX ttl NX

大致思想是:
(a)SET lock currentTime+expireTime EX 600 NX,使用set设置lock值,并设置过期时间为600秒,如果成功,则获取锁;

(b)获取锁后,如果该节点掉线,则到过期时间ock值自动失效;
(c)释放锁时,使用del删除lock键值;
使用redis单机来做分布式锁服务,可能会出现单点问题,导致服务可用性差,因此在服务稳定性要求高的场合,官方建议使用redis集群(例如5台,成功请求锁超过3台就认为获取锁),来实现redis分布式锁。详见RedLock。
2、优点
性能高,redis可持久化,也能保证数据不易丢失;
redis集群方式提高稳定性。
3、缺点
使用redis主从切换时可能丢失部分数据。
4、开源实现
python版本的开源实现:python-redis-lock。

Metronic Bootstrap后台模板 Metronic Bootstrap后台模板

Metronic是一套精美的响应式后台管理模板,基于强大的Twitter Bootstrap框架实现。Metronic拥有简洁优雅的Metro UI风格界面,自适应屏幕分辨率大小,兼容PC端和手机移动端。全套模板,包含仪表盘、侧边栏菜单、布局宣传片、电子邮件模板、UI特性、按钮、标签、表格布局、表单组件、多文件上传、悬浮窗文件上传、时间表、博客、新闻、关于我们、联系我们、日历、用户配置文件、锁屏、

Metronic Bootstrap后台模板 275 查看详情 Metronic Bootstrap后台模板

redis分布式锁的具体实现方式:

加锁和解锁的方式:

private static final String LOCK_SUCCESS = "OK";
    private static final String SET_IF_NOT_EXIST = "NX";
    private static final String SET_WITH_EXPIRE_TIME = "PX";
    private static final Long RELEASE_SUCCESS = 1L; 

    /**
     * 尝试获取分布式锁
     * @param lockKey 锁
     * @param requestId 请求标识
     * @param expireTime 超期时间
     * @return 是否获取成功
     */
    public Boolean tryGetDistributedLock(String lockKey, String requestId, int expireTime) {
        Jedis jedis = this.jedisPool.getResource();
        String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
        if (LOCK_SUCCESS.equals(result)) {
            return true;
        }
        return false;

    }

     /**
     * 释放分布式锁
     * @param lockKey 锁
     * @param requestId 请求标识
     * @return 是否释放成功
     */
    public Boolean releaseDistributedLock(String lockKey, String requestId) {
        Jedis jedis = this.jedisPool.getResource();
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
        if (RELEASE_SUCCESS.equals(result)) {
            return true;
        }
        return false;

    }

2、具体的应用 

try{
String requestId = UUID.randomUUID().toString();
Boolean flag = tryGetDistributedLock(lock,requestId,1000);
int n = 0;
while(!flag){
      //如果没有获取锁,可以尝试下一个lock,如果都没有,则尝试 n 次,退出
     ...
     if(n++>5){ throw new Exception("尝试获取锁失败");}  
     ...  
}
if(!flag){
throw new Exception("尝试获取锁失败");
}
}catch(){
}finally{
    releaseDistributedLock(lock,requestId);
}

更多Redis相关知识,请访问Redis使用教程栏目!

以上就是redis分布式锁如何实现的详细内容,更多请关注其它相关文章!


# 分片  # 陈村seo报价  # 宁波商场装饰网站建设  # 汉中公司网站优化优势分析  # 新疆seo快速排名  # 奉贤区推广网站建设概况  # 环保设备网站seo优化渠道  # 北辰seo优化热线电话  # 可信的泉州seo排名  # seo公司就帮火星12  # 腾龙小说网站建设  # redis分布式锁如何实现  # 协同工作  # 文件上传  # 开源  # 单点  # 来实现  # 才对  # 只在  # 时间为  # 如何实现 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 铁路12306入口 铁路12306官网版入口登录网址  Excel如何快速合并单元格内容_Excel文本合并与函数操作技巧  《红果免费短剧》下载观看方法  win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】  Cassandra中复合主键、二级索引与ORDER BY排序的限制与解决方案  12306不能订票的时间段是固定的吗? | 节假日购票时间有无变化  《百度畅听版》关闭兴趣推荐方法  win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】  《合金装备4》有望推出重制版!制作人发话了  稻壳阅读器官方直达网址链接 稻壳阅读器文档阅读平台主页资源入口  word文档中的分隔符有哪些不同类型和用途_Word分隔符类型与用途方法  虫虫助手如何更新游戏  解决Windows上Composer PATH变量冲突导致的命令无法识别问题  在VS Code中进行数据科学和机器学习开发  《崩坏:星穹铁道》3.6版本异相仲裁打法及配队推荐  传统曲艺莲花落的表演形式是  mysql如何限制远程访问_mysql远程访问限制方法  Mac如何开启画中画模式_Mac Safari浏览器视频画中画功能  LocoySpider如何批量采集电商商品_LocoySpider电商采集的模板应用  在Django中动态检查模型关联:一种灵活的解决方案  百度地图离线地图无法加载如何解决 百度地图离线地图加载优化方法  QQ网页版入口导航 QQ网页版在线访问通道  冬季去寒冷地区旅游,以下哪种做法有助于缓解冻伤  汽水音乐网页端访问 汽水音乐官方网页直达  C++ cast类型转换总结_C++ reinterpret_cast与const_cast的使用  如何在 WordPress 前端实现内容提交:古腾堡编辑器的替代方案与实践  顺丰官方查单号入口 顺丰快递单号查询官网入口  《三角洲行动》战斗步枪与机枪类改装代码分享  《大学搜题酱》官网地址登录  mysql怎么查询数据_mysql基础查询语句使用教程  WooCommerce 新客户订单自动添加管理员备注教程  PHP页面重载后变量状态保持:实现用户档案连续浏览的教程  解决VS Code中Python版本冲突与输出异常的指南  百度浏览器无法安装扩展程序_百度浏览器插件安装失败原因解析  从HTML表单获取逗号分隔值并转换为NumPy数组进行预测  在PHP环境中正确加载HTML资源:CSS样式与图片路径指南  《腾讯相册管家》注销账号方法  《土豆雅思》修改密码方法  RxJS中如何高效地在一个函数内处理和合并多个数据集合  《海豚家》注销账号方法  哈尔滨城市通昵称修改方法  三星A55应用闪退排查步骤_Samsung A55稳定性优化技巧  漫蛙manwa官网浏览入口_漫蛙漫画网页版访问链接  search中maxlength属性用法解析  126邮箱网页在线登录2025_126邮箱网页版入口官方地址  Yandex俄罗斯搜索引擎官网入口 Yandex网页端直接访问  济南公交卡手机充值指南  响应式设计中动态背景颜色条的实现指南  申通快递查询 申通物流快递单实时查询入口  感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30 

 2019-06-29

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.