2019-07-31 简单分布式锁 springboot 2.0

2019-07-31  本文已影响0人  东_11f3

蛋疼问题,想使用

setIfAbsent(Object key, Object value, long timeout, TimeUnit unit)

方法解决多点和并发问题,但是由于redis版本问题不存在,只好曲线救国

解决思路

1.没有就给他造一个,首先超看redis支持不支持,在查看存在该方法的源码;发现最终实现方法是在RedisStringCommands.class里面
使用的版本redis 方法中存在该方法,重新实现即可


@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    RedisSerializer keySerializer() {
        return this.redisTemplate.getKeySerializer();
    }

    RedisSerializer valueSerializer() {
        return this.redisTemplate.getValueSerializer();
    }
    byte[] rawKey(Object key) {
        Assert.notNull(key, "non null key required");
        return this.keySerializer() == null && key instanceof byte[] ? (byte[])((byte[])key) : this.keySerializer().serialize(key);
    }

    byte[] rawValue(Object value) {
        return this.valueSerializer() == null && value instanceof byte[] ? (byte[])((byte[])value) : this.valueSerializer().serialize(value);
    }

    /**
     *
     * @param key
     * @param value
     * @param timeout
     * @param unit
     * @return
     */
    public Boolean setIfAbsent(Object key, Object value, long timeout, TimeUnit unit) {
        byte[] rawKey = this.rawKey(key);
        byte[] rawValue = this.rawValue(value);
        Expiration expiration = Expiration.from(timeout, unit);
        return (Boolean)this.redisTemplate.execute((connection) -> {
            return connection.set(rawKey, rawValue, expiration, RedisStringCommands.SetOption.ifAbsent());
        }, true);
    }

}

上一篇下一篇

猜你喜欢

热点阅读