对redis、redisson、springcache总结
<一> redis-缓存中间件
-
什么是redis
redis是c语言开发的,一个高性能key-value键值对内存数据库,可以用来做数据库、缓存、消息中间件的一种非关系型数据库。 -
redis数据存储在哪里
内存和磁盘中,但是redis的读写都在内存中,这也是速度快的原因之一。
对于高频繁访问的数据,存储在内存中方便访问。
为了避免服务宕机或者重启数据丢失,也可以将数据存储在磁盘中持久化。 -
redis的数据类型
String、set、zset、list、hash -
redis为什么响应速度快
1) 基于内存存储,redis的读写都是基于内存的key-value操作。内存远大于磁盘响应速度。
2) 单线程操作,避免了多线程cpu来回切换和各种加锁和解锁的资源消耗。
redis的单线程操作是指一个模块的操作单线程,其他该多线程的还是使用多线程。
3)丰富的数据结构
redis是基于key-velue键值对存储的缓存数据库,对于key都是string类型,但是vlue有多种数据类型
4)高性能的多复用IO模型 -
为什么需要使用redis
redis的响应速度快读10w+,写8w,对于一些业务场景(可以将计算的结果-菜单等存储到缓存中,下次直接getfromredis) -
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); // 设置过期时间 防止缓存数据与数据库不一致
-
redis怎么进行get,set,读写数据
使用StringRedisTemplete .get(“keyname”) /.set(“keyname”,“value”,“time”,“时间单位”) -
redis有哪些参数
key-String
value-list,string、set、zset、hash
过期时间-过期删除,重新sql获取set到缓存中,与数据库数据保持一致
过期时间的单位 -
redis缓存容易出现的问题
1)缓存穿透
reason: 大量并发请求一个不存在的数据,到缓存中null,之后大量请求到了数据库中,数据库压力过大崩了。这种是缓存穿透。
way: 即使数据库中为null的数据,也存储一个标识到缓存中,并且设置一个过期时间。
2)缓存雪崩
r:大量不同业务模块的请求到缓存,但是对应的数据同时过期了,导致所有的请求到db-压力大。
w:设置不同的过期时间,可以在配置文件中统一配置,因为不同业务key存储的时间不同,过期点也不会相同。
3)缓存击穿
r:大量恶意请求到一个热点词,刚好这个key过期了。db压力过大
w:加锁-记得双重验证,每次只允许一个请求进入db-get->db,其他没有进去锁的去访问缓存即可。
-
本地锁(不是redis分布式锁,加关键字Synchronized等)
本地锁只能锁住同一个进程里面的线程,如果是分布式下,即使每个服务仅仅放一个线程进来,相互是隔离的,不能只锁住一个。这个时候需要分布式锁-redisson(使用redis分布式锁-没有看门狗机制) -
redis怎么保证与数据库数据一致(更新数据库)
1)双写模式
先更新数据库,再去更新缓存对应的key,这种缓存中可能会短暂出现脏数据,稳定后缓存过期-重新读取db即可保证最新数据。
2)失效模式
先写数据库,后删除缓存。这种也可能短暂出现缓存有脏数据,稳定后即可无论是更新缓存还是删除缓存都会有脏数据,解决如下
1)失效模式-使用双删模式
先删除缓存->更新db-隔几秒再去删除缓存
2)使用MQ消息队列,消费者监听queue消息去删除缓存
生产者(更新db)->MQ->queue有数据->customer监听到->删除缓存->告知queue是否删除成功,失败queue再次发送。(不需要写代码,mq本身会重复出队。解耦修改数据库和查询数据库解耦,不会造成缓存有脏数据)
11.缓存锁使用的原则
正常数据,缓存加上过期时间,就可以实现数据一致性。
对于实时性要求高的,最好是到数据库中读取。
对于频繁修改的数据,不建议加读写锁,性能会慢。
<二> redisson-分布式锁
-
redisson是什么
redisson是基于redis的分布式框架,提供了分布式锁等服务 -
为什么需要分布式锁
本地锁只能锁住当前进程-一个服务的线程,所以需要分布式锁。 -
redission配置步骤
1)pom文件加上依赖(前提是有redis依赖)
org.redisson
redisson
3.12.0
2)配置redis配置信息 -
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后自动删除。即使服务宕机-业务结束,也不会出现死锁,锁会自动过期。
-
读写锁相关
// 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)写锁与其他锁都互斥,一次只能有一个线程占用锁,其他写或者读必须等待。 -
分布式锁的几个参数
创建锁的过期时间,时间单位,redisson分布式锁默认是10s查看一次锁是否还在,如果在自动延长30s(前提是没有手动设置过期时间) -
redisson分布式锁的特点
1)一次只能有一个进程的一个线程进来
2)有看门狗机制,redisson–自动续期30s,业务未执行完,其他锁进来造成数据紊乱
3)自动过期-避免死锁(什么是死锁,加锁->执行业务->执行完解锁,没有解锁业务代码出异常或者服务挂了,锁就一直存在redis缓存数据库中-死锁) -
redisson看门狗机制(给线程看门,线程进去执行业务,redisson看门)
redisson-redissonClient提供的分布锁,一旦某个线程进入到占了锁,在业务代码没有执行完成,释放锁之前,redisson没10s会自动检测锁是否还在,并续期30s。直至业务完成,解锁,不再自动续期。这种情况只针对没有手动配置过期时间的前提,如果配置了则失效。 -
redission的可重入锁机制
Redisson 可重入锁是一种分布式锁,它基于 Redis 实现。可重入指的是同一个线程在持有锁的情况下,可以多次获取该锁而不会造成死锁。
<三>SpringCache-分布式缓存使用
-
springcache是什么
spring提供的一个缓存框架,使用一些注解解决缓存的问题,不需要关心底层代码逻辑如何实现 -
使用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,更新数据库,在不影响更新数据库的情况下,更新缓存数据-双写模式。
-
springcache有哪些不足之处?该缓存框架默认不加锁
1)读模式(@Cacheable-读db->set->redis)
只要涉及读db数据到redis缓存,且不加锁的情况,大并发就会暴露redis存储缺陷。
a. 缓存穿透-开启db空值也存到redis中
配置文件加
spring.cache.redis.cache-null-values=trueb. 缓存雪崩-配置设置缓存的过期时间
spring.cache.redis.time-to-live=600000c. 缓存击穿-加锁
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语言开发的,一个高性能key-value键值对内存数据库,可以用来做数据库、缓存、消息中间件的一种非关系型数据库。 redis数据存储在哪里 内存和磁盘中,但是redis的读写都在内存中,…...

Java基础知识实际应用(学生信息管理系统、猜拳小游戏、打印日历)
一、Java学生信息管理系统 这个系统包含了添加、修改、删除、查询和显示所有学生信息等功能。您可以在此基础上进行修改和完善,以适应您的需求。 import java.util.Scanner;public class StudentManagementSystem {private static Scanner scanner new Scanner(S…...

Git:在本地电脑上如何使用git?
git 版本: 2.40.1.windows.1 文章目录 一. 使用git之前你必须要理解的几个概念1.1 理解工作区、版本库、暂存区的概念1.2 提交Git版本库的步骤【分两步执行】 二. Git本地库实战2.1 初始化版本库2.2 新建 & 提交 & 状态2.3 查看日志2.4 回退 & 穿梭 &am…...
卷和分区的关系
1、分区 存储空间管理和仓库管理类似,只不过仓库管理的是货物,存储空间管理的是文件。当仓库规模小时,可以不划分货物的存放区域,但当仓库规模很大,就必须根据货物的类型和存储需要,把仓库分为多个区域。例…...

Linux下在qtcreator中创建qt程序
目录 1、新建项目 2、单工程项目创建 3、多工程项目创建 4、添加子工程(基于多工程目录结构) 5、 .pro文件 1、新建项目 切换到“编辑”界面,点击菜单栏中的“文件”-“新建文件或项目” 2、单工程项目创建 只有一个工程的项目&#…...

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

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

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

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

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

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

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

Maven自定义脚手架(多module模块)+自定义参数
脚手架 视频教程: Maven保姆级教程 脚手架是一个项目模板,包含常用的工程结构、代码。 1 自定义脚手架 脚手架创建的步骤如下,先创建一个工程,把常用的代码写好,进入工程根目录,进行如下操作: …...

爬虫逆向实战(七)--猿人学第十六题
一、数据接口分析 主页地址:猿人学第十六题 1、抓包 通过抓包可以发现数据接口是api/match/16 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块可以看出m是加密参数 请求头是否加密? 无响应是否加密? 无cook…...

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

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

NPDP含金量高吗?难考吗?
一,什么是NPDP认证? NPDP认证中文名为产品经理国际资格认证,New Product Development Professional (NPDP) ,是由美国 产品开发与管理协会 (PDMA) 所发起, 是国际公认的唯一的新产品开发专业认证,集理论、方…...

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

威胁分析风险评估(TARA)影响和攻击可行性评估参考
在威胁分析风险评估(TARA)过程中,风险等级由对资产安全属性侵害造成后果的影响等级和威胁的可能性两方面综合评估。 备注:以上内容的评估皆是建立在由信息安全问题引起并导致的前提下。 影响等级评估 影响等级说明,影响从安全&a…...
【教程】H5匿名信源码下载一封来信系统安装流程搭建教程
1、下载源码 匿名信2.0:匿名信h5源码 - 万策云盘 提取码:hOC4 2、查看搭建和使用教程 1,准备授权好的域名和服务器还有源码 2,创建网站和数据库,版本选择7.1【不可以选7.2】 3,上传源码并解压,导入数据…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...