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 ...
随机推荐
- ResourceBundle (读取properties文件及中文乱码解决方法)
原文:http://blog.csdn.net/joecheungdishuiya/article/details/6304993 public class test { static Resourc ...
- 【Linux】CentOS7 上使用yum安装和卸载软件【yum安装wine举例】
关于yum的相关解释,请 man yum 自行查看. 配置常用源:http://www.cnblogs.com/sxdcgaq8080/p/7516186.html yum的使用类似于在windows ...
- windows下搭建svn服务器
转自:http://www.cnblogs.com/cloud2rain/archive/2013/04/11/3015080.html 这篇文档非常好,转来学习,有一点就是把subversion创建 ...
- Elasticsearch教程(三),IK分词器安装 (极速版)
如果只想快速安装IK,本教程管用.下面看经过. 简介: 下面讲有我已经打包并且编辑过的zip包,你可以在下面下载即可. 当前讲解的IK分词器 包的 version 为1.8. 一.下载zip包. 下面 ...
- eclipse maven项目导入Intellij问题处理
1.maven打包编译时后台一直输出警告信息 [WARNING] File encoding has not been set, using platform encoding GBK, i.e. b ...
- perl学习笔记——输入与输出
读取标准输入 用<STDIN>进行标准输入:chomp($line=<STDIN>); 如果读到文件尾,行输入操作符就会返回undef.便可利用这一性质跳出循环. while( ...
- mysql double 乘法 缺失精度
CREATE TABLE tmp_decimal( id BIGINT auto_increment PRIMARY KEY , amount DOUBLE ); 创建测试表 插入测试数据 INSER ...
- 15款Java程序员必备的开发工具
如果你是一名Web开发人员,那么用膝盖想也知道你的职业生涯大部分将使用Java而度过.这是一款商业级的编程语言,我们没有办法不接触它. 对于Java,有两种截然不同的观点:一种认为Java是最简单功能 ...
- Service和Activity交互之广播方式
一.使用场景如果要通知多个Activity,广播较为适合.但广播较为耗费性能. 二.Broadcast更新Activity中的UI 1.新建一个接口OnUpdateUI,用于回调更新UI public ...
- JavaScript 数组去重 方法汇总
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...