1.引入依赖:

 <!--使用redis客户端需要用到的包  -->
         <dependency>
               <groupId>redis.clients</groupId>
               <artifactId>jedis</artifactId>
               <version>2.9.0</version>
         </dependency>
         <dependency>
              <groupId>org.apache.commons</groupId>
              <artifactId>commons-pool2</artifactId>
              <version>2.4.3</version>
          </dependency>

2.连接redis:

 package com.karat.cn.redis;

 import redis.clients.jedis.Jedis;
 import redis.clients.jedis.JedisPool;
 import redis.clients.jedis.JedisPoolConfig;
 /**
  * 客户端连接redis
  * @author 开发
  *
  */
 public class RedisManager {

     private static JedisPool jedisPool;

     static {
         JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
         jedisPoolConfig.setMaxTotal(20);//最大连接数, 默认8个
         jedisPoolConfig.setMaxIdle(10);//最小空闲连接数, 默认0
         jedisPool=new JedisPool(jedisPoolConfig, "47.107.121.215",6379);
     }

     public static Jedis getJedis() throws Exception {
         if(jedisPool!=null) {
             //getResource()方法从连接池中取得一个Jedis实例
             return jedisPool.getResource();
         }
         throw new Exception("jedis启动异常");
     }
 }

3.锁测试:

 package com.karat.cn.redis;

 import java.util.List;
 import java.util.UUID;

 import redis.clients.jedis.Jedis;
 import redis.clients.jedis.Transaction;

 public class RedisLock {
     /**
      * 上锁
      * @param key    锁key值
      * @param timeout    获取请求时间(多长时间获取不到锁表示失败)
      * @return
      */
     public String getLock(String key,int timeout) {
         try {
             Jedis jedis=RedisManager.getJedis();//连接获取jedis实列

             String value=UUID.randomUUID().toString();//随机设置值UUID(值无所谓)

             //连接超时时间,到了该设置时间,锁还没有被释放(没有抢到),结束
             long end=System.currentTimeMillis()+timeout;

             while(System.currentTimeMillis()<end) {//阻塞
                 /**
                  * setnx
                  * 返回整数,具体为
                  * 1,当 key 的值被设置
                  * 0,当 key 的值没被设置
                  */
                 if(jedis.setnx(key, value)==1) {//插入数据成功
                     //设置key超时时间
                     jedis.expire(key, timeout);
                     //锁设置成功,redis操作成功
                     return value;
                 }
                 //获得key的过期时间
                 if(jedis.ttl(key)==1){
                     jedis.expire(key, timeout);
                 }

                 Thread.sleep(1000);
             }
         } catch (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         return null;
     }
     /**
      * 释放锁
      * @param key
      * @param value
      * @return
      */
     public boolean delLock(String key,String value) {
         try {
             Jedis jedis=RedisManager.getJedis();//连接获取jedis实列
             while(true) {
                 jedis.watch(key);
                 //判断获得锁的线程和当前线程redis中存的值一样
                 if(value.equals(jedis.get(key))) {
                     Transaction transaction=jedis.multi();//去开启事务
                     transaction.del(key);//删除key
                     List<Object> list=transaction.exec();//执行事务
                     if(list==null) {
                         continue;
                     }
                     return true;
                 }
                 jedis.unwatch();
                 break;
             }
         } catch (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         return false;
     }
     /**
      * 测试
      * @param args
      */
     public static void main(String args[]) {
         RedisLock lock=new RedisLock();
         String lookId=lock.getLock("aaa", 10000);

         if(null!=lookId) {
             System.out.println("获取锁成功");
         }

         System.out.println("失败");
         String mm=lock.getLock("aaa", 10000);
         System.out.println(mm);
     }
 }

redis中有一个setNx命令,这个命令只有在key不存在的情况下为key设置值

redis锁的更多相关文章

  1. (实例篇)php 使用redis锁限制并发访问类示例

    1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功. 例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制 ...

  2. php 使用redis锁限制并发访问类

    1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功. 例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制 ...

  3. 解锁redis锁的正确姿势

    解锁redis锁的正确姿势 redis是php的好朋友,在php写业务过程中,有时候会使用到锁的概念,同时只能有一个人可以操作某个行为.这个时候我们就要用到锁.锁的方式有好几种,php不能在内存中用锁 ...

  4. redis锁处理并发问题

    redis锁处理并发问题 redis锁处理高并发问题十分常见,使用的时候常见有几种错误,和对应的解决办法. set方式 setnx方式 setnx+getset方式 set方式 加锁:redis中se ...

  5. redis 初步认识四(redis锁,防并发)

    using System; namespace ConsoleAppRedis { class Program { static void Main(string[] args) { //第一种,无登 ...

  6. redis锁机制介绍与实例

    转自:https://m.jb51.net/article/154421.htm 今天小编就为大家分享一篇关于redis锁机制介绍与实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要 ...

  7. 定时任务redis锁+自定义lambda优化提取冗余代码

    功能介绍: 我系统中需要跑三个定时任务,由于是多节点部署,为了防止多个节点的定时任务重复执行.所以在定时任务执行时加个锁,抢到锁的节点才能执行定时任务,没有抢到锁的节点就不执行.从而避免了定时任务重复 ...

  8. 多线程并发问题解决之redis锁

    一 问题背景 我们做的是医疗信息化系统,在系统中一条患者信息对医院中当前科室中的所有诊断医生是可见的,当有一个诊断医生点击按钮处理该数据时,数据的状态发生了变化,其他的医生就不可以再处理此患者的数据了 ...

  9. Redis 锁的实现方案

    开发中不可避免的是碰到并发请求,在数据严谨性的要求不高时,我们也不需要做什么处理,但如果碰到数据严谨性非常高的时候(例如:用户金额,秒杀产品的库存...),我们就需要慎重处理了. 解决方案多种多样,下 ...

  10. PHP Redis锁

    一.什么是 Redis Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库 二.什么是 Redis 分布式锁 分布式锁其实可以理解为:控 ...

随机推荐

  1. 从SQL Server中清除msdb备份和恢复记录

    正如我在前面的技巧“您的数据库上次恢复是什么时候呢?”中提到的,SQL Server使msdb数据库内系统表中的备份和恢复记录保持激活状态.没有正常的维护,这些系统表将变得很大,从而导致对于msdb数 ...

  2. Zend Studio 10汉化方法

    选择Help菜单->Install New Software...在Work with框中复制此地址:http://download.eclipse.org/technology/babel/u ...

  3. 自定义的parse_url逆向函数http_build_url,将数组转为url字符串

    parse_url函数可以讲一个url字符串解析成一个数组,但是php中似乎没有parse_url的逆向函数来讲一个解析出来的数组组合成url字符串,只有一个http_build_query用来将数组 ...

  4. 696. Count Binary Substrings统计配对的01个数

    [抄题]: Give a string s, count the number of non-empty (contiguous) substrings that have the same numb ...

  5. 10.Execution failed with exit status: 3

    错误信息: insert overwrite table t_mobile_mid_use_p_tmp4_rcf select '201411' as month_id, a.prov_id, a.c ...

  6. spark源码阅读之network(1)

    spark将在1.6中替换掉akka,而采用netty实现整个集群的rpc的框架,netty的内存管理和NIO支持将有效的提高spark集群的网络传输能力,为了看懂这块代码,在网上找了两本书看< ...

  7. Linux下安装memcache PHP扩展

    [root@centos memcache-2.2.4]# wget http://pecl.php.net/get/memcache-2.2.4.tgz [root@centos memcache- ...

  8. App测试从入门到精通之性能测试

    好了,上节我们介绍了关于APP测试的功能测试方面一些细节.这一篇我们来介绍一下,关于APP测试过程中的性能测试参考要点,我们需要思考的如下: 响应时间 1.APP安装卸载的响应时间 2.APP各种功能 ...

  9. 编写高质量代码改善C#程序的157个建议——建议14: 正确实现浅拷贝和深拷贝

    建议14: 正确实现浅拷贝和深拷贝 为对象创建副本的技术称为拷贝(也叫克隆).我们将拷贝分为浅拷贝和深拷贝. 浅拷贝 将对象中的所有字段复制到新的对象(副本)中.其中,值类型字段的值被复制到副本中后, ...

  10. 编写高质量代码改善C#程序的157个建议——建议10: 创建对象时需要考虑是否实现比较器

    建议10: 创建对象时需要考虑是否实现比较器 有对象的地方就会存在比较,在.NET的世界中也一样.举个最简单的例子,在UI中,有一个10个人的Salary列表.根据排序的需要,列表要支持针对基本工资来 ...