栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot中使用Redis实现分布式锁

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot中使用Redis实现分布式锁

Redis实现分布式锁
  • SpringBoot使用Redis实现分布式锁
    • 分布式锁说明
    • SpringBoot中实现
      • maven依赖
      • redis配置
      • java代码

SpringBoot使用Redis实现分布式锁 分布式锁说明

Java中的锁:当多个线程去访问共享数据时,防止一些操作被覆盖(并发问题),这个时候就需要用到抢锁机制,抢到锁的线程才能进行操作,其余线程等待锁释放并抢到锁才能进行操作,例如Sychonized,Lock等。
分布式锁和java中的锁最大的区别在于共享资源是由多个进程去访问,这时候线程之间的锁机制就无法起到作用了,所以就需要引入一些可以被所有服务都能访问的外部服务来让实现锁,例如数据库,Redis,Zookeeper等

SpringBoot中实现 maven依赖

	org.springframework.boot
	spring-boot-starter-data-redis

redis配置
spring.redis.hostName = 地址
spring.redis.port = 6379
spring.redis.password = pwd
spring.redis.enableTransactionSupport = false
java代码
package com.servingcloud.foreign.service.common.util;

import com.alibaba.fastjson.JSON;
import org.apache.commons.lang.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;



@Component
public class RedisUtilExt {

    
    private final static long DEFAULT_TIMEOUT = 30000;
    
    private final static String PWD_KEY = "redis_lock";

    @Resource(
        name = "stringRedisTemplate"
    )
    private RedisTemplate stringRedisTemplate;

    public String getSortStr(Object obj){
        String objStr = JSON.toJSONString(obj);
        return MD5Util.generate(PWD_KEY,"1",objStr);
    }

    
    public boolean getLock(String key){
        //value值为系统当前时间
        if(stringRedisTemplate.opsForValue().setIfAbsent(key,String.valueOf(System.currentTimeMillis()))){
            //设置超时时间 防止死锁
            stringRedisTemplate.expire(key,DEFAULT_TIMEOUT,TimeUnit.MILLISECONDS);
            return true;
        }
        //获取上锁时间 判断锁是否超时,超时则删除key(redis重启会造成重启时间内一些过期的key未被清理),防止死锁
        String valueTime = stringRedisTemplate.opsForValue().get(key);
        if(StringUtils.isNotEmpty(valueTime) && System.currentTimeMillis()-Long.parseLong(valueTime)>DEFAULT_TIMEOUT){
            //释放锁 再次抢锁
            unLock(key);
            return getLock(key);
        }
        return false;
    }

    
    public void unLock(String key){
        stringRedisTemplate.opsForValue().getOperations().delete(key);
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/319079.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号