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

公司网站建设方案详细方案模板南昌网站设计企业

公司网站建设方案详细方案模板,南昌网站设计企业,安徽网页设计,电脑培训机构哪里有目录 一、锁的使用场景 二、如何实现控制#xff1f; 三、单台服务器使用锁的场景 四、分布式锁 五、Redis 实现分布式锁及存在问题 六、Redisson 实现分布式锁 七、定时任务#xff0b;锁 一、锁的使用场景 1. 控制定时任务执行 定时任务多次执行浪费资源#xff…目录 一、锁的使用场景 二、如何实现控制 三、单台服务器使用锁的场景 四、分布式锁 五、Redis 实现分布式锁及存在问题 六、Redisson 实现分布式锁 七、定时任务锁 一、锁的使用场景 1. 控制定时任务执行 定时任务多次执行浪费资源多台服务器到同一时间都执行缓存预热脏数据多台服务器重复插入数据 2. 买票场景 只有一百张票用户买票时判断剩余票的数量还有剩余执行票数减一的操作只剩一张票了此时多个用户来买票判断票都是有剩余但是第一个用户买完之后就没票了其他用户也执行了票数减一的操作出现超卖现象 3. 需求控制定时任务 / 需要加锁的任务在同一时间只能有一台服务器执行 二、如何实现控制 以定时任务为例 1. 分离定时任务程序和主程序只在一台服务器运行定时任务成本太大 2. 写死配置每个服务器都执行定时任务但是只有 IP 符合配置的服务器才真实执行业务逻辑其他的直接返回。成本最低但是我们的 IP 可能是不固定的把 IP 写的太死了 3. 动态配置配置是可以轻松的、很方便地更新的代码无需重启项目无需重新部署但是只有 IP 符合配置的服务器才真实执行业务逻辑。 读取数据库中的配置 Redis 配置中心Nacos、Apollo、Spring Cloud Config 问题服务器多了、IP 不可控还是很麻烦还是要人工修改 4. 分布式锁只有抢到锁的服务器才能执行业务逻辑 坏处增加成本好处不用手动配置多少个服务器都一样 三、单台服务器使用锁的场景 1. Java 实现同步锁synchronized 关键字 2. 锁存在 JVM 中每台 JVM 独立不共享锁多机部署锁会失效多个线程都会获取到不同 JVM 中的同一名称的锁 3. 单机就会存在单点故障 四、分布式锁 1. 为什么需要分布式锁 普通锁的缺点JVM 机分配的锁在多台 Tomcat 中不共享锁只对单个服务器有效加锁的重要性资源有限 / 特定情况下只能有有限 / 唯一的线程获取到锁执行操作分布式锁多进程可见且并且互斥的锁 2. 如何实现分布式锁 实现分布式锁的核心思想 / 怎么保证同一时间只有一台服务器能抢到锁 先来的人先把数据改成自己的标识服务器 IP后来的人发现标识已存在就抢锁失败继续等待等先来的人执行方法结束把标识清空释放锁其他的人继续抢锁 MySQL 数据库select for update 行级锁最简单乐观锁实际上没有加锁乐观锁认为线程安全问题只在少数情况下会发生所以只要在数据更新时判断是否有其他线程修改了数据Redis 实现互斥锁基于内存读写速度快 set nx ex原子性、设置过期时间lua 脚本保证多条语句的原子性Zookeeper 五、Redis 实现分布式锁及存在问题误删锁 1. set nx ex 2. 释放锁 手动释放del lock意外服务器宕机手动释放锁还未执行优化设置过期时间若未手动释放则等到过期时间到了就会自动释放锁 3. 误删锁 线程 A 在执行时阻塞过了锁的过期时间锁自动释放线程 B 尝试获取锁获取成功执行业务A 阻塞之后继续执行执行结束释放当前正在被线程 B 占有的锁线程 C 尝试获取锁获取成功执行业务出现线程 B 和线程 C 并发执行的情况 4. 解决误删锁 判断当前锁的占有线程是不是本线程如果不是自己占有的锁就不去释放别人的锁 5. 改进锁之后仍然存在问题判断锁和释放锁的原子性问题 判断锁时是自己正在占有锁判断锁标识后执行释放锁之前线程出现了阻塞锁到了过期时间自动释放其他线程尝试获取锁获取成功阻塞之后执行释放锁还是把别人的锁给释放了需要保证判断锁和释放锁操作的原子性Lua 脚本 六、Redisson 实现分布式锁 Githubhttps://github.com/redisson/redisson 官网Redisson: Easy Redis Java client with features of In-Memory Data Grid 1. 定义 Redisson 是一个在 Redis 基础上实现的 Java 驻内存数据网格提供了一系列分布式的 Java 常用对象还提供了许多分布式服务各种分布式锁的实现 2. 自己编写 Redisson 的配置创建 RedissonClient 不推荐使用 spring-boot-starter 整合的 Redisson版本迭代较快容易发生冲突创建 config 对象添加 Redis 配置读取 application.yml 中的配置信息创建 Redisson 实例返回 Redisson 客户端实例 /*** Redisson 配置* author 乐小鑫* version 1.0* Date 2024-01-21-15:44*/ Configuration ConfigurationProperties(prefix spring.redis) Data public class RedissonConfig {private String host;private String port;private String password;Beanpublic RedissonClient getRedissonClient() {// 1. 创建配置Config config new Config();String redisAddress String.format(redis://%s:%s, host, port);config.useSingleServer().setAddress(redisAddress).setPassword(password).setDatabase(3);// 2. 创建 Redisson 客户端实例并返回RedissonClient redisson Redisson.create(config);return redisson;} } 3. 测试 Redisson 的功能实现 /*** author 乐小鑫* version 1.0* Date 2024-01-21-15:53*/ SpringBootTest public class RedissonTest {Resourceprivate RedissonClient redissonClient;Testvoid test() {// listListString list new ArrayList();list.add(ghost);System.out.println(List: list.get(0));RListObject rList redissonClient.getList(test-list);rList.add(ghost);System.out.println(rList: rList.get(0));} }4. 看门狗机制的原理 监听当前线程当前线程没有执行结束就每十秒续期一次如果线程挂了注意 Debug 模式时断点过久也会被当成服务器宕机来处理看门狗机制失效则不会续期参考文章Redisson 分布式锁的watch dog自动续期机制_redisson续期-CSDN博客 七、定时任务锁 1. getLock()获取 Redisson 的锁对象需要指定锁的名称 2. tryLock()尝试获取锁分布式锁获取成功返回 true可以指定重试获取锁的等待时间和锁的释放时间 waitTime 设置为 0尝试获取锁获取失败等待时间为 0直接放弃获取锁只尝试一次因为这里是用户推荐列表的缓存预热定时任务如果获取锁失败说明已经有服务器去执行定时任务了只要执行一次就好了所以不用再去尝试获取锁 3. unlock()释放锁放到 finally 语句块中执行如果 try 语句块中的内容出现异常也会释放锁避免发生死锁的情况 /*** 缓存预热定时任务* author 乐小鑫* version 1.0*/ Component Slf4j public class PreCacheUser {Resourceprivate RedisTemplate redisTemplate;Resourceprivate UserService userService;Resourceprivate RedissonClient redissonClient;ListLong mainUserList Arrays.asList(3L);// 重要用户列表为该列表的用户开启缓存预热Scheduled(cron 0 59 21 ? * * )// 每天 21:59 执行定时任务进行用户数据缓存预热public void doPreCacheUser() {// 获取锁对象RLock lock redissonClient.getLock(langhua:precachejob:doprecache:lock);try {if (lock.tryLock(0,30000L,TimeUnit.MILLISECONDS)) {log.info(get redisson lock Thread.currentThread().getId());// 查出用户存到 Redis 中for (Long userId : mainUserList) {QueryWrapperUser queryWrapper new QueryWrapper();PageUser userPage userService.page(new Page(1, 20), queryWrapper);// 查询所有用户String key String.format(langhua:user:recommend:%s, userId);ValueOperations valueOperations redisTemplate.opsForValue();// 将查询出来的数据写入缓存try {valueOperations.set(key,userPage,24, TimeUnit.HOURS);} catch (Exception e) {log.error(redis key set error, e);}}}} catch (InterruptedException e) {log.error(redisson precache user error, e);} finally {// 释放锁log.info(redisson unlock Thread.currentThread().getId());lock.unlock();}} }
http://www.dnsts.com.cn/news/233217.html

相关文章:

  • 专注软件优化分享的网站北京网站开发建设公司
  • 网站开发最新技术福州网站建设制作首选荧光信息
  • 网站开发技术要求深圳建设网站企业
  • 设计网站官网狗wordpress特定用户特定分类
  • 做图片的网站有哪些深圳市水榭花都房地产公司
  • 网站建站后维护需要做哪些网站开发后台需要自己写吗
  • 企业网站优化方案范本南宁网站seo公司哪家好
  • 做网站网页广州天河区房价多少钱一平方
  • 一般去哪个网站做写手营销策划专业
  • 站设计网站官网计算机网络技术是干嘛的
  • 深圳网站建设 乐云践新最新新闻资讯
  • 网站建设首页面做外包哪个网站好一些
  • 深圳开发的相亲网站珠宝网站源码
  • 智能网站设计哪家好建设一个网站的基本成本
  • 电子商务网站建设信息企业网站的功能可分为前台和后台两个部分
  • 七初SEO网站建设软文编辑
  • 企业网站收费网络营销的推广方式有哪些
  • 网站建设类的论文题目凡科做的网站
  • 一个网站的建设流程图网络服务提供者不得向未成年提供诱导其沉迷的服务
  • 网站建设先进上海网站建设哪家好
  • 怎样做一个简单的网站首页移动互联网开发的学习心得
  • 个人网站做导购要什么经营许可网站优化的方式有哪些
  • copyright技术支持 东莞网站建设介绍网页设计
  • 扬中网站建设开发北京交易中心网站
  • 湖南省建筑设计院集团有限公司seo网络优化公司排名
  • 余姚网站建设网上卖东西怎么卖
  • 安监网站如何做紧急预案备案佛山企业网站自助建站
  • 对网站建设 意见和建议深圳企业网站设
  • 济南企业网站推广方法网站后台上传文字图片
  • ui在线设计网站武夷山网站推广服务