Redis加锁与解锁
Redis加锁
customerM = BaseMemCached.setMLock(customerId);
/**
* 个人账户表加锁
**/
public static CustomerM setMLock(Integer userId){
CustomerM customerM = (CustomerM)setLock(USER_M_USERID+userId, CustomerM.class);
customerM.setAddPiggy(0);
customerM.setAddPayoff(0);
customerM.setAddAmountBase(0);
customerM.setAddAmountCft(0);
return customerM;
}
public static Object setLock(String key,Class classes){
logger.info("加锁"+key+_LOCK);
long result = JedisPoolClient.getInstance().setnx(key+_LOCK,System.currentTimeMillis());
try {
long time = System.currentTimeMillis();
while (result != 1) {
Thread.sleep(10);
time = System.currentTimeMillis();
result = JedisPoolClient.getInstance().setnx(key+_LOCK,time);
}
logger.info("加锁\t"+key+_LOCK+"\t完成");
JedisPoolClient.getInstance().set(key+_LOCK,time,TIME_OUT);
return JedisPoolClient.getInstance().get(key,classes);
}catch (Exception e){
e.printStackTrace();
}
return null;
}
public long setnx(String key,Object obj){
Jedis jedis = jedisPool.getResource();
try {
long l = jedis.setnx(key,StringUtil.bean2json(obj));
return l;
}catch(JedisConnectionException e){
jedisPool.returnBrokenResource(jedis);
jedis=null;
logger.error("redis异常:"+e.getMessage());
e.printStackTrace();
}finally{
jedisPool.returnResource(jedis);
}
return -1;
}
public boolean set(String key,Object obj,int seconds){
Jedis jedis = jedisPool.getResource();
try {
jedis.setex(key,seconds,StringUtil.bean2json(obj));
return true;
}catch(JedisConnectionException e){
jedisPool.returnBrokenResource(jedis);
jedis=null;
logger.error("redis异常:" + e.getMessage());
e.printStackTrace();
}catch(Exception e){
logger.error("Json封装失败:" + e.getStackTrace());
}finally{
jedisPool.returnResource(jedis);
}
return false;
}
Redis解锁
BaseMemCached.updateAndUnlock(customerM);
/**
* 个人账户修改并解锁
* */
public static void updateAndUnlock(CustomerM customerM){
logger.info("解锁"+USER_M_USERID+customerM.getCustomerId() + _LOCK);
setMem(USER_M_USERID+customerM.getCustomerId(),customerM);
delete(USER_M_USERID+customerM.getCustomerId()+_LOCK);
}
protected static boolean setMem(String key,Object obj){
return JedisPoolClient.getInstance().set(key,obj);
}
protected static void delete(String key){
JedisPoolClient.getInstance().delete(key);
}
public boolean set(String key,Object obj){
Jedis jedis = jedisPool.getResource();
try {
logger.info(key+":"+StringUtil.bean2json(obj));
jedis.set(key, StringUtil.bean2json(obj));
return true;
}catch(JedisConnectionException e){
jedisPool.returnBrokenResource(jedis);
jedis=null;
logger.error("redis异常:" + e.getMessage());
e.printStackTrace();
}finally{
jedisPool.returnResource(jedis);
}
return false;
}
public void delete(String key){
Jedis jedis = jedisPool.getResource();
try {
jedis.del(key);
}catch(JedisConnectionException e){
jedisPool.returnBrokenResource(jedis);
jedis=null;
logger.error("redis异常:"+e.getMessage());
e.printStackTrace();
}finally{
jedisPool.returnResource(jedis);
}
}
Redis加锁与解锁的更多相关文章
- PHP中redis加锁和解锁的简单实现
背景说明 在程序开发过程中,通常会遇到需要独占式的访问一些资源的情形,比如商品秒杀时扣减库存.这时就需要对资源加锁.实现锁的方式有很多,比如数据库锁.文件锁等等.本文简单介绍PHP中使用redis来实 ...
- redis 加锁与解锁的详细总结,解决线程并发导致脏数据
1.前言 对每个controller来说都是全新且单独的,原因是多线程,如果多个请求操作共有的数据,这样的并发操作会导致脏数据 怎么解决? mysql可以使用积极锁解决, 这里讲解的是redis的解决 ...
- sql语句对数据库表进行加锁和解锁
锁是数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性. 我们知道,多个用户能够同时操纵同一个数据库中的数据,会发生数据不一致现象.即如果没有锁定且多个用户同时访问一个数据库 ...
- Redis系列-远程连接redis并给redis加锁
假设两台redis服务器,ip分别为:192.168.1.101和192.168.1.103,如何在101上通过redis-cli访问103上的redis呢?在远程连接103之前,先讲下redis-c ...
- svn使用相关问题:eclipse插件,加锁,解锁,偷锁,更新不了,记住密码
svn使用相关问题:eclipse插件,加锁,解锁,偷锁,更新不了,记住密码 获取锁的时候可以看下 是谁锁住了,让对方提交解锁,如果是给离职人员锁住需要使用偷锁的方式先解锁再提交偷锁处理办法:选中该文 ...
- redis加锁
1. redis加锁分类 redis能用的的加锁命令分表是INCR.SETNX.SET2. 第一种锁命令INCR 这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 ...
- redis加锁的几种实现
redis加锁的几种实现 2017/09/21 1. redis加锁分类 redis能用的的加锁命令分表是INCR.SETNX.SET 2. 第一种锁命令INCR 这种加锁的思路是, key 不存在, ...
- REDIS中加锁和解锁问题
使用lua+redis的方法.之所以使用lua是为了保证原子性 问题: 1. redis发现锁失败了要怎么办?中断请求还是循环请求?2. 循环请求的话,如果有一个获取了锁,其它的在去获取锁的时候,是不 ...
- ABAP 加锁与解锁
维护一个旧程序,直接用UPDATE更新数据库透明表,现要求加上正在操作提示,以免数据出错. 1.先找到PA30多人修改时对应的锁对象. 2.在UPDATE前加锁,调用函数. CALL FUNCTION ...
随机推荐
- .net / java /安卓des加密互通
一 . C#.net /// <summary> /// 加密数据 /// </summary> /// <param name="Text"> ...
- 【spring boot】集成了druid后,同样的mybatis模糊查询语句出错Caused by: com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'name LIKE '%' ? '%'
druid版本是 <!-- https://mvnrepository.com/artifact/com.alibaba/druid 数据库连接池--> <dependency> ...
- 使apache的日志文件里不记录图片文件
找到: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-A ...
- 关于宏:container_of和 offsetof以及list_for_each_entry
1.offsetof(TYPE, MEMBER) #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) offse ...
- JavaWeb项目实现文件下载
File file = new File(path);// path是根据日志路径和文件名拼接出来的 String filename = file.getName();// 获取日志文件名称 Inpu ...
- Jakarta雅加达项目简介
Jakarta项目是在Apache软件基金会营运的公开源代码软件开发项目之一.开发着面向编程语言Java的程序库,框架等. Jakarta是Apache组织下的一套Java解决方案的开源软件的名称,它 ...
- 基于Storyboard的创建多分支NavigationController的方法
如果遇到本文图片只展示一半的情况,多数情况下刷新一下浏览器即可 遇到的问题 我在写程序的时候碰到这样一个简单的需求,用户点击"我的XX"这样的功能时候,需要判断当前用户是否已经登录 ...
- 倍福TwinCAT(贝福Beckhoff)基础教程2.2 TwinCAT常见类型使用和转换_字符串
一般声明字符串都会加一个长度的限制,比如A:STRING(80);至于真实的字符串长度不要超过这个限制即可 在测试中,我演示了两个字符串的方法,CONCAT字符串拼接和REPLACE字符串替换.拼 ...
- python 类特殊成员
class Foo: def __init__(self,age): self.age=age print('init') def __call__(self): print('call') def ...
- 【BIEE】BIEE 11g BI Publisher报表开发实例
环境准备 JDK下载地址:直接去百度软件中心下载即可 BIPublisher下载地址:http://pan.baidu.com/s/1bpk03Jh 本例子中以win7 32位操作系统为例 1.安装已 ...