项目中引入 Redis 及 常用五种数据类型

        在平常的开发过程中,我们经常会用到缓存的技术。比如,验证码60秒后过期、计数器的实现、商品信息存储在缓存中快速展示等。那么,项目中经常会使用到的便是 redis 缓存。redis 在内存中操作,读写快。Redis 常用的数据类型有五种,String、List、Hash、Set、Sorted Set。那么,今天我们总结下项目中引入 Redis 及常见数据类型操作。

     一:概述

        Redis 基于内存的数据结构存储系统,主要用于缓存、分布式锁等场景。数据结构丰富:Redis 支持多种数据结构,常用的如字符串(String)、列表(List)、哈希(Hash)、集合(Set)、有序集合(Sorted Set)等。可以支持不同业务场景的使用。
        Redis 将数据存储在内存中,读写快。内存的高速访问特性使得 Redis 可以在短时间内处理大量的请求,适用于对性能要求极高的场景,如实时数据处理、缓存等。Redis 也提供了持久化机制,如 RDB(Redis Database)快照和 AOF(Append Only File)日志,能够将内存中的数据定期或实时地保存到磁盘上,以防止数据丢失。
        Redis 的命令具有原子性,即一个命令要么完全执行,要么完全不执行,不会出现部分执行的情况。这保证了数据的一致性和完整性。

      二:引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.1.5.RELEASE</version> <!-- 版本与 Spring Boot 保持一致 -->
</dependency>

        注意:引入 Redis 的版本与 Springboot 版本保持一致。

     三:redis 连接信息配置

        1:如果 Spring boot 2.x 版本,那么在 application.yml 中配置 redis 连接信息如下:

spring:redis:# 连接地址host: 127.0.0.1# 端口port: 6379# 数据库database: 0# 用户名# username: username# 密码password: passrord# 连接超时# connect-timeout: 5s# 读超时# timeout: 30

        2:如果 Spring boot 3.x 版本,那么在 application.yml 中配置 redis 连接信息如下:

spring:data:redis:# 连接地址host: 127.0.0.1# 端口port: 6379# 数据库database: 0# 用户名# username: username# 密码password: passrord# 连接超时# connect-timeout: 5s# 读超时# timeout: 30

        注意:Spring Boot 3.x 对配置属性进行了更严格的规范化,将数据相关的配置统一到 spring.data 命名空间下,提高一致性和可维护性。

     四:五种常用数据类型

     1:字符串 String

        应用场景:验证码、计数器、分布式锁,最大可存储 512 m。

        代码示例:

// 操作字符串
// 不设置过期时间
stringRedisTemplate.opsForValue().set("11", "蜜薯");
// 设置过期时间为 10 秒钟
stringRedisTemplate.opsForValue().set("12", "马铃薯", Duration.ofSeconds(10));
// 设置过期时间为 10 秒钟
stringRedisTemplate.opsForValue().set("13", "红薯", 10,  TimeUnit.SECONDS);
// 获取值
String value11 = stringRedisTemplate.opsForValue().get("11");
log.info("value11={}", JSONUtil.toJsonStr(value11));	

      2:列表 List

        应用场景:有序元素集合 用户搜索近十条历史记录、最新消息展示

        代码示例:

// 有序元素集合 用户搜索近十条历史记录、最新消息展示
// 操作 list
List<SysDictData> dictDataList = new ArrayList<>();
for (int i = 0; i < 10; i++) {SysDictData dictData = new SysDictData();dictData.setDictCode(Long.valueOf(i));dictData.setDictLabel("字典" + i);dictDataList.add(dictData);
}
// 将 list 对象转为 String
// 不设置过期时间
stringRedisTemplate.opsForValue().set("dictListString", JSONUtil.toJsonStr(dictDataList));
// 设置过期时间
stringRedisTemplate.opsForValue().set("dictListString", JSONUtil.toJsonStr(dictDataList), 10, TimeUnit.MINUTES);
String dictListString = stringRedisTemplate.opsForValue().get("dictListString");
List<SysDictData> dictDataListRedis = JSONUtil.toList(dictListString, SysDictData.class);
log.info("dictDataListRedis={}", JSONUtil.toJsonStr(dictDataListRedis));stringRedisTemplate.opsForList().leftPush("dictList", "字典1");
stringRedisTemplate.opsForList().leftPush("dictList", "字典2");
stringRedisTemplate.opsForList().leftPush("dictList", "字典3");
stringRedisTemplate.opsForList().leftPush("dictList", "字典4");stringRedisTemplate.opsForList().rightPush("dictList", "字典5");
// 取出 list 中所有的值
List<String> dictListValueAll = stringRedisTemplate.opsForList().range("dictList", 0, -1);
log.info("dictListValueAll={}", JSONUtil.toJsonStr(dictListValueAll));
// 取出 list 中前三条数据
List<String> dictListValueThree = stringRedisTemplate.opsForList().range("dictList", 0, 2);
log.info("dictListValueThree={}", JSONUtil.toJsonStr(dictListValueThree));

      3:哈希 Hash

        应用场景:field-value 映射表,适合存储对象,用户属性信息、商品信息

        代码示例:

// 添加 111 用户
stringRedisTemplate.opsForHash().put("111", "name", "张三");
stringRedisTemplate.opsForHash().put("111", "age", "98");
stringRedisTemplate.opsForHash().put("111", "phone", "123456789");
stringRedisTemplate.opsForHash().put("111", "address", "西安");
// 添加 222 用户
stringRedisTemplate.opsForHash().put("222", "name", "李四");
stringRedisTemplate.opsForHash().put("222", "age", "88");
stringRedisTemplate.opsForHash().put("222", "phone", "123456789");
stringRedisTemplate.opsForHash().put("222", "address", "宝鸡");
// 获取全部元素
Map<Object, Object> scoresMap = stringRedisTemplate.opsForHash().entries("scores");
log.info("scoresMap={}", JSONUtil.toJsonStr(scoresMap));
// 获取某个 key 的值
Object scoresSingleMap = stringRedisTemplate.opsForHash().get("scores", "112");
log.info("scoresSingleMap={}", JSONUtil.toJsonStr(scoresSingleMap));

      4:集合 Set

        应用场景:无序、元素不可重复 抽奖系统、计数器

        代码示例:

stringRedisTemplate.opsForSet().add("cities", "11", "12", "13", "14", "15", "16");
// 获取到所有值 适合数据量小
Set<String> setCitiesAll = stringRedisTemplate.opsForSet().members("cities");
log.info("setCitiesAll={}", JSONUtil.toJsonStr(setCitiesAll));

      5:有序集合 Sorted Set

        应用场景:带分数的 set,分数可以重复,元素唯一   排行榜、范围查询

        代码示例:

stringRedisTemplate.opsForZSet().add("studentIds", "111", 1);
stringRedisTemplate.opsForZSet().add("studentIds", "112", 2);
stringRedisTemplate.opsForZSet().add("studentIds", "113", 3);
stringRedisTemplate.opsForZSet().add("studentIds", "114", 4);
stringRedisTemplate.opsForZSet().add("studentIds", "115", 5);
stringRedisTemplate.opsForZSet().add("studentIds", "116", 6);
// 数据量小,全部获取        
Set set = stringRedisTemplate.opsForZSet().range("studentIds", 0, -1);
log.info("studentIds set={}", JSONUtil.toJsonStr(set));

        如果数据量大,则分页获取:

// 获取数据总条数
Long totalSize = stringRedisTemplate.opsForZSet().size("studentIds");
// 分页获取key中的数据
Set<String> studentIdsSet = new HashSet<>();
// 每页获取的记录数
int pageSize = 2;
// 计算总页数   
int totalPages = (int) Math.ceil(totalSize / (double) pageSize);
for (int page = 0; page < totalPages; page++) {// 每次获取数据开始的位置long start = (long) page * pageSize;// 每次获取数据结束的位置long end = start + pageSize - 1;// 获取数据Set<ZSetOperations.TypedTuple<String>> setData = stringRedisTemplate.opsForZSet().rangeWithScores("studentIds", start, end);if (CollUtil.isNotEmpty(setData)) {// 将数据进行转换Set<String> cacheData = setData.stream().map(item -> {String value = JSONObject.parseObject(item.getValue(), String.class);return value;}).filter(Objects::nonNull).collect(Collectors.toSet());studentIdsSet.addAll(cacheData);}
}

     五:总结

       以上为项目中引入 Redis 的基本步骤,以及常见五种数据类型的应用场景及操作方法。
       Redis 广泛应用于缓存、消息队列、实时分析、分布式锁等场景。它支持多种数据结构(如 String、List、Hash、Set、Sorted Set等),并提供了持久化、高可用、集群、事务、Lua 脚本、发布/订阅等。
       Redis 数据存储在内存中,读写速度快,适用于高并发低延迟场景。同时,它支持 RDB(快照)和 AOF(日志追加)持久化,确保数据安全。

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

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

相关文章

Spark-SQL简介及核心编程

Spark-SQL概述&#xff1a;是Spark用于结构化数据处理的模块&#xff0c;前身是Shark。Shark基于Hive开发&#xff0c;使SQL-on-Hadoop性能大幅提升&#xff0c;但对Hive依赖制约了Spark发展。SparkSQL汲取Shark优点并重新开发&#xff0c;在数据兼容、性能优化和组件扩展上优势…

奇趣点播系统测试报告

1.项目简介 本项目旨在搭建一个视频共享点播系统&#xff0c;服务器支持用户通过前端浏览器访问服务器&#xff0c;获取展示与观看和操作的界面&#xff0c;最终实现视频的上传以及观看和删改查等基础管理功能。让用户拥有良好的观看体验和分享视频的快捷方式&#xff0c;此外…

【Web API系列】WebSocketStream API 深度实践:构建高吞吐量实时应用的流式通信方案

前言 在当今的 Web 开发领域&#xff0c;实时通信已成为许多应用的核心需求。无论是即时聊天、实时数据仪表盘&#xff0c;还是在线游戏和金融交易系统&#xff0c;都需要高效的双向数据传输能力。传统的 WebSocket API 为此提供了基础支持&#xff0c;但在处理大规模数据流、…

基于LangGraph的智能报告生成平台项目分析

前言 不知道你是否知道或者了解OpenAI and Gemini Deep Research。他们是一种能够根据输入问题进行规划、结合网络搜索获取信息并最终呈现结果的研究工具或技术。那这样research是如何实现的呢?最近刚好看到一个实现类似功能的开源项目: open_deep_search。本文将基于该项目进…

Redis 常见的集群架构

Redis 常见的集群架构 以下是 Redis 常见的集群架构及其核心模式详解&#xff0c;结合其设计原理、适用场景和优缺点进行综合说明&#xff1a; 一、主从复制模式 架构原理 角色划分&#xff1a;包含一个主节点&#xff08;Master&#xff09;和多个从节点&#xff08;Slave&…

面试宝典(C++基础)-01

文章目录 1. C++基础1.1 C++特点1.2 说说C语言和C++的区别1.3 说说 C++中 struct 和 class 的区别1.4 include头文件的顺序以及双引号""和尖括号<>的区别1.5 说说C++结构体和C结构体的区别1.6 导入C函数的关键字是什么,C++编译时和C有什么不同?1.7 C++从代码…

快速获得ecovadis认证的方法,如何提升ecovadis认证分数,有效期是多久

快速获得EcoVadis认证的方法 EcoVadis认证是企业社会责任&#xff08;CSR&#xff09;和可持续发展能力的国际评估标准&#xff0c;被广泛应用于供应链管理&#xff08;如苹果、微软、联合利华等巨头要求供应商通过EcoVadis评估&#xff09;。以下是快速获得认证的关键步骤&am…

ubuntu 安装samba

ubuntu 版本&#xff1a;Ubuntu 24.04.2 LTS 1. 保证连网 2. 安装samba sudo apt install samba 在安装结束以后&#xff0c;我们可以使用下面的命令来查看安装&#xff1a; apt list | grep samba freeipa-client-samba/noble 4.11.1-2 amd64 ldb-tools/noble 2:2.8.0samba…

基于SpringBoot的宠物健康咨询系统(源码+数据库+万字文档)

502基于SpringBoot的宠物健康咨询系统&#xff0c;系统包含三种角色&#xff1a;管理员、用户&#xff0c;顾问主要功能如下。 【用户功能】 1. 首页&#xff1a;查看系统主要信息和最新动态。 2. 公告&#xff1a;浏览系统发布的公告信息。 3. 顾问&#xff1a;浏览可提供咨询…

人工智能驱动的科研新范式及学科应用研究

人工智能&#xff08;AI&#xff09;驱动的科研新范式通过数据、算力、算法的深度耦合深度嵌入科学研究的全过程&#xff0c;引发科研流程、思考逻辑和组织模式的深刻变革。文章系统总结了AI驱动科研新范式的主要特征与形式&#xff0c;提出AI驱动科研新范式的演化方向由“科研…

代码生成工具explain的高级用法

修改 explain.cpp 中的模板部分&#xff1a; // 添加自定义头文件 cout << "#include \"CustomLib.h\"\n"; 生成支持日志的记录代码&#xff1a; cout << "Logger::init();\n"; // 自动插入初始化代码其他汇总 Magnet 多线程控制…

Vue3+elementPlus中 树形控件封装

1.组件 <template><div class"selection"><el-select placeholder"请选择" v-model"nameList" clearable clear"handleClear" ref"selectUpResId" style"width: 100%"><el-option hidden :…

辉视监狱广播对讲系统:SIP协议赋能智慧监管新生态

一、全域互联&#xff1a;构建监狱安防设备协同生态 基于SIP协议的辉视广播对讲系统&#xff0c;以"通信中枢"角色打破设备壁垒。其强大的兼容性可无缝对接监狱现有监控、门禁、报警等异构设备&#xff0c;支持GB/T 28181国标协议&#xff0c;实现跨品牌、跨系统的数…

信息系统项目管理师-工具名词解释(上)

本文章记录学习过程中,重要的知识点,是否为重点的依据,来源于官方教材和历年考题,持续更新共勉 本文章记录学习过程中,重要的知识点,是否为重点的依据,来源于官方教材和历年考题,持续更新共勉 数据收集 头脑风暴 在短时间内获得大量创意,适用于团队环境,需要引导者…

C++之二叉搜索树

目录 ⼆叉搜索树的概念 二叉搜索数的性能分析 二叉搜索树的模拟实现 定义二叉树节点结构 二叉搜索树的插入 二叉搜索树的查找 二叉搜索树的删除 中序遍历 全部代码 二叉搜索树key和key/value使用场景 key搜索场景&#xff1a; key/value搜索场景&#xff1a; key/value…

数据结构——哈希详解

数据结构——哈希详解 目录 一、哈希的定义 二、六种哈希函数的构造方法 2.1 除留取余法 2.2 平方取中法 2.3 随机数法 2.4 折叠法 2.5 数字分析法 2.6 直接定值法 三、四种解决哈希冲突的方法 3.1 开放地址法 3.1.1 线性探测法 3.1.2 二次探测法 3.2 链地址法 3…

使用U盘安装 ubuntu 系统

1. 准备U 盘制作镜像 1.1 下载 ubuntu iso https://ubuntu.com/download/ 这里有多个版本以供下载&#xff0c;本文选择桌面版。 1.2 下载rufus https://rufus.ie/downloads/ 1.3 以管理员身份运行 rufus 设备选择你用来制作启动项的U盘&#xff0c;不能选错了&#xff1b;点…

RadioMaster POCKET遥控器进入ExpressLRS界面一直显示Loading的问题解决方法

RadioMaster POCKET遥控器进入ExpressLRS界面一直显示Loading的问题解决方法 问题描述解决方法 问题描述 有一天我发现我的 RadioMaster POCKET 遥控器进入 ExpressLRS 设置界面时&#xff0c;界面却一直停留在 “Loading” 状态&#xff0c;完全无法进入设置界面。 我并没有…

计算机网络 - 三次握手相关问题

通过一些问题来讨论 TCP 协议中的三次握手机制 说一下三次握手的大致过程&#xff1f;为什么需要三次握手&#xff1f;2 次不可以吗&#xff1f;第三次握手&#xff0c;可以携带数据吗&#xff1f;第二次呢&#xff1f;三次握手连接阶段&#xff0c;最后一次ACK包丢失&#xf…

【RabbitMQ】核心概念和工作流程

文章目录 RabbitMQ 工作流程流程图 Producer 和 ConsumerConnecting 和 ChannelVirtual hostQueueExchangeRabbitMQ 工作流程 RabbitMQ 工作流程 流程图 RabbitMQ 就是一个生产者/消费者模型 Producer 就是生产者、Consumer 就是消费者Broker 是 RabbitMQ 服务器生产者和消费…