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 ...
随机推荐
- Qt creator发布可执行文件方式----靠谱
1.首先用 QtCreator 新建一个 Qt Widgets Application 项目,直接用默认的 QMainWindow 程序就可以了,项目名字假定是serial_port.exe. 然后以 ...
- Ubuntu14.04终端主机名+用户名修改配色方案
首先打开终端:输入指令ls -a 然后输入指令:vi .bashrc 先按下字母A,进入编写: 在文档最后一行添加: PS1='${debian_chroot:+($debian_chroot)}\[ ...
- 如何让mysql的自动递增的字段重新从1开始呢?(
数据库表自动递增字段在用过一段时间后清空,还是继续从清空后的自动编号开始.如何才能让这个字段自动从1开始自动递增呢? 下面两个方法偶都试过,很好用: 1 清空所有数据,将自增去掉,存盘,在加上自增,存 ...
- 安装jenkins插件的两种方法
安装jenkins插件有两种方法,一种是在线安装,一种是离线安装.两种方式介绍如下: 1.如果服务器可以上网,那边选择在线安装最好不过了,安装流程为:系统管理----插件管理---选择需要的插件直接安 ...
- 页面加载后累加,自加1&&判断数字是否为两位数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JAVA Eclipse如何开发Android的多页面程序
Fragment可以认为是Activity的一个界面的组成部分,Fragment必须依存于Activity. 在layout文件夹中新建一个xml文件,布局方式采用RelativeLayout,注 ...
- Windows为什么双击打开‘我的电脑’, 没有了‘前进’‘ 后退’‘向上’等按钮?
如图所示 点击查看 工具栏 标准按钮即可 左侧的数值虚线可以拖动到任意,还可以添加按钮如搜索,删除,复制,剪切等
- How to use Variables in different component
1. In Script Task component Set Value: Dts.Variables["ErrorMsg"].Value = string.Format(&qu ...
- 【Excle数据透视表】如何为一个字段添加多种分类汇总方式
解决方案1 右键单击人员分类字段包含的任意单元格→右键→字段设置→自定义→(最大值.最小值) 解决方案2 单击人员分类→分析→字段设置
- rabbitmq 用户和授权
官方文档 https://my.oschina.net/hncscwc/blog/262246?p=