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 ...
随机推荐
- Android简单的利用MediaRecorder进行录音的实例代码
MainActivity.java package com.example.soundrecord_demo; import java.io.IOException; import android.m ...
- Java 并发工具包 java.util.concurrent 用户指南(转)
本文转自http://blog.csdn.net/defonds/article/details/44021605/ 感谢作者 1. java.util.concurrent - Java 并发工具包 ...
- 控制面板cpl大全
ALSNDMGR.CPL AC97 Audio组态设定appwiz.cpl 添加和删除程序bthprops.cpldesk.cpl 显示属性firewall.cpl Windows防火墙hdwwi ...
- Snapdragon profiler连不上 android手机
adb devices也是空 开发者选项里面该开的都开了 就可以了 对了数据线不对也会连不上...
- Hibernate分页功能数据重复问题
今天遇到一个很憋屈的问题那就是hibernate分页查询中出现重复数据,本来一直没有在意,以为是数据问题,但是一查程序和数据都没有问题,继续深入查看,找到问题了就是order By 时出的问题,唉.. ...
- log4j教程 2、安装
Log4j的API包使用Apache软件许可证,由开源倡议认证一个完全成熟的开源许可证下发布. 最新log4j的版本,包括完整的源代码,类文件和文档可以在这里找到 http://logging.apa ...
- Cobbler无人值守安装系统
环境说明 系统版本 CentOS 6.9 x86_64 Cobbler是一款Linux安装服务器,可以快速设置网络安装环境.它粘合在一起并自动执行许多相关的Linux任务,因此部署新系统时不必在 ...
- 2017.8.23 postgresql的外键
1.增加/删除外键的语法 ALTER TABLE t_permission ADD CONSTRAINT fkey FOREIGN KEY (fd_resid) REFERENCES t_resour ...
- 转: Java 应用一般架构
http://mp.weixin.qq.com/s?__biz=MzAwMzI3Njc1MA==&mid=2650192186&idx=1&sn=bd08fd3a89f9089 ...
- 【ecshop---新增包邮卡功能】
一:需求分析 项目组要求新增类似虚拟卡的包邮卡,用户获得包邮卡的方式包括后台发送和前台自助充值.包邮卡有使用期限.订单使用包邮卡免除邮费.可以和其他优惠活动同时进行! 二:开发功能点 后台:新增包邮卡 ...