谷粒商城8:分布式锁使用和springcache的整合

news2024/12/24 10:35:24

1.分布式锁redisson使用

①分布式锁简介

在这里插入图片描述

②分布式锁学习过程

在这里插入图片描述

③最终分析

加入锁为原子操作:设置过期时间+设置锁
删除锁为原子操作:业务流程+删除锁
将锁的过期时间调长

④Redisson的使用

  1. 引入依赖
  2. 程序化配置
  3. 使用
    1. 创建redisson客户端
      Redisson.create(“config”)
      config中保存redis的地址
    2. 获取一把锁
      redisson.getLock(“lock”)
    3. 设置逻辑
      try{lock.lock;
      业务逻辑}
      finally{lock.unlock;}
    4. 解决问题

⑤解决问题:

  1. 锁的续期
    不配置过期时间:有配置的看门狗,即锁会自动续期,默认30s,如果在执行业务期间锁过完三分之一10s,即重新恢复到30s,执行业务结束后,自动续期不生效
    自己
    配置过期时间:则没有看门狗效应,即为设置多少过期时间,则为多少
  2. 最佳实战:
    自己设置过期时间,这样省去续期操作

⑥读写锁

  1. 实战使用
    redisson.getReadWriteLock(“rw-lock”);
    lock.writelock();
    写操作
    lock.unlock();
    lock.readlock();
    读操作
    lock.unlock();
  2. 介绍
    写操作为互斥锁,读操作为共享锁
    写时不可写和读
    读时只能读不能写

⑦信号量(分布式信号量)

在这里插入图片描述

  • 信号量=多把锁
    存入一个"park":3
    每次停车 park.acquire() park-1
    每次释放 park.release() park+1

⑧闭锁

在这里插入图片描述

  • 相当于固定数量的资源(用完即没)
    存入一个"door":5
    每次door.countDown() door-1
    直到door-1到0 执行door.await()之后的方法

⑨更新数据需求

  • 需求
    缓存里的数据如何保证和数据库里的数据一致?
    双写模式:数据更新时,改数据库也改缓存数据
    (卡顿容易出现脏数据)
    失效模式:数据库改完之后,删掉缓存
    (还会出现脏数据)

⑩最佳实战

  • 数据经常修改:直接读数据库
  • 数据并发几率小,容忍大程度不一致:设置缓存
    缓存数据+读写锁+过期时间

2.springche的使用

①整体结构

在这里插入图片描述

②注解的使用(底层都为原子操作)

  • @Cacheable(value=“category”,key=“#root.methodName”)
    • 当前结果需要缓存
    • 缓存没有调用方法,缓存有则使用缓存
    • key自动生成 value序列化 TTL永不过期
  • 解决问题
    • key:spring.cache.redis.use-key-prefix=true设置默认加前缀为注解的value值(为cache的组)
      key="#root.methodName"指定名字为当前的方法名
    • TTL:spring.cache.redis.time-to-live=3600000设置过期时间为1个小时
    • value值:设置存储为json数据
      原理:CacheAutoConfig->RedisCacheConfig->RedisCacheManager->初始所有的缓存->每个缓存用的配置->如果有redisConfiguration则用,没有则用默认->自定义注入redisConfiguration
@EnableConfigurationProperties(CacheProperties.class)
@EnableCaching
@Configuration
public class MyCacheConfig {
    /**
     * 配置文件中的东西没有用到
     * <p>
     * 1、原来和配置文件绑定的配置类是这样的
     *  @return
     * @ConfigurationProperties(prefix="spring.cache") public class CacheProperties
     * 2、让他生效
     * @EnableConfigurationProperties(CacheProperties.class)
     */
    @Bean
    RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {

        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();


        //更改序列化机制
        config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
        //保存value为JSON
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
        //将配置文件中的所有配置都生效
        CacheProperties.Redis redisProperties = cacheProperties.getRedis();
        //设置配置文件中的各项配置,如过期时间
        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        if (redisProperties.getKeyPrefix() != null) {
            config = config.prefixKeysWith(redisProperties.getKeyPrefix());
        }
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }
        return config;
    }
}
  • @CacheEvict(value={“category”},key = “‘getLevel1Categorys’”)
    • 为失效模式,即当前写操作成功后,删除缓存中保存的数据
  • 需求:更新一个表,删除两个缓存
    • @Caching(evict = {
      @CacheEvict(value={“category”},key = “‘getLevel1Categorys’”),
      @CacheEvict(value={“category”},key = “‘getCatelogJson’”)
      })
    • @cacheEvict(value=“category”)直接删除分区的所有缓存
  • spring-cache的不足
  1. 读模式:
    缓存穿透:查询一个null数据。缓存空数据
    解决方案:spring.cache.redis.cache-null-values=true
    缓存击穿:大量并发同时查询一个正好过期的数据
    解决方案:加锁(让一个人查数据库)默认不加锁。
    @Cacheable(value={“category”},key=“#root.methodName”,sync = true)
    sync可以解决击穿
    缓存雪崩:大量key同时过期
    解决方案:指定过期时间。spring.cache.redis.time-to-live=3600000
  2. 写模式:
    读写加锁:
    引入cannel:记录mysql更新来更新数据库
    读多写多:直接查询数据库
  3. 总结
    常规数据(读多写少一致性要求不高):完全可以使用springcache
    特殊数据:特殊涉及

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/75970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.论文学习Modality-aware Mutual Learning for Multi-modal Medical Image Segmentation

目录一.摘要1.背景解决方法1.如何有效整合来自多模态医学图像的信息2.如何处理常见模式缺失的情况2.解决1.ML2.MA3.结论二.方法2.1模态特定模型Modality-specific Model2.2 Modality-Aware Module2.3互学策略Mutual Learning Strategy三.实验与结果3.1数据集和评估指标3.2运行细…

杨校老师课堂之Spring Boot框架面试题【开发工程师面试前必看】

1. 什么是 Spring Boot&#xff1f; Spring Boot 是 Spring 开源组织下的子项目&#xff0c;是 Spring 组件一站式解决方案&#xff0c;主要是简化了使用Spring 的难度&#xff0c;简省了繁重的配置&#xff0c;提供了各种启动器&#xff0c;使开发者能快速上手。 2. 为什么要用…

c#入门-别名引用

别名引用 如果你引用的命名空间中出现了同名的类&#xff0c;那么会无法判断你使用的类型。 当然&#xff0c;你可以使用完全限定名。 或者&#xff0c;你可以为其中一个类型指代别名。 使用引用命名空间语句&#xff0c;为一个标识符赋值一个类型。 可以使用这个标识符代替…

基于java+springmvc+mybatis+jsp+mysql的通信簿管理系统

项目介绍 前端页面&#xff1a; 功能&#xff1a;首页、日志信息、心情日志、相册信息、个人中心、后台管理 管理员后台页面&#xff1a; 功能&#xff1a;主页、个人中心、用户管理、日志信息管理、日志类别管理、心情日志管理、相册信息管理、系统管理 开发环境 开发语言&…

C#【必备技能篇】Marshal是什么?怎么用?

文章目录学习来源&#xff1a;MSDN官方文档一、Marshal是什么&#xff1f;1、英文释义&#xff1a;2、在MSDN中的定义&#xff1a;3、通俗理解&#xff1a;二、Marshal怎么用&#xff1f;【主要以一些实例来了解】1、Marshal下的方法_部分截图【C#源码】&#xff1a;2、一些示例…

自定义RBAC(3)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; RBAC类型的权限&#xff0c;本质上是一种对资源访问路径的控制&#xff0c;且具有典型的树型层次结构。而树型结构&#xff0c;天然地就有父结点和子结点的关系以…

【HarmonyOS】ArkTS Native开发——使用 system函数创建文件

ArkTS是HamronyOS优选的主力语言&#xff0c;但官方文档指南中对于Native应用开发并没有详细的描述&#xff0c;只有一篇Codelab可以学习&#xff08;简易Native C 示例&#xff08;ArkTS&#xff09; (huawei.com)&#xff09;&#xff0c;本文将在Native应用中使用C/C的syste…

计算机毕业设计ssm+vue基本微信小程序的早茶预定系统 uniapp 小程序

项目介绍 本文介绍了使用微信小程序技术开发早茶预定系统的设计与实现过程,首先对实现该系统的技术进行分析,说明选择Java后台技术和MySQL数据库的必要性,然后对基于微信小程序的早茶预定系统的需求进行分析。并接着对系统进行设计,包括架构设计、功能设计、数据库设计。最后进…

关于商业智能 BI 认知上的误区,你有几个

关于商业智能BI的介绍&#xff0c;网络上有太多的杂音&#xff0c;总而言之会把商业智能BI讲解的貌似很简单&#xff0c;感觉上买了一个工具就可以解决所有的问题&#xff0c;这其实是一个非常大的误区。 商业智能BI - 派可数据商业智能BI可视化分析平台 我这里总结了一下&…

宠物店微信小程序开发步骤_宠物店管理系统用什么做

大多数人对于动物医疗专业知识比较匮乏&#xff0c;再加上宠物医疗费用&#xff0c;日常用品都略高&#xff0c;宠物店/宠物医院的前景&#xff0c;再未来依旧可观。 相比于实体店&#xff0c;线上平台无疑有着更广阔的拓客渠道和销售前景&#xff0c;做宠物店/宠物医院小程序…

如何高效制作数据可视化大屏,大屏高效制作攻略分享,总有一款适合你

做数据可视化大屏可不是一件简单的事情&#xff0c;里面有很多技巧&#xff0c;像布局&#xff0c;配色&#xff0c;图表和素材的选用和搭配等等&#xff0c;里面有很多学问。一时半会也做不出一个大屏&#xff0c;即使你会做也需要一定的时间和精力&#xff0c;在大量的需求下…

ABAP学习笔记之——第十一章:Function ALV

一、Function ALV Function ALV 从名字中可以推出&#xff0c;是由 Function(函数)形式提供&#xff0c;因此开发者只需适当使用以有的功能即可。没有必要创建屏幕也没有必要一一写出代码&#xff0c;因此可认为是生产性比较高的方法。 例&#xff1a; *function ALV GRID和…

【测绘程序设计】——大地坐标与空间直角坐标转换

本文分享了 测绘程序设计——大地坐标(B,L,H)与空间直角坐标(X,Y,Z)转换(C#版与Python版),相关源代码(绝对完整,直接运行)与使用示例如下。 目录 Part.Ⅰ 使用示例Chap.Ⅰ C#版Chap.Ⅱ Python版Part.Ⅱ 代码分析Chap.Ⅰ C#版Chap.Ⅱ Python版Part.Ⅲ 源码下载Part.Ⅰ…

12.9 总结

一.复制带有随机指针的链表 要求结构和val都是一样 这个题目我们可以建立一个map表,把新的链表和旧的链表每个节点都构成一组key-val对应 然后遍历旧链表.找到对应的next值和random值 思路: 方法1:迭代map class Solution { public Node copyRandomList(Node head) { if(hea…

Mysql 8.0.31彻底卸载

我们有时需要将mysql卸载重新安装&#xff0c;然而如果不注意其中的细节&#xff0c;只是使用apt remove mysql-server命令是卸载不干净的&#xff0c;即使使用了apt purge mysql-server命令进行卸载再重新安装的mysql还是会保留着原来的密码。正确的操作方式是下面这样子的。 …

百度智能云发布基于Ampere® Altra®的高能效云服务器GR1实例

2021年&#xff0c;百度公布了2030年碳中和目标以及6条科学实现路径。首要举措便是建设更环保的数据中心。百度自建的数据中心PUE一直处于非常领先的位置。百度一直秉持“科技为更好”的可持续发展理念&#xff0c;依托全栈和领先的人工智能技术和丰富的产业实践&#xff0c;在…

前端项目工程化流程(简陋版)

背景 最近想要自己做开始一个项目&#xff0c;然后发现好像挺久没有出 从 0 开始 一个项目了&#xff0c;对项目的一些工程化方面的流程有点生疏了&#xff0c;感觉就是知道一个大概的流程&#xff0c;很多都要靠搜索引擎来帮忙&#xff0c;我就想整理一下&#xff0c;对于前端…

在node.js中使用​ JsonWebToken模块进行token加密

目录 一、token 1、什么是token 2、作用 二、Express中实现token的方法&#xff1a; 1、使用JWT模块&#xff1a;JsonWebToken 2、token验证的流程 3、Express中实现过程 ​ &#xff08;1&#xff09;安装、导入JsonWebToken模块 ​ &#xff08;2&#xff09;在登录…

stm32f767之PWM

仅作笔记&#xff0c;很多内容参考网友文章。 PWM 输出&#xff0c;是利用定时器的比较输出功能&#xff0c;所以就是配置定时器。 1&#xff0c;选择定时器8 tim1和tim8为高级定时器 一般我们选择内部时钟&#xff0c;也就是由APB 外设时钟提供。根据选择的输出IO口&#x…

手把手教你搭建视频去重系统

#01 背景 如今&#xff0c;短视频平台对各类搬运视频的检测力度和精确度越来越高了。无论是影视号的剪辑&#xff0c;还是从油管搬运&#xff0c;即使做了各类复杂的视频变换&#xff0c;都很容易被检测出来。作者都会收到提醒&#xff0c;严重的甚至被封号。 乔布斯演讲原始视…