重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
小编给大家分享一下redis分布式锁的实现示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
创新互联专注于企业全网整合营销推广、网站重做改版、晋安网站定制设计、自适应品牌网站建设、H5响应式网站、商城开发、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为晋安等各大城市提供网站开发制作服务。
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); RedisCallbackbooleanRedisCallback = 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); RedisCallbackbooleanRedisCallback = 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分布式锁的实现示例”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!