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

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大家都不陌生&#xff0c;其中包括&#xff1a;共有16个数据库&#xff0c;默认为第0个数据库&#xff1b;数据以key-value键值的形式存储&#xff1b;数据类型包括String、List、Hash、Set等&#xff0c;其中最常用的是字符串&#xff1b;是单线程的、基于内存的&…...

【多媒体文件格式】M3U8

M3U8 M3U8文件是指UTF-8编码格式的M3U文件(M3U使用Latin-1字符集编码)。M3U文件是一个记录索引的纯文本文件&#xff0c;打开它时播放软件并不是播放它&#xff0c;而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。 m3u8基本上可以认为就是.m3u格式文件&#x…...

linux中xargs的实用技巧

在Linux命令行中&#xff0c;有许多强大的工具可以帮助我们处理和操作文件、目录以及其他数据。其中之一就是xargs命令。xargs命令可以将标准输入数据转换成命令行参数&#xff0c;从而提高命令的效率和灵活性。本文将介绍xargs命令的基本用法&#xff0c;并通过生动的代码和输…...

【Jmeter】生成html格式接口自动化测试报告

jmeter自带执行结果查看的插件&#xff0c;但是需要在jmeter工具中才能查看&#xff0c;如果要向领导提交测试结果&#xff0c;不够方便直观。 笔者刚做了这方面的尝试&#xff0c;总结出来分享给大家。 这里需要用到ant来执行测试用例并生成HTML格式测试报告。 一、ant下载安…...

如何将极狐GitLab 漏洞报告导出为 HTML 或 PDF 格式或导出到 Jira

目录 导出为 HTML/PDF 将漏洞信息导出到 Jira 参考资料 极狐GitLab 的漏洞报告功能可以让开发人员在统一的平台上面管理代码&#xff0c;对其进行安全扫描、管理漏洞报告并修复漏洞。但有些团队更喜欢使用类似 Jira 的单独工具来管理他们的安全漏洞。他们也可能需要以易于理…...

uniapp原生插件之安卓文字转拼音原生插件

插件介绍 安卓文字转拼音插件&#xff0c;支持转换为声调模式和非声调模式&#xff0c;支持繁体和简体互相转换 插件地址 安卓文字转拼音原生插件 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 详细使用文档 uniapp 安卓文字转拼音原生插件 用法 在需要使用插…...

[架构之路-254/创业之路-85]:目标系统 - 横向管理 - 源头:信息系统战略规划的常用方法论,为软件工程的实施指明方向!!!

目录 总论&#xff1a; 一、数据处理阶段的方法论 1.1 企业信息系统规划法BSP 1.1.1 概述 1.1.2 原则 1.2 关键成功因素法CSF 1.2.1 概述 1.2.2 常见的企业成功的关键因素 1.3 战略集合转化法SST&#xff1a;把战略目标转化成信息的集合 二、管理信息系统阶段的方法论…...

CSP-J 2023真题解析

T1 小苹果 一、题目链接 P9748 [CSP-J 2023] 小苹果 二、题目大意 现有 n n n 个苹果从左到右排成一列&#xff0c;编号为从 1 1 1 到 n n n。 每天都会从中拿走一些苹果。拿取规则是&#xff0c;从左侧第 1 1 1 个苹果开始、每隔 2 2 2 个苹果拿走 1 1 1 个苹果。随…...

【Proteus仿真】【51单片机】贪吃蛇游戏

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用8*8LED点阵、按键模块等。 主要功能&#xff1a; 系统运行后&#xff0c;可操作4个按键控制小蛇方向。 二、软件设计 /* 作者&#xff1a;嗨小易…...

Android 原生定位开发(解决个别手机定位失败问题)

文章目录 前言一、实现步骤二、使用步骤1.服务启动工具类2.实现LocationService 总结 前言 在android开发中地图和定位是很多软件不可或缺的内容&#xff0c;这些特色功能也给人们带来了很多方便。定位一般分为三种发方案&#xff1a;即GPS定位、Google网络定位以及基站定位。…...

uni-app 中如何实现数据组件间传递?

在 uni-app 中&#xff0c;实现数据组件间传递可以使用 Props 或 Vuex。 Props 是一种组件通信的方式&#xff0c;通过向子组件传递数据来实现组件间的数据传递。下面是一个示例&#xff1a; 父组件&#xff1a; <template><child :message"hello">&l…...

SpringBoot整合自签名SSL证书,转变HTTPS安全访问(单向认证服务端)

前言 HTTP 具有相当优秀和方便的一面,然而 HTTP 并非只有好的一面&#xff0c;事物皆具两面性&#xff0c;它也是有不足之处的。例如&#xff1a; 通信使用明文&#xff08;不加密&#xff09;&#xff0c;内容可能会被窃听。不验证通信方的身份&#xff0c;因此有可能会遭遇…...

k8s:endpoint

在 Kubernetes 中&#xff0c;Endpoint 是一种 API 对象&#xff0c;它用于表示集群内某个 Service 的具体网络地址。换句话说&#xff0c;它连接到一组由 Service 选择的 Pod&#xff0c;从而使它们能够提供服务。每个 Endpoint 对象都与相应的 Service 对象具有相同的名称&am…...

最新版星火官方搬运工具6.0,高级搬运,100%过原创,短视频上热门搬运软件黑科技【搬运脚本+使用技术教程】

软件介绍&#xff1a; 高级搬运&#xff0c;条条过原创 短视频暴力热门搬运黑科技 自研摄像头内录突破性技术6.0 无需任何繁琐准备工作安装即用 无需复杂售后培训看教程即可学会 直装直用自研技术更好卖 无需root 无需框架 更方便 无需xposed 无需vcam更安全 适配99%以…...

轧钢厂安全生产方案:AI视频识别安全风险智能监管平台的设计

一、背景与需求 轧钢厂一般都使用打包机对线材进行打包作业&#xff0c;由于生产需要&#xff0c;人员需频繁进入打包机内作业&#xff0c;如&#xff1a;加护垫、整包、打包机检修、调试等作业。在轧钢厂生产过程中&#xff0c;每个班次生产线材超过300件&#xff0c;人员在一…...

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&#xff08;俗称LIB和DB&#xff09;&#xff0c;是后端设计中重要的库逻辑描述文件&#xff0c;这里边包含了除过physical&#xff08;当然也有一点点涉及&#xff09;以外所有的信息&#xff0c;对整个后端设计实现有非常大的作用。借此机会&#xff0c;一起LIB做一个…...

Linux 安装 RocketMq

RocketMq是阿里出品&#xff08;基于MetaQ&#xff09;的开源中间件&#xff0c;已捐赠给Apache基金会并成为Apache的顶级项目。基于java语言实现&#xff0c;十万级数据吞吐量&#xff0c;ms级处理速度&#xff0c;分布式架构&#xff0c;功能强大&#xff0c;扩展性强。 官网…...

大数据Doris(十六):Doris表的数据划分

文章目录 Doris表的数据划分 一、Partition 二、 Bucket 三、PROPERTIES 四、 ENGINE Doris表的数据划分 Doris支持单分区和复合分...

管理文件:文件批量重命名,轻松删除文件名中的空格

在文件管理中&#xff0c;我们经常会遇到文件名中带有空格的情况。这些空格可能会使文件在某些情况下难以被正确识别或使用&#xff0c;因此我们需要掌握一些技巧来轻松删除文件名中的空格。现在使用云炫文件管理器批量重命名进行批量处理。以下是如何操作的步骤详解&#xff1…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中&#xff0c;如何展示好看的实验结果图像非常重要&#xff01;&#xff01;&#xff01; 1、灰度原始图像 灰度图像每个像素点只有一个数值&#xff0c;代表该点的​​亮度&#xff08;或…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...

欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!

多连接 BLE 怎么设计服务不会乱&#xff1f;分层思维来救场&#xff01; 作者按&#xff1a; 你是不是也遇到过 BLE 多连接时&#xff0c;调试现场像网吧“掉线风暴”&#xff1f; 温度传感器连上了&#xff0c;心率带丢了&#xff1b;一边 OTA 更新&#xff0c;一边通知卡壳。…...