SpringBoot学习之Redis分布式锁(二)

在Redis新建lua文件夹,并写脚本

vi releasewherevalueequal.lua
if redis.call("get",KEYS[1])==ARGV[1] then
   return redis.call("del",KEYS[1])
else
   return 0
end

接下来,给 Lua 脚本求一个 SHA1 和,命令如下:

cat lua/releasewherevalueequal.lua | redis-cli -a hx script load --pipe
//script load 这个命令会在 Redis 服务器中缓存 Lua 脚本,
//并返回脚本内容的 SHA1 校验和,然后在
//Java 端调用时,传入 SHA1 校验和作为参数,这样Redis就会
//执行指定脚本

新建Redis类

package org.hx.distribute_lock;

import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class Redis {
    private JedisPool jedisPool;
    public Redis(){
        GenericObjectPoolConfig config = new GenericObjectPoolConfig();
        //连接池最大空闲数
        config.setMaxIdle(300);
        //最大连接数
        config.setMaxTotal(1000);
        //连接最大等待时间,如果是-1表示没有限制
        config.setMaxWaitMillis(10000);
        //在空闲时检查有效性
        config.setTestOnBorrow(true);
        /**
          * 1. Redis 地址
          * 2. Redis 端口
          * 3. 连接超时时间
          * 4. 密码
         * */
        jedisPool = new JedisPool(config,"192.168.133.8",6379,10000,"hx");

    }
    public void execute(CallwithJedis callwithJedis){
        try(Jedis jedis = jedisPool.getResource()){
            callwithJedis.call(jedis);
        }
    }
}

新建LuaTest类

package org.hx.distribute_lock;

import redis.clients.jedis.params.SetParams;

import java.util.Arrays;
import java.util.UUID;

public class LuaTest {
    public static void main(String[] args) {
        Redis redis = new Redis();
        for (int i = 0; i < 2; i++) {
            redis.execute(jedis -> {
                //1、先获取一个随机字符串
                String value = UUID.randomUUID().toString();
                //2、获取锁
                String k1 = jedis.set("k1",value,new SetParams().nx().ex(5));
                //3、判断是否成功拿到锁
                if(k1 != null && "OK".equals(k1)){
                    //4、具体的业务操作
                    jedis.set("site","www.baidu.com");
                    String site = jedis.get("site");
                    System.out.println(site);
                    //5、释放锁
                    jedis.evalsha("b8059ba43af6ffe8bed3db65bac35d452f8115d8", Arrays.asList("k1"),Arrays.asList(value));

                }else{
                    System.out.println("没拿到锁");
                }
            });
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值