redis锁
1.引入依赖:
<!--使用redis客户端需要用到的包 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.4.3</version> </dependency>
2.连接redis:
package com.karat.cn.redis; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; /** * 客户端连接redis * @author 开发 * */ public class RedisManager { private static JedisPool jedisPool; static { JedisPoolConfig jedisPoolConfig=new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(20);//最大连接数, 默认8个 jedisPoolConfig.setMaxIdle(10);//最小空闲连接数, 默认0 jedisPool=new JedisPool(jedisPoolConfig, "47.107.121.215",6379); } public static Jedis getJedis() throws Exception { if(jedisPool!=null) { //getResource()方法从连接池中取得一个Jedis实例 return jedisPool.getResource(); } throw new Exception("jedis启动异常"); } }
3.锁测试:
package com.karat.cn.redis; import java.util.List; import java.util.UUID; import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction; public class RedisLock { /** * 上锁 * @param key 锁key值 * @param timeout 获取请求时间(多长时间获取不到锁表示失败) * @return */ public String getLock(String key,int timeout) { try { Jedis jedis=RedisManager.getJedis();//连接获取jedis实列 String value=UUID.randomUUID().toString();//随机设置值UUID(值无所谓) //连接超时时间,到了该设置时间,锁还没有被释放(没有抢到),结束 long end=System.currentTimeMillis()+timeout; while(System.currentTimeMillis()<end) {//阻塞 /** * setnx * 返回整数,具体为 * 1,当 key 的值被设置 * 0,当 key 的值没被设置 */ if(jedis.setnx(key, value)==1) {//插入数据成功 //设置key超时时间 jedis.expire(key, timeout); //锁设置成功,redis操作成功 return value; } //获得key的过期时间 if(jedis.ttl(key)==1){ jedis.expire(key, timeout); } Thread.sleep(1000); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 释放锁 * @param key * @param value * @return */ public boolean delLock(String key,String value) { try { Jedis jedis=RedisManager.getJedis();//连接获取jedis实列 while(true) { jedis.watch(key); //判断获得锁的线程和当前线程redis中存的值一样 if(value.equals(jedis.get(key))) { Transaction transaction=jedis.multi();//去开启事务 transaction.del(key);//删除key List<Object> list=transaction.exec();//执行事务 if(list==null) { continue; } return true; } jedis.unwatch(); break; } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; } /** * 测试 * @param args */ public static void main(String args[]) { RedisLock lock=new RedisLock(); String lookId=lock.getLock("aaa", 10000); if(null!=lookId) { System.out.println("获取锁成功"); } System.out.println("失败"); String mm=lock.getLock("aaa", 10000); System.out.println(mm); } }
redis中有一个setNx命令,这个命令只有在key不存在的情况下为key设置值
redis锁的更多相关文章
- (实例篇)php 使用redis锁限制并发访问类示例
1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功. 例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制 ...
- php 使用redis锁限制并发访问类
1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功. 例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制 ...
- 解锁redis锁的正确姿势
解锁redis锁的正确姿势 redis是php的好朋友,在php写业务过程中,有时候会使用到锁的概念,同时只能有一个人可以操作某个行为.这个时候我们就要用到锁.锁的方式有好几种,php不能在内存中用锁 ...
- redis锁处理并发问题
redis锁处理并发问题 redis锁处理高并发问题十分常见,使用的时候常见有几种错误,和对应的解决办法. set方式 setnx方式 setnx+getset方式 set方式 加锁:redis中se ...
- redis 初步认识四(redis锁,防并发)
using System; namespace ConsoleAppRedis { class Program { static void Main(string[] args) { //第一种,无登 ...
- redis锁机制介绍与实例
转自:https://m.jb51.net/article/154421.htm 今天小编就为大家分享一篇关于redis锁机制介绍与实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要 ...
- 定时任务redis锁+自定义lambda优化提取冗余代码
功能介绍: 我系统中需要跑三个定时任务,由于是多节点部署,为了防止多个节点的定时任务重复执行.所以在定时任务执行时加个锁,抢到锁的节点才能执行定时任务,没有抢到锁的节点就不执行.从而避免了定时任务重复 ...
- 多线程并发问题解决之redis锁
一 问题背景 我们做的是医疗信息化系统,在系统中一条患者信息对医院中当前科室中的所有诊断医生是可见的,当有一个诊断医生点击按钮处理该数据时,数据的状态发生了变化,其他的医生就不可以再处理此患者的数据了 ...
- Redis 锁的实现方案
开发中不可避免的是碰到并发请求,在数据严谨性的要求不高时,我们也不需要做什么处理,但如果碰到数据严谨性非常高的时候(例如:用户金额,秒杀产品的库存...),我们就需要慎重处理了. 解决方案多种多样,下 ...
- PHP Redis锁
一.什么是 Redis Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库 二.什么是 Redis 分布式锁 分布式锁其实可以理解为:控 ...
随机推荐
- Linux 安装(重装)mysql
1 新建存放mysql相关文件的文件夹 mkdir -p /export/servers/mysql //存放mysql相关的几个rpm文件 2 查看原有mysql 并卸载 rpm -qa | gre ...
- c++多线程编程(二)
这是道面试题目:有三个线程分别打印A.B.C,请用多线程编程实现,在屏幕上循环打印10次ABCABC… 见代码: #include <iostream> #include <Wind ...
- 【bzoj1479】[NOI2006]最大获利
1497: [NOI2006]最大获利 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 4335 Solved: 2123[Submit][Status] ...
- 使用GDB调试PHP代码,解决PHP代码死循环
最近在帮同事解决Swoole Server问题时,发现有1个worker进程一直处于R的状态,而且CPU耗时非常高.初步断定是PHP代码中发生死循环. 下面通过一段代码展示如何解决PHP死循环问题. ...
- python之连接oracle数据库
环境: windows,python2.7 1.下载cx_Oracle 在windows下不要使用easy_install或者pip,因为这样安装不会同步环境,并报错: distutils.error ...
- 2.一个简单的c++程序。
每个程序员的Hello World程序 //This is a small c++ program #include <iostream> int main() { std::cout & ...
- Browsersync 简介 and 使用
简介 省时的浏览器同步测试工具,Browsersync能让浏览器实时.快速响应您的文件更改(html.js.css.sass.less等)并自动刷新页面. 曾经我们每改一次的代码,都需要手动去刷新一次 ...
- LightOJ 1079 Just another Robbery (01背包)
题意:给定一个人抢劫每个银行的被抓的概率和该银行的钱数,问你在他在不被抓的情况下,能抢劫的最多数量. 析:01背包,用钱数作背包容量,dp[j] = max(dp[j], dp[j-a[i] * (1 ...
- ORCHARD学习教程-安装
安装说明:测试对象为正式版1.8 安装方法: 使用Microsoft Web Platform Installer 利用Microsoft WebMatrix 来安装 Working with Orc ...
- The Suspects——Asia Kaohsiung 2003
原创 The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 48698 Accepted: 23286 Des ...