redis会发生死锁问题吗


redis会发生死锁问题吗

就分布式锁而言,一个常用的问题就是如果一个服务setnx成功了,但是在解锁的时候如果发生了宕机或者一些特殊因素,导致无法解锁,那么其他服务将陷入死锁的状态。所以,我们在用 setnx 的同时想着去用 expire 指令对锁进行一个过期操作, 从指令可以看出 setnx 和expire指令是分开的,如果在这中间的空隙过程中如果有特殊因素导致指令无法继续,也会导致死锁的产生。

解决方法:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
 
@Component
public class RedisLock {
 
    Logger logger = LoggerFactory.getLogger(this.getClass());
 
    @Autowired
    private StringRedisTemplate redisTemplate;
 
    /**
     * 加锁
     * @param key   
     * @param value 当前时间 + 超时时间
     * @return
     */
    public boolean lock(String key, String value) {
    
        if (redisTemplate.opsForValue().setIfAbsent(key, value)) {     
            // 这个其实就是setnx命令,只不过在j*a这边稍有变化,返回的是boolean
            // 设置个过期时间,当然如果在这中间的空隙过程中如果有特殊因素导致指令无法继续,也会导致死锁的产生,如果死锁出现,则后续代码会处理
            redisTemplate.expire(key, lockTime, TimeUnit.SECONDS);
            return true;
        }
 
        // 避免死锁,且只让一个线程拿到锁
        String currentValue = redisTemplate.opsForValue().get(key);
        // 如果锁过期了
        if (!StringUtils.isEmpty(currentValue) && Long.parseLong(currentValue) < System.currentTimeMillis()) {
            //获取上一个锁的时间
            String oldValues = redisTemplate.opsForValue().getAndSet(key, value);
 
            /*
               只会让一个线程拿到锁
               如果旧的value和currentValue相等,只会有一个线程达成条件,因为第二个线程拿到的oldValue已经和currentValue不一样了
             */
            if (!StringUtils.isEmpty(oldValues) && oldValues.equals(currentValue)) {
                return true;
            }
        }
        return false;
    }
 
 
    /**
     * 解锁
     * @param key
     * @param value
     */
    public void unlock(String key, String value) {
        try {
            String currentValue = redisTemplate.opsForValue().get(key);
            if (!StringUtils.isEmpty(currentValue) && currentValue.equals(value)) {
                redisTemplate.opsForValue().getOperations().delete(key);
            }
        } catch (Exception e) {
            logger.error("redis分布式锁解锁异常,{}", e);
        }
    }
}

调用:

Kotlin Android 中文开发帮助文档 PDF版 Kotlin Android 中文开发帮助文档 PDF版

这本书并不是一本语言参考书,但它是一个Android开发者去学习Kotlin并且使用在自己项目中的一个工具。我会通过使用一些语言特性和有趣的工具和库来解决很多我们在日常生活当中都会遇到的典型问题。 这本书是非常具有实践性的,所以我建议你在电脑面前跟着我的例子和代码实践。无论何时你都可以在有一些想法的时候深入到实践中去。 这本书适合你吗? 写这本书是为了帮助那些有兴趣 使用Kotlin语言来进行开发的Android开发者。 如果你符合下面这些情况,那这本书是适合你的: 你有相关Android开发和Andro

Kotlin Android 中文开发帮助文档 PDF版 11 查看详情 Kotlin Android 中文开发帮助文档 PDF版
 //加锁
    long time = System.currentTimeMillis() + 1000 * lockTime //超时时间:10秒,最好设为常量
 
    boolean isLock = redisLock.lock(...keyName, String.valueOf(time));
    if(!isLock){
        throw new RuntimeException("系统正忙");
    }
    
    // doSomething...
    
    
    //解锁
    redisLock.unlock(...keyName, String.valueOf(time));

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

以上就是redis会发生死锁问题吗的详细内容,更多请关注其它相关文章!


# 死锁  # 重庆seo助手怎么选用  # 的是  # 加锁  # 过程中  # 如何使用  # 在这  # 也会  # 帮助文档  # 解锁  # 这本书  # redis会发生死锁吗  # 上海网站推广团队招聘  # 洪梅东莞网站推广  # 图文形式营销推广怎么做  # 市管局网站建设工作总结  # 江干区seo优化方案  # 运城网站建设常用渠道  # 蔡甸区网站建设  # 金华大型网站推广  # 软文营销推广模板图片高清 


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


相关推荐: 微信客户端怎么查看二维码_微信客户端个人二维码查看方法  风车动漫官网首页入口登录 风车动漫在线观看正版地址  精通VS Code多光标编辑以实现闪电般快速的修改  Git命令与VS Code UI操作的对应关系解析  TikTok网页版实时观看入口 TikTok网页版短视频在线浏览  包子漫画在线观看入口 包子漫画网正版全集链接  抖音如何进行蓝V认证 抖音企业号申请所需资料与流程  Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南  批改网官网首页登录 批改网学生用户登录入口  PDF如何批量加注释_PDF多文件批注高亮操作教程  如何在CSS中清除浮动解决背景颜色不包裹内容问题_clear after技巧  J*a列表元素格式化输出教程  米侠浏览器插件无法启用怎么办 米侠浏览器扩展兼容性修复  优化 WooCommerce 产品价格显示与自定义短代码集成  Teambition网盘如何共享文件  Flask 应用中图片动态更新与上传:实现客户端定时刷新与服务器端文件管理  《下一站江湖2》武器获取方法  realme 10 Pro息屏方案_realme 10 Pro省电策略  银信通自动开通原因揭秘  如何在CSS中实现盒模型多列间距_grid-gap与padding结合  京东快递物流信息不更新怎么办_物流停滞原因与处理方法  《绿竹漫游》关闭消息通知方法  CSS动画如何实现图标旋转并放大_transform rotate scale @keyframes实现  OpenWeatherMap API:通过城市名称获取天气预报数据指南  火柴人战争网页版在线玩  SQL聚合查询、联接与筛选:GROUP BY 子句的正确使用与常见陷阱  海棠阅读网页版_进入海棠网页版在线阅读中心  Python csv 模块处理非字符串数据:列表写入 CSV 文件的机制解析  Word如何将文字快速转成表格 Word文本转换成表格功能使用技巧【效率】  126邮箱网页在线登录2025_126邮箱网页版入口官方地址  晓晓优选app支付宝绑定方法  5G和6G的连接密度有什么区别 6G每平方公里能连接多少设备  Lar*el Dusk 测试中管理浏览器权限:以剪贴板访问为例  谷歌邮箱怎么换绑定邮箱Gmail安全备份邮箱修改方法  使用TinyButStrong生成HTML并结合Dompdf创建PDF教程  支付宝网页版在线入口 支付宝官网电脑登录入口  多多买菜门店端app订单查看方法  鲨鱼剧场app金币获取方法  顺丰快递单号查询寄件人 顺丰寄件人查询入口  《微信》视频号原创声明开启方法  漫蛙漫画直连入口 _ manwa官方备用入口实时检测  C++怎么实现一个红黑树_C++高级数据结构与平衡二叉搜索树  Yandex无需登录畅游 俄罗斯搜索引擎最新官网指南  POKI小游戏在线免费入口链接 POKI小游戏无下载秒玩玩  雨课堂官网在线登录 网页版雨课堂登录链接  使用jQuery精确检测除指定元素外任意位置的点击事件  Animex动漫社社登录官网 Animex动漫社资源社入口直达  《下一站江湖2》心法融合技巧  小米civi如何设置锁屏时间  tiktok国际版入口_tiktok官网网页版链接 

 2019-06-28

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

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

点击免费数据支持

提交您的需求,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.