redis分布式锁的实现示例
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,小编给大家分享一下redis分布式锁的实现示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Redissonredisso
千家信息网最后更新 2026年11月03日redis分布式锁的实现示例
小编给大家分享一下redis分布式锁的实现示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
Redisson
redisson和下列一下自行封装两种方式的区别(场景):
redisson未获取到锁的会进入等待,直到获取到锁。
另外两种方式如果未获取到锁,会放弃,不会执行业务代码。
org.redisson redisson-spring-boot-starter 3.13.6
@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)
org.springframework.boot spring-boot-starter-data-redis
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 booleanRedisCallback = new RedisCallback() { @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 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 booleanRedisCallback = new RedisCallback() { @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 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 "程序结束";}以上是"redis分布式锁的实现示例"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
方法
篇文章
封装
分布式
示例
业务
代码
内容
方式
程序
线程
不怎么
场景
大哥
大部分
更多
知识
行业
资讯
资讯频道
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技网
云之行互联网科技
互联网科技工作委员会
为想互联网科技怎么样
国智互联网科技
互联网属科技
上游互联网科技
安控科技rtu产品工业互联网
互联网科技博主是什么意思
常德市电业局互联网科技部
现代互联网科技股
互联网金融中的现代科技
移动互联网年度科技创新
互联网科技如何创业
卓翼科技产业互联网合作
半导体是互联网高科技吗
长沙渺峰互联网科技有限公司
中国科技和美国互联网
互联网时代高科技布局
恒生科技互联网指数十大成分股
互联网品科技
狮子座互联网科技
科技创新互联网企业
互联网科技小额贷款
科技赋能互联网健康
互联网实体化科技化
福州新华互联网科技学校 知乎
宁夏众和广鑫互联网科技有限公司
银川新华互联网科技学校联系电话
北京品多多互联网科技有限公司