RedisLock——让 Redis 分布式锁变得简单




1. 项目介绍

该项目主要简化了使用 redis 分布式事务所的操作,实现傻瓜式加锁,释放锁的操作,并优雅的实现了等待锁释放的操作。等待锁释放的过程主要是使用了redis的监听功能,所以在使用该项目前,要确保redis已经开启了key事件监听,即“Ex”。

  • 如何查看 redis 是否已经开启了监听功能?

    登录 redis 后,使用命令 config get notify-keyspace-events 进行查看

github地址:https://github.com/chimmhuang/redislock

码云地址:https://gitee.com/chimmhuang/redislock

欢迎 Start、Fork~

2. 快速使用

2.1 引入 maven 坐标

<dependency>
<groupId>com.github.chimmhuang</groupId>
<artifactId>redislock</artifactId>
<version>1.0.2</version>
</dependency>

2.2 注册 RedisLock

  • 方式一(推荐): 在项目的启动类上添加包扫描的路径
@ComponentScan(basePackages = "com.github.chimmhuang.redislock")
@SpringBootApplication
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
  • 方式二:手动注册相关的 bean
@Configuration
public class RedisConfig { @Bean
public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
} @Bean
public RedisListener redisListener(RedisMessageListenerContainer redisMessageListenerContainer) {
return new RedisListener(redisMessageListenerContainer);
} @Bean
public RedisLock redisLock(RedisTemplate redisTemplate) {
return new RedisLock(redisTemplate);
}
}

2.3 使用

  1. 注入 redisLock
  2. 使用 redisLock.lock(key,expire) 进行加锁
  3. 使用 redisLock.unlock(key) 进行解锁

以下提供一个单元测试的案例(火车站卖票的案例)

@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisListenerTest { @Autowired
private RedisLock redisLock; /** 100张票 */
private static Integer count = 100; @Test
public void ticketTest() throws Exception {
TicketRunnable tr = new TicketRunnable();
// 四个线程对应四个窗口
Thread t1 = new Thread(tr,"窗口A");
Thread t2 = new Thread(tr,"窗口B");
Thread t3 = new Thread(tr,"窗口C");
Thread t4 = new Thread(tr,"窗口D"); t1.start();
t2.start();
t3.start();
t4.start(); Thread.currentThread().join(); } public class TicketRunnable implements Runnable {
@Override
public void run() {
while (count > 0) {
redisLock.lock("ticketLock", 3L);
if (count > 0) {
System.out.println(Thread.currentThread().getName() + "售出第" + (count--) + "张火车票");
}
redisLock.unlock("ticketLock"); try {
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}

3. 参与贡献

非常欢迎你的加入!提一个 Issue 或者提交一个 Pull Request。

目前仅仅是实现了加锁解锁的简单过程,还有其他操作有待完善和测试,如:

-[ ] 在 redis 的集群环境中,需要监听每一个 redis 的 key 事件

-[ ] 在 redis 的主备模式下,可能会存在主备 redis 切换的期间,数据(key)未同步过去问题

4. 联系作者

QQ(Wechat) : 905369866

Email : chimmhuang@163.com

5. 开源协议

MIT Chimm Huang

redis 分布式锁的简单使用的更多相关文章

  1. Redis分布式锁实现简单秒杀功能

    这版秒杀只是解决瞬间访问过高服务器压力过大,请求速度变慢,大大消耗服务器性能的问题. 主要就是在高并发秒杀的场景下,很多人访问时并没有拿到锁,所以直接跳过了.这样就处理了多线程并发问题的同时也保证了服 ...

  2. 单实例redis分布式锁的简单实现

    redis分布式锁的基本功能包括, 同一刻只能有一个人占有锁, 当锁被其他人占用时, 获取者可以等待他人释放锁, 此外锁本身必须能超时自动释放. 直接上java代码, 如下: package com. ...

  3. 自己写了个简单的redis分布式锁【我】

    自己写了个简单的redis分布式锁 [注意:此锁需要在每次使用前都创建对象,也就是要在线程内每次都创建对象后使用] package redis; import java.util.Collection ...

  4. .NetCore使用Redis,StackExchange.Redis队列,发布与订阅,分布式锁的简单使用

    环境:之前一直是使用serverStack.Redis的客服端,今天来使用一下StackExchange.Redis(个人感觉更加的人性化一些,也是免费的,性能也不会差太多),版本为StackExch ...

  5. 利用redis分布式锁的功能来实现定时器的分布式

    文章来源于我的 iteye blog http://ak478288.iteye.com/blog/1898190 以前为部门内部开发过一个定时器程序,这个定时器很简单,就是配置quartz,来实现定 ...

  6. Redis分布式锁

    Redis分布式锁 分布式锁是许多环境中非常有用的原语,其中不同的进程必须以相互排斥的方式与共享资源一起运行. 有许多图书馆和博客文章描述了如何使用Redis实现DLM(分布式锁管理器),但是每个库都 ...

  7. redis分布式锁和消息队列

    最近博主在看redis的时候发现了两种redis使用方式,与之前redis作为缓存不同,利用的是redis可设置key的有效时间和redis的BRPOP命令. 分布式锁 由于目前一些编程语言,如PHP ...

  8. redis咋么实现分布式锁,redis分布式锁的实现方式,redis做分布式锁 积极正义的少年

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

  9. Redis分布式锁的正确实现方式

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

随机推荐

  1. Anaconda3中的Jupyter notebook添加目录插件

    学习python和人工智能的相关课程时安装了Anaconda3,想在Jupyter notebook中归纳整理笔记,为了方便日后查找想安装目录(Table of Contents, TOC)插件,查找 ...

  2. React:redux+router4搭建应用骨架

    可能是短期内关于react的对后一篇笔记.假设读者对redux和router4有基本了解. 缘由: 现在网上很多关于react+redux的文章都是沿用传统的文件组织形式,即: |--componen ...

  3. Js运算符和逻辑结构

    1.运算符 (1)赋值运算符 =  +=  -=  *=  /=  %= (2)三目运算符 一目  一个运算符连接一个数据   --  ++  ! 二目  一个运算符连接两个数据   + - * / ...

  4. Django之forms.Form

    django中的form组件提供了普通表单提交及验证数据的主要功能: 1.    生成页面可用的HTML标签 2.    对用户提交的数据进行验证 3.    可保留用户上次提交的数据 django中 ...

  5. java web基础

    WEB基础 C/S:即服务器-客服机(Client-Server)结构.C/S结构通常采用两层结构,服务器负责数据的管理,客户机负责完成与用户的交互任务.客户通过局域网与服务器相连,接受用户的请求,并 ...

  6. MYSQL的DOUBLE WRITE双写

    期待未来超高速大容量的固态硬盘普及时,只需要CHECKPOINT,而不再需要各种各样的BUFFER,CACHE了 DOUBLE WRITE 在InnoDB将BP中的Dirty Page刷(flush) ...

  7. java遇到的error解决

    解决Cannot change version of project facet Dynamic web module to 2.5 maven 不能设置为web3.0人解决方法 http://www ...

  8. mysql全方位知识大盘点

    一.mysql都有哪些存储引擎?各自的特点是什么? 引擎 事务 锁 主键 索引 外键 数据结构 适用场景 InnoDB 支持 行锁.表锁 必须有主键,没有设置会自动创建 主键索引和数据在一起,其他索引 ...

  9. Cube-UI组件中create-api 模块的基本使用

    1.这个模块的功能是什么? 官方文档是这样解释的: 该模块默认暴露出一个 createAPI 函数,可以实现以 API 的形式调用自定义组件.并且既可以在 Vue 实例上下文中调用,也可以在普通 js ...

  10. git简单的使用步骤

    Git介绍 Git是分布式版本控制系统 集中式VS分布式,SVN VS Git 1)SVN和Git主要的区别在于历史版本维护的位置 2)这两个工具主要的区别在于历史版本维护的位置Git本地仓库包含代码 ...