Spring RedisTemplat使用排他锁

目录

关于排它锁

代码封装


关于排它锁

已在 Redis指令详解-string val相关指令 文章中讲述。

代码封装

   /**
     * 排它锁
     *
     * @param randomForLock
     * @return
     */
    public boolean getNXLock(String key, String randomForLock, long expireSeconds) {
        String value = randomForLock;

        return (Boolean) redisTemplate.execute((RedisCallback<Boolean>) connection -> {
            RedisSerializer valueSerializer = redisTemplate.getValueSerializer();
            RedisSerializer keySerializer = redisTemplate.getKeySerializer();
            Object obj = connection.execute("set", keySerializer.serialize(key),
                    valueSerializer.serialize(value),
                    bytes4NX,
                    bytes4EX,
                    Long.valueOf(expireSeconds).toString().getBytes());
            return obj != null;
        });
    }

    final byte[] bytes4NX = "NX".getBytes();
    final byte[] bytes4EX = "EX".getBytes();
    final String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) else return 0 end";

    /**
     * 释放任务排它锁
     *
     * @param randomForLock
     */
    public void releaseNXLock(String key, String randomForLock) {
        List<String> keys = Arrays.asList(key);
        // 这里returnType的选择,需结合实际与org.springframework.data.redis.connection.ReturnType
        RedisScript redisScript = RedisScript.of(script, Long.class);
        redisTemplate.execute(redisScript, keys, randomForLock);
    }

注意:java Class选择ReturnType的代码,否则会出现 java.lang.IllegalStateException异常。

/**
 * Represents a data type returned from Redis, currently used to denote the expected return type of Redis scripting
 * commands
 *
 * @author Jennifer Hickey
 * @author Christoph Strobl
 */
public enum ReturnType {

	/**
	 * Returned as Boolean
	 */
	BOOLEAN,

	/**
	 * Returned as {@link Long}
	 */
	INTEGER,

	/**
	 * Returned as {@link List<Object>}
	 */
	MULTI,

	/**
	 * Returned as {@literal byte[]}
	 */
	STATUS,

	/**
	 * Returned as {@literal byte[]}
	 */
	VALUE;

	/**
	 * @param javaType can be {@literal null} which translates to {@link ReturnType#STATUS}.
	 * @return never {@literal null}.
	 */
	public static ReturnType fromJavaType(@Nullable Class<?> javaType) {

		if (javaType == null) {
			return ReturnType.STATUS;
		}
		if (javaType.isAssignableFrom(List.class)) {
			return ReturnType.MULTI;
		}
		if (javaType.isAssignableFrom(Boolean.class)) {
			return ReturnType.BOOLEAN;
		}
		if (javaType.isAssignableFrom(Long.class)) {
			return ReturnType.INTEGER;
		}
		return ReturnType.VALUE;
	}
}

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值