深圳网站 建设,网站备案表上面的开办单位写什么,赤峰建设局网站,海口企业网站建设制作哪家专业目录
应用场景
代码实例1#xff1a;
代码实例2#xff1a;
setIfAbsent#xff1a;
expire#xff1a;
举例说明#xff1a;
代码实例3#xff1a;
代码实例4#xff1a; 还是一个同事问的一个问题#xff0c;然后闲着没事就记录下来了。多人操作同一个保单
代码实例2
setIfAbsent
expire
举例说明
代码实例3
代码实例4 还是一个同事问的一个问题然后闲着没事就记录下来了。多人操作同一个保单会出现数据不一致所以呢就准备为此单子加一个锁所以就有了下面的代码。分享给大家 分布式锁的定义大家基本都很了解了具体就是当需要在分布式环境中保证资源的互斥访问或一致性时就可以考虑使用分布式锁。但需要注意的是分布式锁虽然可以解决问题但也会带来一定的性能开销和复杂度因此在使用时需要权衡系统的性能和可维护性以及使用分布式锁所带来的成本和风险。
应用场景
发任务调度在分布式系统中当需要对某个任务进行调度时如果多个节点同时发起任务调度请求可能会导致任务被多次执行。这时可以使用分布式锁来确保只有一个节点能够成功获取到任务调度的锁从而避免任务的重复执行。分布式事务在分布式事务中需要保证不同节点对共享资源的访问是互斥的以防止数据不一致的问题。分布式锁可以用来保证在事务执行过程中各个节点之间对共享资源的访问是互斥的。分布式缓存在分布式缓存中如果多个节点同时对缓存进行访问和修改可能会导致缓存中的数据不一致。这时可以使用分布式锁来确保各个节点对缓存的访问是互斥的。购买限制在电商等场景中如果需要对某个商品的购买数量进行限制当多个用户同时发起购买请求时可以使用分布式锁来确保只有一个用户能够成功获取到购买锁从而避免超卖等问题。
代码实例1
redisTemplate.opsForValue().setIfAbsent(redisLock, uuid, 1000, TimeUnit.SECONDS);这段代码是使用Spring Data Redis的RedisTemplate来执行一个Redis操作。具体来说它尝试在Redis中设置一个键值对但仅当该键不存在时。
详细解释如下
ruleRefreshLock这是要设置的Redis键。uuid这是要设置的Redis值。1000这是值的过期时间单位是毫秒。TimeUnit.SECONDS这是过期时间的单位这里是秒。
setIfAbsent方法的行为如下
如果键ruleRefreshLock在Redis中不存在那么它会设置这个键的值为uuid并给这个键设置一个1000秒的过期时间。此时setIfAbsent方法返回true。如果键ruleRefreshLock在Redis中已经存在那么它不会做任何操作并且setIfAbsent方法返回false。
这个方法通常用于实现分布式锁。在这个例子中你可能想要确保只有一个实例或线程能够获取到ruleRefreshLock这个锁。如果锁已经被其他实例或线程获取即键已经存在那么当前实例或线程就不会再尝试获取锁。如果锁未被获取即键不存在那么当前实例或线程就会获取锁并设置一个过期时间以确保锁最终会被释放。
代码实例2
设置KEY值过期时间
//假设 lockName 是你的锁的名称expireTime 是你希望锁持续的时间以分钟为单位
redisTemplate.expire(lockName, expireTime, TimeUnit.MINUTES);
这段代码是使用 RedisTemplate 来设置 Redis 中某个键的过期时间。这与之前的 setIfAbsent 操作有所不同主要区别如下
setIfAbsent
目的尝试设置一个键值对但仅当该键不存在时。返回值如果键原本不存在且成功设置了键值对返回 true如果键已经存在则不做任何操作并返回 false。用途通常用于实现分布式锁或其他需要原子性设置键值对的场景。
expire
目的为已存在的键设置或更新其过期时间。返回值如果键存在则成功设置或更新过期时间并返回 true如果键不存在则不进行任何操作并返回 false。用途通常用于确保存储在 Redis 中的数据在一段时间后被自动删除以避免内存无限制增长。
举例说明
假设你已经有了一个名为 lockName 的锁并且这个锁已经被某个实例获取即该键在 Redis 中已经存在。你想让这个锁在一段时间后自动释放那么你可以使用 expire 方法来设置锁的过期时间。 代码实例3
redis版本 spring-data-redis-2.7.10.jar
Slf4j
Component
public class redisSchedule implements SchedulingConfigurer {Value(${rule.limit.cron})private String cron;Value(${schedule.rule})private String scheduleRule;Autowiredprivate StringRedisTemplate redisTemplate;Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.addCronTask(() - {// 分布式锁集群环境只允许一台服务修改定时任务String uuid UUID.randomUUID().toString();Boolean bool redisTemplate.opsForValue().setIfAbsent(redisLock, uuid, 1000, TimeUnit.SECONDS);try {if (bool) {//逻辑代码}} catch (Exception e) {log.error(e.getMessage());} finally {// 释放锁先比对自己锁的值是否相等相等则为自己的锁String script if redis.call(get,KEYS[1]) ARGV[1] then return redis.call(del,KEYS[1]) else return 0 end;redisTemplate.execute(new DefaultRedisScriptLong(script, Long.class), Arrays.asList(redisLock), uuid);}}, cron);}
}
代码实例4
redis版本 spring-data-redis-1.8.0.RELEASE.jar
//锁的过期时间默认为5分钟
private Long expireTime 5L;try {//多个执行任务去获得锁如果没有获取证明还有任务在执行中那么将不再执行任务Boolean isLock redisTemplate.opsForValue().setIfAbsent(lockName, lock);if (isLock){//获取到锁那么设置过期时间防止死锁this.redisTemplate.expire(lockName, expireTime, TimeUnit.MINUTES);//逻辑代码}else {logger.info(任务执行锁定失败Lock被占用当前分片);throw new Exception(任务执行锁定失败);}} catch (Exception e) {e.printStackTrace();throw new Exception(e.getMessage());} 总结一下setIfAbsent 用于在键不存在时设置键值对并返回操作是否成功的布尔值而 expire 用于设置或更新已存在键的过期时间并返回操作是否成功的布尔值。这两个操作经常一起使用来实现分布式锁其中 setIfAbsent 用于尝试获取锁而 expire 用于设置锁的过期时间以确保锁最终会被释放。两种方式的用法看对应的应用场景来使用