@Service
public class RedisServiceImpl implements RedisService {
private Logger logger = LoggerFactory.getLogger(RedisServiceImpl.class);
/**
* redis 配置
*/
@Value("redis://${redis.host}:${redis.port}")
private String redisAddress;
@Value("${redis.password}")
private String redisPassword;
@Value("${redis.db}")
private String redisDb;
private RedissonClient redisson;
private Map<String, RBucket> buckets = new HashMap<>(16);
@PostConstruct
private void init() {
Config config = new Config();
config.useSingleServer().setAddress(redisAddress).setPassword(redisPassword);
redisson = Redisson.create(config);
logger.info("Redisson initialized");
}
private <T> RBucket<T> getBucket(String key) {
RBucket bucket = buckets.getOrDefault(key, null);
if (bucket == null) {
bucket = redisson.getBucket(key);
buckets.put(key, bucket);
}
return bucket;
}
@Override
public <T> void set(String key, T value) {
set(key, value, 0, null);
}
@Override
public <T> void set(String key, T value, long l, TimeUnit unit) {
if (l == 0 || unit == null) {
getBucket(key).set(value);
} else {
getBucket(key).set(value, l, unit);
}
}
@Override
public <T> T get(String key) {
return ((RBucket<T>) getBucket(key)).get();
}
@Override
public Lock lock(String lockName) {
return lock(lockName, 0, null);
}
@Override
public Lock lock(String lockName, long l, TimeUnit unit) {
RLock rLock = redisson.getLock(lockName);
if (l == 0 || unit == null) {
rLock.lock();
logger.info("locked {}", lockName);
} else {
rLock.lock(l, unit);
logger.info("locked {} {} {}", lockName, l, unit);
}
return new LockImpl(logger, rLock);
}
public static class LockImpl implements Lock {
private final Logger logger;
private final RLock rLock;
LockImpl(Logger logger, RLock rLock) {
this.logger = logger;
this.rLock = rLock;
}
@Override
public void unlock() {
rLock.unlock();
logger.info("unlocked {}", rLock.getName());
}
}
}
Redis 分布式锁实现 高并发抢购的问题
最新推荐文章于 2023-03-03 11:51:56 发布