redis分布式锁
推荐(免费):redis
Redisson
redisson和下列一下自行封装两种方式的区别(场景):
- redisson未获取到锁的会进入等待,直到获取到锁。
- 另外两种方式如果未获取到锁,会放弃,不会执行业务代码。
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.13.6</version></dependency>
@Autowiredprivate Redisson redisson;@GetMapping("/redissonLock")public String redissonLock() {
log.info("进入了方法");
RLock lock = redisson.getLock("redissonLock");
try {
lock.lock(30, TimeUnit.SECONDS);
Thread.sleep(10000);
System.out.println("我是你大哥");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 如果不释放,不会唤起其他线程,则其他线程会超时过期自动唤醒,不会执行业务代码
lock.unlock();
}
return "运行结束";}
RedisTemplate封装redis锁(1)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId></dependency>
package com.util;import org.springframework.dao.DataAccessException;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.connection.RedisStringCommands;import org.springframework.data.redis.core.RedisCallback;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.script.RedisScript;import org.springframework.data.redis.core.types.Expiration;import org.springframework.stereotype.Component;import java.util.Arrays;@Componentpublic class RedisLock {
private static RedisTemplate redisTemplate;
private static String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then\n"
"\treturn redis.call(\"del\",KEYS[1])\n"
"else\n"
" \treturn 0\t\n"
"end ";
public RedisLock(RedisTemplate redisTemplate) {
RedisLock.redisTemplate = redisTemplate;
}
public static Boolean getLock(String key, String value, Long expireTime) {
RedisStringCommands.SetOption setOption = RedisStringCommands.SetOption.ifAbsent();
Expiration expiration = Expiration.seconds(expireTime);
RedisCallback<Boolean> booleanRedisCallback = new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
return connection.set(redisTemplate.getKeySerializer().serialize(key), redisTemplate.getValueSerializer().serialize(value), expiration, setOption);
}
};
return (Boolean) redisTemplate.execute(booleanRedisCallback);
}
public static Boolean unLock(String key, String value) {
RedisScript<Boolean> redisScript = RedisScript.of(script, Boolean.class);
return (Boolean) redisTemplate.execute(redisScript, Arrays.asList(key), value);
}}
@GetMapping("/redisLock")public String redisLock() {
log.info("进入了方法");
String key = "redisLock";
String uuid = UUID.randomUUID().toString();
try {
if (RedisLock.getLock(key, uuid, 30L)) {
log.info("进入了锁");
Thread.sleep(10000);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
RedisLock.unLock(key, uuid);
}
log.info("方法执行完成");
return "程序结束";}
RedisTemplate封装redis锁(2)
package com.util;import lombok.extern.slf4j.Slf4j;import org.springframework.dao.DataAccessException;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.connection.RedisStringCommands;import org.springframework.data.redis.core.RedisCallback;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.script.RedisScript;import org.springframework.data.redis.core.types.Expiration;import java.util.Arrays;import java.util.UUID;@Slf4jpublic class HighRedisLock implements AutoCloseable{
private RedisTemplate redisTemplate;
private String key;
private String value;
private Long expireTime;
private static String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then\n"
"\treturn redis.call(\"del\",KEYS[1])\n"
"else\n"
" \treturn 0\t\n"
"end ";
public HighRedisLock(RedisTemplate redisTemplate, String key, Long expireTime) {
this.redisTemplate = redisTemplate;
this.key = key;
this.value = UUID.randomUUID().toString();
this.expireTime = expireTime;
}
public Boolean getLock() {
RedisStringCommands.SetOption setOption = RedisStringCommands.SetOption.ifAbsent();
Expiration expiration = Expiration.seconds(expireTime);
RedisCallback<Boolean> booleanRedisCallback = new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
return connection.set(redisTemplate.getKeySerializer().serialize(key), redisTemplate.getValueSerializer().serialize(value), expiration, setOption);
}
};
return (Boolean) redisTemplate.execute(booleanRedisCallback);
}
public Boolean unLock() {
RedisScript<Boolean> redisScript = RedisScript.of(script, Boolean.class);
return (Boolean) redisTemplate.execute(redisScript, Arrays.asList(key), value);
}
@Override
public void close() throws Exception {
unLock();
}}
@Autowiredprivate RedisTemplate redisTemplate;@GetMapping("/highRedisLock")public String highRedisLock() {
log.info("进入了方法");
try (HighRedisLock redisLock = new HighRedisLock(redisTemplate, "highRedisLock", 30L)) {
if (redisLock.getLock()) {
log.info("进入了锁");
Thread.sleep(10000);
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
log.info("方法执行完成");
return "程序结束";}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tangbhgjk
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01