zoukankan      html  css  js  c++  java
  • Redis实现分布式锁3-使用LUA脚本实现分布式锁,解决原子性问题

        private static final Long SUCCESS = 1L;
        private static String script1 = "if redis.call('setNx',KEYS[1],ARGV[1])  then " +
                "   if redis.call('get',KEYS[1])==ARGV[1] then " +
                "      return redis.call('expire',KEYS[1],ARGV[2]) " +
                "   else " +
                "      return 0 " +
                "   end " +
                "end";
        private RedisScript<String> lockRedisScript1 = new DefaultRedisScript<>(script1, String.class);
        private static String script2 = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        private RedisScript<String> unLockRedisScript = new DefaultRedisScript<>(script2, String.class);
        /**
         * 获取锁
         *
         * @param lockKey       redis的key
         * @param value         redis的value要求是随机串,防止释放其他请求的锁
         * @param expireTime    redis的key 的过期时间  单位(秒) 防止死锁,导致其他请求无法正常执行业务
         * @return
         */
        @Override
        public  boolean lock(String lockKey, String value, long expireTime) {
            //对非string类型的序列化
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setValueSerializer(new StringRedisSerializer());
            Object result = redisTemplate.execute(lockRedisScript1, Collections.singletonList(lockKey), value, String.valueOf(expireTime));
    
            return SUCCESS.equals(result);
    
        }
    
        /**
         * 释放锁
         *
         * @param lockKey   redis的key
         * @param value     redis的value  只有value比对一致,才能确定是本请求 加的锁 才能正常释放
         * @return
         */
        @Override
        public  boolean unlock(String lockKey, String value) {
            try {
                Object result = redisTemplate.execute(unLockRedisScript, Collections.singletonList(lockKey), value);
                if (SUCCESS.equals(result)) {
                    return true;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }
    

      

  • 相关阅读:
    Redis 集群
    应用系统日志采集解决方案
    Flume学习应用:Java写日志数据到MongoDB
    一次开发逻辑规范的总结
    JSP2 自定义标签
    mysql的left join、 right join和inner join
    静态网页、动态网页、apache和tomcat之间区别和联系
    spring与shiro配置详解
    maven项目在eclipse启动报错:java.lang.ClassNotFoundException
    如何修改maven的默认jdk版本
  • 原文地址:https://www.cnblogs.com/brant/p/12539059.html
Copyright © 2011-2022 走看看