Redis那些事儿(一)
说到redis大家都不陌生,其中包括:共有16个数据库,默认为第0个数据库;数据以key-value键值的形式存储;数据类型包括String、List、Hash、Set等,其中最常用的是字符串;是单线程的、基于内存的,主要受内存和网络带宽的影响… 这些都是基于Redis的基础理论知识储备。接下来我会通过开发中的StringRedisTemplate对象作为切入点,说一说Redis在开发中的那些事儿。
文章目录
- 1. jedis还是lettuce?
- 2. 字符串缓存
- 应用场景1:基础缓存
- 应用场景2:重复提交验证
- 3. List缓存
- 应用场景:高并发场景
1. jedis还是lettuce?
两者都是redis的客户端,对redis操作进行了封装。其中lettuce是内部使用netty进行网络通信,性能很强,jedis已经停止更新了。lettuce相对于jedis在性能方面更为出色,jedis在单个线程中是线程安全的,功能上更加丰富,支持的数据类型更多。无论Springboot2.0以后默认使用lettuce作为操作redis的客户端,选择jedis还是lettuce,都需要根据具体的业务需求和场景进行评估和测试,以确定最适合的工具库。两者的分别使用如下:
pom依赖
jedis
<!-- redis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency>
lettuce
<!-- redis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
yaml配置
jedis
spring:redis:host: localhostpassword:port: 6379timeout: 10s # 连接超时时间jedis:pool:max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)max-idle: 10 # 连接池中的最大空闲连接min-idle: 5 # 连接池中的最小空闲连接
lettuce
spring:redis:host: localhostpassword:port: 6379timeout: 10s # 连接超时时间lettuce:pool:max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)max-idle: 10 # 连接池中的最大空闲连接min-idle: 5 # 连接池中的最小空闲连接
2. 字符串缓存
应用场景1:基础缓存
对于redis有90%的使用场景都是基于String作为基础缓存使用的,对于经常使用的并且修改频率较低的数据存储在Redis缓存中,可以大大提高系统性能和响应速度,避免频繁地从数据库或其他后端服务读取数据。对象、集合等数据也可以通JSON序列化成字符串进行存储,大大提升了系统的并发性能,节省系统资源的消耗。
存字符串、对象、集合到缓存中,redisTemplate.opsForValue().set(key, value)
//存普通字符串redisTemplate.opsForValue().set("testKey", "123456");//存某对象Person person = getPerson(); //TODO 获取到某个实例对象redisTemplate.opsForValue().set("testObj", JSON.toJSONString(person));//存某集合List<Person> persons = getPersonList(); //TODO 获取到某个实例集合redisTemplate.opsForValue().set("testList", JSON.toJSONString(persons));
存入缓存中,有时效性,超时之后缓存自动删除,redisTemplate.opsForValue().set(key, value, time)
//设置登录token,30分钟有效(第3个参数支持:天、小时、分钟、秒等)redisTemplate.opsForValue().set("token", "123456", Duration.ofMinutes(30));
从缓存中读取数据,数据为字符串,可按实际存入的值进行序列化,redisTemplate.opsForValue().get(key)
//从缓存中获取某对象String s1 = redisTemplate.opsForValue().get("testObj");Person person = JSON.parseObject(s1, Person.class);//从缓存中获取某集合String s2 = redisTemplate.opsForValue().get("testList");List<Person> persons = JSON.parseArray(s2, Person.class);
获取缓存剩余时间,redisTemplate.getExpire(key)
//返回值为long值,单位是秒,如果是-1时代表的是永久保存Long expire = redisTemplate.getExpire("testKey");
重置缓存时间,redisTemplate.expire(key, time, timeUnit)
//重置时间为2天redisTemplate.expire("testKey", 2, TimeUnit.DAYS);
判断是否存在,redisTemplate.hasKey(key)
Boolean b = redisTemplate.hasKey("testKey");
模糊匹配获取所有的key值,redisTemplate.keys(“*”);
//获取所有的key值Set<String> keys = redisTemplate.keys("*");//获取所有的testKey*模糊的key值Set<String> keys = redisTemplate.keys("testKey*");
删除缓存,redisTemplate.delete(key)
redisTemplate.delete("testKey");
只是列了部分,还有multiSet、getRange、increment等方法都很实用
应用场景2:重复提交验证
相同请求短时间内请求多次过滤,尤其是用于重要表单信息提交、秒杀请求的应用场景。在每次接收到请求时,生成一个唯一的请求标识(例如,可以使用请求的URL和参数进行哈希计算),在Redis中使用请求标识作为Key,将其存入到缓存中,设置一个合适的时间自动清理缓存中的过期请求标识,避免占用过多内存。这样就可以实现用Redis有效地进行接口重复请求的验证。
以下为请求重复验证工具类实例代码
@Component
public class RequestValidator {@Autowiredprivate StringRedisTemplate redisTemplate;/*** 重复请求方法* @param requestId 请求标识* @param validSecond 有效时间(单位:秒)* @return true重复 / false不重复*/public boolean isDuplicateRequest(String requestId, Long validSecond) {String s = redisTemplate.opsForValue().get(requestId);//缓存中取值不为空,证明是重复请求if (StringUtils.isNotEmpty(s)) {return true;}//缓存中取值为空,证明非重复请求,把请求标识放入到缓存中redisTemplate.opsForValue().set(requestId, "DUPLICATE_REQUEST", Duration.ofSeconds(validSecond));return false;}
}
3. List缓存
应用场景:高并发场景
opsForList提供了一组简单而直观的方法来操作列表类型的数据,如leftPushAll、rightPushAll等,这使得批量存储变得非常方便,并且代码更易读,可以很好地支持高并发的场景。Redis的列表是按照插入的顺序进行存储的,利用leftPushAll或rightPushAll方法进行批量存储时,元素会按照给定的顺序依次插入到列表中,可以确保存储的顺序是可控的。虽然opsForList提供了方便的批量存储操作,但在实际使用时仍需考虑内存消耗、网络传输等因素,存储数据过大如果来不及消费,就会造成系统内存溢出导致服务器崩溃,存在数据丢失的风险。
✈ 具体怎么使用,在之前的文章中有介绍,在这里Java高并发之Redis批量提交数据库
相关文章:
Redis那些事儿(一)
说到redis大家都不陌生,其中包括:共有16个数据库,默认为第0个数据库;数据以key-value键值的形式存储;数据类型包括String、List、Hash、Set等,其中最常用的是字符串;是单线程的、基于内存的&…...
【多媒体文件格式】M3U8
M3U8 M3U8文件是指UTF-8编码格式的M3U文件(M3U使用Latin-1字符集编码)。M3U文件是一个记录索引的纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。 m3u8基本上可以认为就是.m3u格式文件&#x…...
linux中xargs的实用技巧
在Linux命令行中,有许多强大的工具可以帮助我们处理和操作文件、目录以及其他数据。其中之一就是xargs命令。xargs命令可以将标准输入数据转换成命令行参数,从而提高命令的效率和灵活性。本文将介绍xargs命令的基本用法,并通过生动的代码和输…...
【Jmeter】生成html格式接口自动化测试报告
jmeter自带执行结果查看的插件,但是需要在jmeter工具中才能查看,如果要向领导提交测试结果,不够方便直观。 笔者刚做了这方面的尝试,总结出来分享给大家。 这里需要用到ant来执行测试用例并生成HTML格式测试报告。 一、ant下载安…...
如何将极狐GitLab 漏洞报告导出为 HTML 或 PDF 格式或导出到 Jira
目录 导出为 HTML/PDF 将漏洞信息导出到 Jira 参考资料 极狐GitLab 的漏洞报告功能可以让开发人员在统一的平台上面管理代码,对其进行安全扫描、管理漏洞报告并修复漏洞。但有些团队更喜欢使用类似 Jira 的单独工具来管理他们的安全漏洞。他们也可能需要以易于理…...
uniapp原生插件之安卓文字转拼音原生插件
插件介绍 安卓文字转拼音插件,支持转换为声调模式和非声调模式,支持繁体和简体互相转换 插件地址 安卓文字转拼音原生插件 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 详细使用文档 uniapp 安卓文字转拼音原生插件 用法 在需要使用插…...
[架构之路-254/创业之路-85]:目标系统 - 横向管理 - 源头:信息系统战略规划的常用方法论,为软件工程的实施指明方向!!!
目录 总论: 一、数据处理阶段的方法论 1.1 企业信息系统规划法BSP 1.1.1 概述 1.1.2 原则 1.2 关键成功因素法CSF 1.2.1 概述 1.2.2 常见的企业成功的关键因素 1.3 战略集合转化法SST:把战略目标转化成信息的集合 二、管理信息系统阶段的方法论…...
CSP-J 2023真题解析
T1 小苹果 一、题目链接 P9748 [CSP-J 2023] 小苹果 二、题目大意 现有 n n n 个苹果从左到右排成一列,编号为从 1 1 1 到 n n n。 每天都会从中拿走一些苹果。拿取规则是,从左侧第 1 1 1 个苹果开始、每隔 2 2 2 个苹果拿走 1 1 1 个苹果。随…...
【Proteus仿真】【51单片机】贪吃蛇游戏
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用8*8LED点阵、按键模块等。 主要功能: 系统运行后,可操作4个按键控制小蛇方向。 二、软件设计 /* 作者:嗨小易…...
Android 原生定位开发(解决个别手机定位失败问题)
文章目录 前言一、实现步骤二、使用步骤1.服务启动工具类2.实现LocationService 总结 前言 在android开发中地图和定位是很多软件不可或缺的内容,这些特色功能也给人们带来了很多方便。定位一般分为三种发方案:即GPS定位、Google网络定位以及基站定位。…...
uni-app 中如何实现数据组件间传递?
在 uni-app 中,实现数据组件间传递可以使用 Props 或 Vuex。 Props 是一种组件通信的方式,通过向子组件传递数据来实现组件间的数据传递。下面是一个示例: 父组件: <template><child :message"hello">&l…...
SpringBoot整合自签名SSL证书,转变HTTPS安全访问(单向认证服务端)
前言 HTTP 具有相当优秀和方便的一面,然而 HTTP 并非只有好的一面,事物皆具两面性,它也是有不足之处的。例如: 通信使用明文(不加密),内容可能会被窃听。不验证通信方的身份,因此有可能会遭遇…...
k8s:endpoint
在 Kubernetes 中,Endpoint 是一种 API 对象,它用于表示集群内某个 Service 的具体网络地址。换句话说,它连接到一组由 Service 选择的 Pod,从而使它们能够提供服务。每个 Endpoint 对象都与相应的 Service 对象具有相同的名称&am…...
最新版星火官方搬运工具6.0,高级搬运,100%过原创,短视频上热门搬运软件黑科技【搬运脚本+使用技术教程】
软件介绍: 高级搬运,条条过原创 短视频暴力热门搬运黑科技 自研摄像头内录突破性技术6.0 无需任何繁琐准备工作安装即用 无需复杂售后培训看教程即可学会 直装直用自研技术更好卖 无需root 无需框架 更方便 无需xposed 无需vcam更安全 适配99%以…...
轧钢厂安全生产方案:AI视频识别安全风险智能监管平台的设计
一、背景与需求 轧钢厂一般都使用打包机对线材进行打包作业,由于生产需要,人员需频繁进入打包机内作业,如:加护垫、整包、打包机检修、调试等作业。在轧钢厂生产过程中,每个班次生产线材超过300件,人员在一…...
Linux Dotnet 程序堆栈监控
# 查看进程 dotnet-stack ps #显示如下2014067 dotnet /usr/share/dotnet/dotnet k1 --LogLevel4 2014087 dotnet /usr/share/dotnet/dotnet --LogLevel4 2014089 dotnet /usr/share/dotnet/dotnet --LogLevel4 # 根据PID查看这个进程每个线程的堆栈 dotnet-stack repor…...
后端设计PG liberty的作用和增量式生成
Liberty(俗称LIB和DB),是后端设计中重要的库逻辑描述文件,这里边包含了除过physical(当然也有一点点涉及)以外所有的信息,对整个后端设计实现有非常大的作用。借此机会,一起LIB做一个…...
Linux 安装 RocketMq
RocketMq是阿里出品(基于MetaQ)的开源中间件,已捐赠给Apache基金会并成为Apache的顶级项目。基于java语言实现,十万级数据吞吐量,ms级处理速度,分布式架构,功能强大,扩展性强。 官网…...
大数据Doris(十六):Doris表的数据划分
文章目录 Doris表的数据划分 一、Partition 二、 Bucket 三、PROPERTIES 四、 ENGINE Doris表的数据划分 Doris支持单分区和复合分...
管理文件:文件批量重命名,轻松删除文件名中的空格
在文件管理中,我们经常会遇到文件名中带有空格的情况。这些空格可能会使文件在某些情况下难以被正确识别或使用,因此我们需要掌握一些技巧来轻松删除文件名中的空格。现在使用云炫文件管理器批量重命名进行批量处理。以下是如何操作的步骤详解࿱…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
