小编给大家分享一下redis分布式锁的实现示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Redisson

redisson和下列一下自行封装两种方式的区别(场景):

redisson未获取到锁的会进入等待,直到获取到锁。

另外两种方式如果未获取到锁,会放弃,不会执行业务代码。

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.13.6</version></dependency>

@AutowiredprivateRedissonredisson;@GetMapping("/redissonLock")publicStringredissonLock(){log.info("进入了方法");RLocklock=redisson.getLock("redissonLock");try{lock.lock(30,TimeUnit.SECONDS);Thread.sleep(10000);System.out.println("我是你大哥");}catch(InterruptedExceptione){e.printStackTrace();}finally{//如果不释放,不会唤起其他线程,则其他线程会超时过期自动唤醒,不会执行业务代码lock.unlock();}return"运行结束";}

RedisTemplate封装redis锁(1)

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

packagecom.util;importorg.springframework.dao.DataAccessException;importorg.springframework.data.redis.connection.RedisConnection;importorg.springframework.data.redis.connection.RedisStringCommands;importorg.springframework.data.redis.core.RedisCallback;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.core.script.RedisScript;importorg.springframework.data.redis.core.types.Expiration;importorg.springframework.stereotype.Component;importjava.util.Arrays;@ComponentpublicclassRedisLock{privatestaticRedisTemplateredisTemplate;privatestaticStringscript="ifredis.call(\"get\",KEYS[1])==ARGV[1]then\n"+"\treturnredis.call(\"del\",KEYS[1])\n"+"else\n"+"\treturn0\t\n"+"end";publicRedisLock(RedisTemplateredisTemplate){RedisLock.redisTemplate=redisTemplate;}publicstaticBooleangetLock(Stringkey,Stringvalue,LongexpireTime){RedisStringCommands.SetOptionsetOption=RedisStringCommands.SetOption.ifAbsent();Expirationexpiration=Expiration.seconds(expireTime);RedisCallback<Boolean>booleanRedisCallback=newRedisCallback<Boolean>(){@OverridepublicBooleandoInRedis(RedisConnectionconnection)throwsDataAccessException{returnconnection.set(redisTemplate.getKeySerializer().serialize(key),redisTemplate.getValueSerializer().serialize(value),expiration,setOption);}};return(Boolean)redisTemplate.execute(booleanRedisCallback);}publicstaticBooleanunLock(Stringkey,Stringvalue){RedisScript<Boolean>redisScript=RedisScript.of(script,Boolean.class);return(Boolean)redisTemplate.execute(redisScript,Arrays.asList(key),value);}}

@GetMapping("/redisLock")publicStringredisLock(){log.info("进入了方法");Stringkey="redisLock";Stringuuid=UUID.randomUUID().toString();try{if(RedisLock.getLock(key,uuid,30L)){log.info("进入了锁");Thread.sleep(10000);}}catch(InterruptedExceptione){e.printStackTrace();}finally{RedisLock.unLock(key,uuid);}log.info("方法执行完成");return"程序结束";}

RedisTemplate封装redis锁(2)

packagecom.util;importlombok.extern.slf4j.Slf4j;importorg.springframework.dao.DataAccessException;importorg.springframework.data.redis.connection.RedisConnection;importorg.springframework.data.redis.connection.RedisStringCommands;importorg.springframework.data.redis.core.RedisCallback;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.core.script.RedisScript;importorg.springframework.data.redis.core.types.Expiration;importjava.util.Arrays;importjava.util.UUID;@Slf4jpublicclassHighRedisLockimplementsAutoCloseable{privateRedisTemplateredisTemplate;privateStringkey;privateStringvalue;privateLongexpireTime;privatestaticStringscript="ifredis.call(\"get\",KEYS[1])==ARGV[1]then\n"+"\treturnredis.call(\"del\",KEYS[1])\n"+"else\n"+"\treturn0\t\n"+"end";publicHighRedisLock(RedisTemplateredisTemplate,Stringkey,LongexpireTime){this.redisTemplate=redisTemplate;this.key=key;this.value=UUID.randomUUID().toString();this.expireTime=expireTime;}publicBooleangetLock(){RedisStringCommands.SetOptionsetOption=RedisStringCommands.SetOption.ifAbsent();Expirationexpiration=Expiration.seconds(expireTime);RedisCallback<Boolean>booleanRedisCallback=newRedisCallback<Boolean>(){@OverridepublicBooleandoInRedis(RedisConnectionconnection)throwsDataAccessException{returnconnection.set(redisTemplate.getKeySerializer().serialize(key),redisTemplate.getValueSerializer().serialize(value),expiration,setOption);}};return(Boolean)redisTemplate.execute(booleanRedisCallback);}publicBooleanunLock(){RedisScript<Boolean>redisScript=RedisScript.of(script,Boolean.class);return(Boolean)redisTemplate.execute(redisScript,Arrays.asList(key),value);}@Overridepublicvoidclose()throwsException{unLock();}}

@AutowiredprivateRedisTemplateredisTemplate;@GetMapping("/highRedisLock")publicStringhighRedisLock(){log.info("进入了方法");try(HighRedisLockredisLock=newHighRedisLock(redisTemplate,"highRedisLock",30L)){if(redisLock.getLock()){log.info("进入了锁");Thread.sleep(10000);}}catch(InterruptedExceptione){e.printStackTrace();}catch(Exceptione){e.printStackTrace();}log.info("方法执行完成");return"程序结束";}

以上是“redis分布式锁的实现示例”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!