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

对redis、redisson、springcache总结

<一> redis-缓存中间件

  1. 什么是redis
    redis是c语言开发的,一个高性能key-value键值对内存数据库,可以用来做数据库、缓存、消息中间件的一种非关系型数据库。

  2. redis数据存储在哪里
    内存和磁盘中,但是redis的读写都在内存中,这也是速度快的原因之一。
    对于高频繁访问的数据,存储在内存中方便访问。
    为了避免服务宕机或者重启数据丢失,也可以将数据存储在磁盘中持久化。

  3. redis的数据类型
    String、set、zset、list、hash

  4. redis为什么响应速度快
    1) 基于内存存储,redis的读写都是基于内存的key-value操作。内存远大于磁盘响应速度。
    2) 单线程操作,避免了多线程cpu来回切换和各种加锁和解锁的资源消耗。
    redis的单线程操作是指一个模块的操作单线程,其他该多线程的还是使用多线程。
    3)丰富的数据结构
    redis是基于key-velue键值对存储的缓存数据库,对于key都是string类型,但是vlue有多种数据类型
    4)高性能的多复用IO模型

  5. 为什么需要使用redis
    redis的响应速度快读10w+,写8w,对于一些业务场景(可以将计算的结果-菜单等存储到缓存中,下次直接getfromredis)

  6. redis怎么配置、步骤
    1) pom文件加上依赖


    org.springframework.boot
    spring-boot-starter-data-redis



    io.lettuce
    lettuce-core


2) 配置文件加上redis服务器的host port user psw等信息
3)使用springboot自动配置好的StringRedisTemplete工具来操作redis进行读写操作,
@Autowired
StringRedisTemplete stringRedisTemplete;
// 读
stringRedisTemplete.opsForValue.get(“keyName”)
// 写
stringRedisTemplate.opsForValue().set(“keyName”, value, 1, TimeUnit.DAYS); // 设置过期时间 防止缓存数据与数据库不一致

  1. redis怎么进行get,set,读写数据
    使用StringRedisTemplete .get(“keyname”) /.set(“keyname”,“value”,“time”,“时间单位”)

  2. redis有哪些参数
    key-String
    value-list,string、set、zset、hash
    过期时间-过期删除,重新sql获取set到缓存中,与数据库数据保持一致
    过期时间的单位

  3. redis缓存容易出现的问题
    1)缓存穿透
    reason: 大量并发请求一个不存在的数据,到缓存中null,之后大量请求到了数据库中,数据库压力过大崩了。这种是缓存穿透。
    way: 即使数据库中为null的数据,也存储一个标识到缓存中,并且设置一个过期时间。

2)缓存雪崩
r:大量不同业务模块的请求到缓存,但是对应的数据同时过期了,导致所有的请求到db-压力大。
w:设置不同的过期时间,可以在配置文件中统一配置,因为不同业务key存储的时间不同,过期点也不会相同。

3)缓存击穿
r:大量恶意请求到一个热点词,刚好这个key过期了。db压力过大
w:加锁-记得双重验证,每次只允许一个请求进入db-get->db,其他没有进去锁的去访问缓存即可。

  1. 本地锁(不是redis分布式锁,加关键字Synchronized等)
    本地锁只能锁住同一个进程里面的线程,如果是分布式下,即使每个服务仅仅放一个线程进来,相互是隔离的,不能只锁住一个。这个时候需要分布式锁-redisson(使用redis分布式锁-没有看门狗机制)

  2. redis怎么保证与数据库数据一致(更新数据库)
    1)双写模式
    先更新数据库,再去更新缓存对应的key,这种缓存中可能会短暂出现脏数据,稳定后缓存过期-重新读取db即可保证最新数据。
    2)失效模式
    先写数据库,后删除缓存。这种也可能短暂出现缓存有脏数据,稳定后即可

        无论是更新缓存还是删除缓存都会有脏数据,解决如下
    

    1)失效模式-使用双删模式
    先删除缓存->更新db-隔几秒再去删除缓存
    2)使用MQ消息队列,消费者监听queue消息去删除缓存
    生产者(更新db)->MQ->queue有数据->customer监听到->删除缓存->告知queue是否删除成功,失败queue再次发送。(不需要写代码,mq本身会重复出队。解耦修改数据库和查询数据库解耦,不会造成缓存有脏数据)

11.缓存锁使用的原则
正常数据,缓存加上过期时间,就可以实现数据一致性。
对于实时性要求高的,最好是到数据库中读取。
对于频繁修改的数据,不建议加读写锁,性能会慢。

<二> redisson-分布式锁

  1. redisson是什么
    redisson是基于redis的分布式框架,提供了分布式锁等服务

  2. 为什么需要分布式锁
    本地锁只能锁住当前进程-一个服务的线程,所以需要分布式锁。

  3. redission配置步骤
    1)pom文件加上依赖(前提是有redis依赖)

    org.redisson
    redisson
    3.12.0

    2)配置redis配置信息

  4. redisson提供的分布式锁与redis自己的分布式锁区别
    1)redisson提供的分布式锁
    -分布式下也只能有一个线程占用锁,执行业务代码,直至解锁,下一个thread才能进来执行。
    使用RedissonClient加锁—不会出现死锁----锁会自动过期
    @Autowried
    RedissonClient client;
    // 1. 获取锁mylock 只要锁的名字相同 就是同一把锁
    RLock myLock = redisson.getLock(“myLock”);
    // 2. 加锁
    myLock.lock(); // 阻塞锁
    // 业务代码
    try {
    System.out.println(“加锁成功,执行业务…” + Thread.currentThread().getId());
    Thread.sleep(3000);
    } catch (Exception e) {
    } finally {
    // 3. 解锁
    // 即使业务代码执行失败或者断电,没有解锁成功,也不会出现死锁,
    // RedissonClient不会出现死锁
    System.out.println(“释放锁” + Thread.currentThread().getId());
    myLock.unlock();
    }

2)redis提供的分布式锁
使用StringRedisTemplate加锁
Boolean lock = stringRedisTemplate.opsForValue().setIfAbsent(
“lockValue”,
uuid,
5,
TimeUnit.SECONDS);

3) redis-StringRedisTemplate分布式锁与redisson-RedissonClient 分布式锁区别。
区别在于
1.–redisson分布式锁有看门狗机制,一个线程占用锁之后,如果锁没有释放之前,redisson会自动给锁续期(10s检查一次锁是否释放,续期time-30s),不会过期,直至线程结束锁释放。
2- -redis 的stringRedisTemplate分布式锁不会自动续期。
redisson加锁的业务代码只要完成,就不会自动给锁续期,即使不unlock,锁默认在30s后自动删除。即使服务宕机-业务结束,也不会出现死锁,锁会自动过期。

  1. 读写锁相关
    // 6.1 读写锁(可以获read-write)
    RReadWriteLock readWriteLock = redissonClient.getReadWriteLock(“catalogJson-lock”);
    // 6.2 写锁
    RLock wLock = readWriteLock.writeLock();
    // 6.3 读锁
    RLock rLock = lock.readLock();
    注意
    1)一个读锁可以被多个thread线程占用不互斥。
    2)写锁与其他锁都互斥,一次只能有一个线程占用锁,其他写或者读必须等待。

  2. 分布式锁的几个参数
    创建锁的过期时间,时间单位,redisson分布式锁默认是10s查看一次锁是否还在,如果在自动延长30s(前提是没有手动设置过期时间)

  3. redisson分布式锁的特点
    1)一次只能有一个进程的一个线程进来
    2)有看门狗机制,redisson–自动续期30s,业务未执行完,其他锁进来造成数据紊乱
    3)自动过期-避免死锁(什么是死锁,加锁->执行业务->执行完解锁,没有解锁业务代码出异常或者服务挂了,锁就一直存在redis缓存数据库中-死锁)

  4. redisson看门狗机制(给线程看门,线程进去执行业务,redisson看门)
    redisson-redissonClient提供的分布锁,一旦某个线程进入到占了锁,在业务代码没有执行完成,释放锁之前,redisson没10s会自动检测锁是否还在,并续期30s。直至业务完成,解锁,不再自动续期。这种情况只针对没有手动配置过期时间的前提,如果配置了则失效。

  5. redission的可重入锁机制
    Redisson 可重入锁是一种分布式锁,它基于 Redis 实现。可重入指的是同一个线程在持有锁的情况下,可以多次获取该锁而不会造成死锁。

<三>SpringCache-分布式缓存使用

  1. springcache是什么
    spring提供的一个缓存框架,使用一些注解解决缓存的问题,不需要关心底层代码逻辑如何实现

  2. 使用redis作为缓存工具,cache使用步骤
    1)pom文件加上依赖
    引入依赖 spring-boot-starter-cache
    spring-boot-starter-data-redis
    2)手动在配置文件加上缓存类型(其他配置后面使用场景再说)
    spring.cache.type=redis
    3)开启缓存@EnableCaching // 开启缓存,加在对应Configuration类上面

3.springcache 主要的注解
1)@EnableCaching-开启缓存
2)@Cacheable 加上方法上面,触发方法更新缓存(如果缓存不是null则不存储db数据到缓存中)
3)@CacheEvict,更新数据库触发删除缓存对应的数据-失效模式
4)@CachePut,更新数据库,在不影响更新数据库的情况下,更新缓存数据-双写模式。

  1. springcache有哪些不足之处?该缓存框架默认不加锁
    1)读模式(@Cacheable-读db->set->redis)
    只要涉及读db数据到redis缓存,且不加锁的情况,大并发就会暴露redis存储缺陷。
    a. 缓存穿透-开启db空值也存到redis中
    配置文件加
    spring.cache.redis.cache-null-values=true

    b. 缓存雪崩-配置设置缓存的过期时间
    spring.cache.redis.time-to-live=600000

    c. 缓存击穿-加锁
    springCache默认是不加分布式锁的,可以对应方法上
    @Cacheable注解上面加上sync = “true”,线程加锁-一次只允许一个线程占用锁访问db-避免热点击穿db。
    @Cacheable(value = “category”, key = “#root.method.name”, sync = true)

    2)写模式
    数据写模式对应的是更新数据,势必涉及更新db与更新缓存,两者存在数据一致性问题。
    解决方法:对于读多写少的数据,直接使用springcache缓存即可,key设置过期时间,查询触发再次更新db数据到缓存redis中。

总结
redis-缓存中间件-暂时的非关系key-value键值对数据库,StringRedisTemplate操作。
redisson-基于redis操作的数据库,提供分布式锁,解决分布式下操作redis缺陷。-使用redissonClient操作分布式锁(单体不需要redisson,本地锁就可以解决)
springcache-spring提供的分布式缓存框架,可以使用多种缓存中间件存储数据,本文type是redis,直接使用一些注解实现redis读-存储,写-写/删数据。不需要再单独使用redis执行一些列繁琐的代码实现。

相关文章:

对redis、redisson、springcache总结

<一> redis-缓存中间件 什么是redis redis是c语言开发的&#xff0c;一个高性能key-value键值对内存数据库&#xff0c;可以用来做数据库、缓存、消息中间件的一种非关系型数据库。 redis数据存储在哪里 内存和磁盘中&#xff0c;但是redis的读写都在内存中&#xff0c;…...

Java基础知识实际应用(学生信息管理系统、猜拳小游戏、打印日历)

一、Java学生信息管理系统 这个系统包含了添加、修改、删除、查询和显示所有学生信息等功能。您可以在此基础上进行修改和完善&#xff0c;以适应您的需求。 import java.util.Scanner;public class StudentManagementSystem {private static Scanner scanner new Scanner(S…...

Git:在本地电脑上如何使用git?

git 版本&#xff1a; 2.40.1.windows.1 文章目录 一. 使用git之前你必须要理解的几个概念1.1 理解工作区、版本库、暂存区的概念1.2 提交Git版本库的步骤【分两步执行】 二. Git本地库实战2.1 初始化版本库2.2 新建 & 提交 & 状态2.3 查看日志2.4 回退 & 穿梭 &am…...

卷和分区的关系

1、分区 存储空间管理和仓库管理类似&#xff0c;只不过仓库管理的是货物&#xff0c;存储空间管理的是文件。当仓库规模小时&#xff0c;可以不划分货物的存放区域&#xff0c;但当仓库规模很大&#xff0c;就必须根据货物的类型和存储需要&#xff0c;把仓库分为多个区域。例…...

Linux下在qtcreator中创建qt程序

目录 1、新建项目 2、单工程项目创建 3、多工程项目创建 4、添加子工程&#xff08;基于多工程目录结构&#xff09; 5、 .pro文件 1、新建项目 切换到“编辑”界面&#xff0c;点击菜单栏中的“文件”-“新建文件或项目” 2、单工程项目创建 只有一个工程的项目&#…...

快递再多也不怕!你的顺丰快递用上5G“神器”

互联网时代&#xff0c;剁手党疯狂“买买买”之后&#xff0c;快递件量再创新高。《2023年6月中国快递发展指数报告》显示&#xff0c;2023二季度单月快递业务量稳定在百亿件以上。其中&#xff0c;由于“618”电商促销活动与父亲节叠加&#xff0c;6月16日至20日单日揽收量均超…...

微信小程序:模板使用

目录 模板的优点&#xff1a; 一、静态模板创建 二、静态模板使用 1.*.wxml引入模板 2.模板使用 3.*.wxss引入模板的样式 三、动态模板创建 四、动态模板使用 1.*.wxml引入模板 2.模板使用 3.*.js定义动态数据 五、结果展示 总结 模板的优点&#xff1a; 有利于保持网…...

AUTOSAR NvM Block的三种类型

Native NVRAM block Native block是最基础的NvM Block&#xff0c;可以用来存储一个数据&#xff0c;可以配置长度、CRC等。 Redundant NVRAM block Redundant block就是在Native block的基础上再加一个冗余块&#xff0c;当Native block失效&#xff08;读取失败或CRC校验失…...

Vue+ElementUI实现选择指定行导出Excel

这里记录一下&#xff0c;今天写项目时 的一个需求&#xff0c;就是通过复选框选中指定行然后导出表格中选中行的Excel表格 然后这里介绍一个工具箱(模板)&#xff1a;vue-element-admin 将它拉取后&#xff0c;运行就可以看到如下界面&#xff1a; 这里面的很多功能都已经实现…...

SNMP简单介绍

SNMP SNMP是广泛应用于TCP/IP网络的网络管理标准协议&#xff0c;该协议能够支持网络管理系统&#xff0c;用以监测连接到网络上的设备是否有任何引起管理上关注的情况。SNMP采用轮询机制&#xff0c;提供最基本的功能集&#xff0c;适合小型、快速、低价格的环境使用&#xf…...

使用python对图像加噪声

加上雨点噪声 import cv2 import numpy as npdef get_noise(img, value10):#生成噪声图像>>> 输入&#xff1a; img图像value 大小控制雨滴的多少 >>> 返回图像大小的模糊噪声图像noise np.random.uniform(0, 256, img.shape[0:2])# 控制噪声水平&#xff…...

以 Java NIO 的角度理解 Netty

文章目录 前言Java NIO 工作原理Selector 的创建ServerSocketChannel 的创建ServerSocketChannel 注册 Selector对事件的处理总结 前言 上篇文章《Netty 入门指南》主要涵盖了 Netty 的入门知识&#xff0c;包括 Netty 的发展历程、核心功能与组件&#xff0c;并且通过实例演示…...

Maven自定义脚手架(多module模块)+自定义参数

脚手架 视频教程&#xff1a; Maven保姆级教程 脚手架是一个项目模板&#xff0c;包含常用的工程结构、代码。 1 自定义脚手架 脚手架创建的步骤如下&#xff0c;先创建一个工程&#xff0c;把常用的代码写好&#xff0c;进入工程根目录&#xff0c;进行如下操作&#xff1a; …...

爬虫逆向实战(七)--猿人学第十六题

一、数据接口分析 主页地址&#xff1a;猿人学第十六题 1、抓包 通过抓包可以发现数据接口是api/match/16 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以看出m是加密参数 请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无cook…...

Qt 杂项(Qwt、样式等)

Qt隐藏窗口边框 this->setWindowFlags(Qt::FramelessWindowHint);Qt模态框 this->setWindowModality(Qt::ApplicationModal);QLable隐藏border 代码中设置 lable->setStyleSheet("border:0px");或者UI中直接设置样式&#xff1a;“border:0px” Qwt开源…...

Python程序设计——列表

一、引言 关键点&#xff1a;一个列表可以存储任意大小的数据集合。 程序一般都需要存储大量的数值。假设&#xff0c;举个例子&#xff0c;需要读取100个数字&#xff0c;计算出它们的平均值&#xff0c;然后找出多少个数字是高于这个平均值的。程序首先读取100个数字并计算它…...

NPDP含金量高吗?难考吗?

一&#xff0c;什么是NPDP认证&#xff1f; NPDP认证中文名为产品经理国际资格认证&#xff0c;New Product Development Professional (NPDP) &#xff0c;是由美国 产品开发与管理协会 (PDMA) 所发起&#xff0c; 是国际公认的唯一的新产品开发专业认证&#xff0c;集理论、方…...

windows pip安装出现 error: Microsoft Visual C++ 14.0 is required

可参考&#xff1a;如何解决 Microsoft Visual C 14.0 or greater is required. Get it with “Microsoft C Build Tools“_不吃香菜的小趴菜的博客-CSDN博客 一、安装Visual Studio2022 1、下载&#xff1a;下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 我这使…...

威胁分析风险评估(TARA)影响和攻击可行性评估参考

在威胁分析风险评估&#xff08;TARA)过程中&#xff0c;风险等级由对资产安全属性侵害造成后果的影响等级和威胁的可能性两方面综合评估。 备注&#xff1a;以上内容的评估皆是建立在由信息安全问题引起并导致的前提下。 影响等级评估 影响等级说明&#xff0c;影响从安全&a…...

【教程】H5匿名信源码下载一封来信系统安装流程搭建教程

1、下载源码 匿名信2.0&#xff1a;匿名信h5源码 - 万策云盘 提取码&#xff1a;hOC4 2、查看搭建和使用教程 1,准备授权好的域名和服务器还有源码 2&#xff0c;创建网站和数据库&#xff0c;版本选择7.1【不可以选7.2】 3&#xff0c;上传源码并解压&#xff0c;导入数据…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...