当前位置: 首页 > news >正文

网站建设与维护期末试卷成都网站推广创新互联

网站建设与维护期末试卷,成都网站推广创新互联,网站建设合同封面,网页设计实训报告1200SpringBoot整合Redis实现分布式锁 分布式系统为什么要使用分布式锁#xff1f; 首先#xff0c;分布式系统是由多个独立节点组成的#xff0c;这些节点可能运行在不同的物理或虚拟机器上#xff0c;它们通过网络进行通信和协作。在这样的环境中#xff0c;多个节点可能同…SpringBoot整合Redis实现分布式锁 分布式系统为什么要使用分布式锁 首先分布式系统是由多个独立节点组成的这些节点可能运行在不同的物理或虚拟机器上它们通过网络进行通信和协作。在这样的环境中多个节点可能同时尝试访问和修改共享资源这就可能导致数据不一致和并发冲突的问题。 为了解决这个问题分布式锁被引入作为一种同步机制。分布式锁能够在分布式系统中提供全局唯一的锁确保在任意时刻只有一个节点能够访问和修改共享资源。当节点需要访问共享资源时它必须先获取分布式锁如果锁已经被其他节点持有则当前节点需要等待或执行其他操作。只有当节点成功获取到锁后才能对共享资源进行访问和修改。 此外分布式锁还可以帮助实现一些复杂的分布式系统需求如分布式事务、分布式缓存一致性等。通过使用分布式锁我们可以更好地控制并发访问保证数据的一致性和完整性提高系统的可靠性和稳定性。 实现分布式锁需要考虑到多种因素如锁的粒度、锁的公平性、锁的释放机制等。同时由于分布式系统的复杂性和不确定性分布式锁的实现也可能存在一些挑战和限制如网络延迟、节点故障等问题都可能导致锁的行为变得复杂和难以预测。因此在使用分布式锁时我们需要根据实际情况进行权衡和选择确保能够满足系统的需求并避免潜在的问题。 分布式系统使用分布式锁是为了实现资源的同步访问和并发控制保证数据的一致性和完整性提高系统的可靠性和稳定性。 redis配置类 package com.test.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer;/*** author TANGSHUAI* version 1.0* date 2023-06-09 10:58*/ Configuration public class RedisConfig {Beanpublic RedisTemplateString, String redisTemplate(RedisConnectionFactory factory) {RedisTemplateString, String redisTemplate new RedisTemplate();redisTemplate.setConnectionFactory(factory);//设置序列化Key的实例化对象redisTemplate.setKeySerializer(new StringRedisSerializer());//设置序列化Value的实例化对象redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());return redisTemplate;}} 分布式锁工具类 package com.test.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.stereotype.Component;import java.util.Collections; import java.util.concurrent.TimeUnit;/*** author TANGSHUAI* version 1.0* date 2024-03-08 14:33*/ Component public class RedisDistributedLock {Autowiredprivate StringRedisTemplate stringRedisTemplate;/*** 尝试获取分布式锁** param lockKey 锁* param requestId 请求标识* param expireTime 超期时间* return 是否获取成功*/public boolean tryGetDistributedLock(String lockKey, String requestId, int expireTime) {return stringRedisTemplate.opsForValue().setIfAbsent(lockKey, requestId, expireTime, TimeUnit.SECONDS);}/*** 释放分布式锁** param lockKey 锁* param requestId 请求标识* return 是否释放成功*/public boolean releaseDistributedLock(String lockKey, String requestId) {String script if redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end;Long result stringRedisTemplate.execute(new DefaultRedisScriptLong(script, Long.class),Collections.singletonList(lockKey),requestId);System.out.println(result);return result.equals(1L);} } 定时任务测试分布式锁 package com.test.service;import com.test.config.RedisDistributedLock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;/*** author TANGSHUAI* version 1.0* date 2024-03-08 14:44*/ Service public class TestService {Autowiredprivate RedisDistributedLock redisDistributedLock;Scheduled(cron 0/10 * * * * ?)//Scheduled(cron 0 10 16 * * ?)Transactional(rollbackFor Exception.class)public void testLock(){System.out.println(进入分布式锁方法);// 尝试获取分布式锁if (redisDistributedLock.tryGetDistributedLock(tangshuai, 123, 30)) {System.out.println(释放分布式锁);redisDistributedLock.releaseDistributedLock(tangshuai, 123);} else {// 未能获取到锁可以选择重试或返回失败throw new RuntimeException(未能获取到锁,请重试);}} } 分别启动两个相同的服务 package com.test;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling;/*** author TANGSHUAI* version 1.0* date 2023-06-08 17:04*/ SpringBootApplication EnableScheduling public class SaTokenDemoApp {public static void main(String[] args) {SpringApplication.run(SaTokenDemoApp.class, args);} } 查看两个控制台打印情况两个服务谁谁拿到锁谁开始执行业务代码没拿到锁的服务抛出异常
http://www.pierceye.com/news/239988/

相关文章:

  • 做网站用矢量图还是位图安徽省住房和建设厅网站
  • 彭阳网站建设多少钱嘉兴专业的嘉兴专业网站建设项目
  • 网站建设导航分哪几类公司网站大全
  • 网站建设 实训题安能建设总公司网站打不开
  • 莱西网站建设龙岗中心城有学网站建设
  • 重庆技术网站建设宝安做网站哪家好
  • 仿制网站建设写网站建设的软文
  • 0基础网站建设教程wordpress去掉rss订阅
  • 爱网站查询外贸推广具体是做什么
  • 商务网站价格找人做效果图那个网站
  • 上传到网站租一个服务器要多少钱
  • 网站制作服务合同安徽建设工程信息网文件
  • 成都企业网站建设公司正规的跨境电商平台有哪些
  • 中山工程建设信息网站网站监控系统
  • 个人网站想添加支付功能怎么做北京二次感染最新消息
  • 上海注册汽车租赁公司网站模板对seo的影响
  • 上海松江做网站公司wordpress 网站暂停
  • 太仓苏州网站建设网站的规划与建设课程设计
  • 遵义住房城乡建设厅网站电子商务网店毕业设计
  • 惠州市博罗县建设局网站防静电产品东莞网站建设技术支持
  • 茂名整站优化百度一下 你知道首页
  • 郑州网站微信微博维护品牌网站建设流程图
  • 网站建站销售怎么做做门窗安装去哪些网站找生意
  • 太原建站司点击查看荆州网站开发
  • 个人音乐网站开发宁波网站推广工作室电话
  • 建设部网站 造价工程师wordpress忘了秘密
  • 如何分析一个网站建设策划案湖南网络推广公司大全
  • 惠州市建设工程交易中心网站如何制作网页导航栏
  • 保山网站建设哪家好做led视频好的网站
  • 如何利用网站策划做好网站建设申请域名要多少钱