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);
        }
    }

  

时间: 2024-08-01 16:22:15

Redis加锁与解锁的相关文章

PHP中redis加锁和解锁的简单实现

背景说明 在程序开发过程中,通常会遇到需要独占式的访问一些资源的情形,比如商品秒杀时扣减库存.这时就需要对资源加锁.实现锁的方式有很多,比如数据库锁.文件锁等等.本文简单介绍PHP中使用redis来实现加锁和解锁.实现方式参考了redis官方文档. 示例代码 代码环境:单redis实例,PHP5.6及以上,且需开启redis扩展 $redis = new \Redis(); $redis->connect('127.0.0.1'); $lockKey = 'lock_key'; $randVal

Redis分布式锁的正确加锁与解锁方式

现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式.高并发已经是业务要求的常态.像腾讯系的不少服务,还有CDN优化.异地多备份等处理. 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,只能有一个客户端持有锁. 防止死锁发生,如果持有锁的客户端因崩溃而没有主动释放锁,也要保证锁可以释放并且其他客户端可以正常加锁. 加锁和释放锁必须是同一个客户端. 容错性,只要redis还有节点存活,就可以进行正常的加锁解锁操作. 正确的red

sql语句对数据库表进行加锁和解锁

锁是数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性. 我们知道,多个用户能够同时操纵同一个数据库中的数据,会发生数据不一致现象.即如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题.这些问题包括:丢失更新.脏读.不可重复读和幻觉读: 1.当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题.每个事务都不知道其它事务的存在.最后的更新将重写由其它事务所做的更新,这将导致数据丢失.例如,两个编辑人员制作了

Redis系列-远程连接redis并给redis加锁

假设两台redis服务器,ip分别为:192.168.1.101和192.168.1.103,如何在101上通过redis-cli访问103上的redis呢?在远程连接103之前,先讲下redis-cli的几个关键参数: 用法:redis-cli [OPTIONS] [cmd [arg [arg ...]]] -h <主机ip>,默认是127.0.0.1 -p <端口>,默认是6379 -a <密码>,如果redis加锁,需要传递密码 --help,显示帮助信息 通过对

Linux下互斥量加锁与解锁操作的C代码实现

一.概述 在实际的软件程序中,由于代码量较大,函数之间的调用关系较为复杂,因此对于某些全局变量的操作要格外小心.在程序中,一般采用互斥量加锁的方式来保证对全局变量的操作的唯一性. 本文详细介绍了Linux下互斥量加锁与解锁操作的C代码实现,为相关的软件开发工作的开展提供了有益的参考. 二.加锁与解锁函数及时间结构体介绍 1.加锁函数pthread_mutex_timedlock 函数原型:int pthread_mutex_timedlock(pthread_mutex_t *restrict

redis加锁的几种实现

1. redis加锁分类 redis能用的的加锁命令分表是INCR.SETNX.SET 2. 第一种锁命令INCR 这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作进行加一.然后其它用户在执行 INCR 操作进行加一时,如果返回的数大于 1 ,说明这个锁正在被使用当中. 1. 客户端A请求服务器获取key的值为1表示获取了锁 2. 客户端B也去请求服务器获取key的值为2表示获取锁失败 3. 客户端A执行代码完成,删除锁 4. 客户端B在等待

redis加锁

1. redis加锁分类 redis能用的的加锁命令分表是INCR.SETNX.SET2. 第一种锁命令INCR 这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作进行加一. 然后其它用户在执行 INCR 操作进行加一时,如果返回的数大于 1 ,说明这个锁正在被使用当中. 1. 客户端A请求服务器获取key的值为1表示获取了锁 2. 客户端B也去请求服务器获取key的值为2表示获取锁失败 3. 客户端A执行代码完成,删除锁 4. 客户端B在等待

oracle数据库用户加锁和解锁

oracle数据库安装好之后,scott之类的用户默认情况下是被锁住的,无法使用scott用户登录数据库.使用有alter user数据库权限的用户登陆,角色选sysdba,执行以下命令: 解锁命令: SQL> ALTER USER 用户名 ACCOUNT UNLOCK; 锁定用户命令:SQL> ALTER USER 用户名 ACCOUNT LOCK; 如果登陆用户没有alter user数据库权限,使用拥有dba角色的用户登陆执行以下命令:SQL> grant alter user t

ORACLE用户的加锁、解锁

在DBA的日常工作中,经常遇到为Oracle用户解锁的操作:这篇文章给出在命令行下进行Oracle用户解锁的操作方法,通过几条简单的解锁语句就能完成此项工作.下面是具体的过程: 默认的scott用户是被锁定的,先解锁就能登陆上了. 使用下面的语句解锁scott: sqlplus /nolog conn / as sysdba alter user scott account unlock; 解锁之后可能会要求你该密码: alter user scott identified by tiger;