在分布式系统中,经常会出现需要竞争同一资源的情况,使用redis可以实现分布式锁。

前提:redis集群已经整合项目,并且可以直接注入JedisCluster使用:

    @Autowiredprivate JedisCluster jedisCluster;

1. 新建RedisLockManger分布式锁管理器,并且如上注入 JedisCluster :

package com.jarfk.util.redis;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.JedisCluster;import javax.annotation.PostConstruct;
import java.util.concurrent.TimeUnit;/*** redis集群分布式锁管理器,支持对单个资源加锁解锁,或给一批资源的批量加锁及解锁* Created by Administrator on 2017/10/12 0012.*/
@Component
public class RedisLockManger {private static final Logger LOGGER = LoggerFactory.getLogger(RedisLockManger.class);//设置3秒过期private static final int DEFAULT_SINGLE_EXPIRE_TIME = 3;//    private static final int DEFAULT_BATCH_EXPIRE_TIME = 6;//static的变量无法注解
    @Autowiredprivate JedisCluster jc;private static RedisLockManger lockManger;public RedisLockManger() {}@PostConstructprivate void init() {lockManger = this;lockManger.jc = this.jc;}/*** 获取锁 如果锁可用   立即返回true,  否则立即返回false,作为非阻塞式锁使用* @param key* @return*/public boolean tryLock(String key/* , String value*/) {try {return tryLock(key, key, 0L, null);} catch (InterruptedException e) {e.printStackTrace();}return false;}/*** 锁在给定的等待时间内空闲,则获取锁成功 返回true, 否则返回false,作为阻塞式锁使用* @param key 锁键* @param value 被谁锁定* @param timeout 尝试获取锁时长,建议传递500,结合实践单位,则可表示500毫秒* @param unit,建议传递TimeUnit.MILLISECONDS* @return* @throws InterruptedException*/public boolean tryLock(String key , String value , long timeout , TimeUnit unit) throws InterruptedException {//纳秒long begin = System.nanoTime();do {//LOGGER.debug("{}尝试获得{}的锁.", value, key);Long i = lockManger.jc.setnx(key, value);if (i == 1) {lockManger.jc.expire(key, DEFAULT_SINGLE_EXPIRE_TIME);LOGGER.debug(value + "-成功获取{}的锁,设置锁过期时间为{}秒 ", key, DEFAULT_SINGLE_EXPIRE_TIME);return true;} else {// 存在锁 ,但可能获取不到,原因是获取的一刹那间
//                String desc = lockManger.jc.get(key);
//                LOGGER.error("{}正被{}锁定.", key, desc);} if (timeout == 0) {break;}//在其睡眠的期间,锁可能被解,也可能又被他人占用,但会尝试继续获取锁直到指定的时间Thread.sleep(100);} while ((System.nanoTime() - begin) < unit.toNanos(timeout));//因超时没有获得锁return false;}/*** 释放单个锁* @param key 锁键*/public void unLock(String key/*, String value*/) {lockManger.jc.del(key);LOGGER.debug("{}锁被{}释放 .", key, key);}
}

2. 使用示例:

首先在需要加锁的地方注入分布式锁管理器:

    @Autowiredprivate RedisLockManger redisLock;

然后调用即可,如:

        if (redisLock.tryLock("statusCheck")) { //此处代码是锁上的logger.debug("-----------------------:10秒执行一次!每次只有一个程序运行");//释放锁,正常情况下,此处代码要注释掉,以免锁被释放,需要释放时可以根据自己逻辑的需要 //redisLock.unLock("statusCheck");}

首先注入需要的

基于redis集群实现的分布式锁,可用于秒杀,定时器。相关推荐

  1. redis 集群搭建_Redis分布式缓存分布式集群搭建

    当你试图解决一个你不理解的问题时,复杂化就产成了.-Andy Boothe Redis集群安装部署 Redis是一个运行在内存的非关系型数据库,因为其速度快(效率高),支持数据的持久化(安全),事务操 ...

  2. 搭建redis集群-(伪分布式)

    安装redis #关闭防火墙并且安装iptables(防火墙) 并在防火墙中添加规则,也可以用firewalld.service 防火墙 #如果是用firewalld.service 的防火墙的话下面 ...

  3. 基于redis集群的分布式锁redlock

    Redis 作者为了解决因为主备切换.脑裂导致 Redis 单集群分布式锁不安全的问题,提出了 redlock 算法,下面是针对 文章 的翻译和一些自我理解. 一.安全性和可用性保证 用三个属性来建模 ...

  4. 基于Redis(setnx)实现分布式锁

    什么是分布式锁? 分布式锁是控制分布式系统或不同系统之间共同访问共享资源的一种锁实现,如果不同的系统或同一个系统的不同主机之间共享了某个资源时,往往需要互斥来防止彼此干扰来保证一致性. 分布式锁需要具 ...

  5. redis集群连接 java_Redis分布式集群和直连的Java客户端调用方式详解

    jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式 ...

  6. Redlock——Redis集群分布式锁

    欢迎关注方志朋的博客,回复"666"获面试宝典 前言 分布式锁是一种非常有用的技术手段.实现高效的分布式锁有三个属性需要考虑: 安全属性:互斥,不管什么时候,只有一个客户端持有锁 ...

  7. lua脚本在redis集群中执行报错--Lua script attempted to access a non local key in a cluster node...

    EVAL.EVALSHA命令 Redis从2.6.0版本开始提供了eval命令,通过内置的Lua解释器,可以让用户执行一段Lua脚本并返回数据.因为Redis单线程模型的特点,可以保证多个命令的原子性 ...

  8. Redis集群案例与场景分析

    1.背景 Redis的出现确实大大地提高系统大并发能力支撑的可能性,转眼间Redis的最新版本已经是3.X版本了,但我们的系统依然继续跑着2.8,并很好地支撑着我们当前每天5亿访问量的应用系统.想当年 ...

  9. Redis 集群规范(中文稿)(MOVED错误码及ASK错误码

    引言? 这个文档是正在开发中的 Redis 集群功能的规范(specification)文档,文档分为两个部分: 第一部分介绍目前已经在 unstable 分支中实现了的那些功能. 第二部分介绍目前仍 ...

最新文章

  1. 哲学是什么?(选自:苏菲的世界)
  2. Hadoop学习笔记—7.计数器与自定义计数器
  3. 数据结构_顺序栈的代码实践
  4. C# 中的委托和事件
  5. centos7 安装 openssl
  6. leetcode算法题--数组中出现次数超过一半的数字
  7. 【.NET 遇上 GraphQL】 ChilliCream 平台介绍
  8. jQuery 学习笔记(三)——事件与应用
  9. PID控制器改进笔记之五:改进PID控制器之串级设定
  10. 云计算体系结构中soa构建层_云计算的服务模式及技术结构
  11. 报错 插入更新_CentOS中linux网络报错 connect: Network is unreachable问题
  12. 声智科技完成B轮2亿元融资,AI方案遍布百度小米华为阿里产品
  13. JavaScript中尺寸、坐标
  14. Thinkphp5中session用法
  15. AutoCAD2011官方原版软件下载
  16. python aes加密_在不到5分钟的时间内用python编码aes128位加密
  17. 学习进度2012-6-26(动态规划算法、Prim算法、Dijkstra算法)
  18. oracle让电脑变卡以及解决方法
  19. 网易互联网,网易互娱 2021届校招内推开始啦
  20. 妈妈不在身边的第X个母亲节,用AI找回她的美好时光

热门文章

  1. 是否允许此网站打开你计算机上的程序
  2. c语言游戏角色建立,(c语言)游戏中由人物各种信息组成的结构体
  3. grpc python stream_grpc| python 实战 grpc【h】
  4. python read函数参数_最新Pandas.read_excel()全参数详解(案例实操,如何利用python导入excel)...
  5. 计算机系统的组成一般不包括,建筑设备监控子系统组成一般不包括( )A.中央计算机系统B.布线系统C.DDCD.各类传感器及执 - 作业在线问答...
  6. 服务器系统是指什么,服务器操作系统指的是什么
  7. linux 内存 面试,怎么应付面试问了解Linux内存管理吗?
  8. webbrowser控件 加载为空白_深入学习SAP UI5框架代码系列之一:UI5 Module的懒加载机制...
  9. creator html富文本_小程序之HTML富文本解析
  10. numeric比较大小 数据库_Liquibase 数据库版本管理工具:3. changeSet 变更集详解