Redis集成到SpingBoot 的数据结构常见操作
一.环境配置
1.依赖注入

2.yaml文件配置

3.启动本地Redis服务
(或在虚拟机上启动,这里为了方便演示在本地启动)

4.启动成功案例

5.创建一个Controller我们开始演示
@RestController
public class MyController {@Autowiredprivate StringRedisTemplate redisTemplate;}
二 String操作
@GetMapping("/testString")public String test1String() throws JsonProcessingException {// 存储字符串//key为键,value为值,这里就像Map<String,String>redisTemplate.opsForValue().set("greeting", "Hello, World!");//获取key对应的值String valueString = redisTemplate.opsForValue().get("greeting");log.info("valueString:"+valueString);//删除keyredisTemplate.delete("greeting");String valueString2 = redisTemplate.opsForValue().get("greeting");log.info("valueString2:"+valueString2);// 存储整数int counter = 42;redisTemplate.opsForValue().set("counter", String.valueOf(counter));String valueInteger = redisTemplate.opsForValue().get("counter");log.info("valueInteger:"+valueInteger);// 存储字节数组byte[] binaryData = "some binary data".getBytes();redisTemplate.opsForValue().set("binary:key", Arrays.toString(binaryData));String valueArray = redisTemplate.opsForValue().get("binary:key");log.info("valueArray:"+valueArray);// 存储 JSON 对象User user = new User("John", "123");//Json序列化ObjectMapper objectMapper = new ObjectMapper();String jsonString = objectMapper.writeValueAsString(user);redisTemplate.opsForValue().set("user:123", jsonString);String valueJson = redisTemplate.opsForValue().get("user:123");log.info("valueJson:"+valueJson);/* //存储空值nullredisTemplate.opsForValue().set("key", null);//报错:Value must not be nullString valueNull = redisTemplate.opsForValue().get("key");log.info("valueNull:"+valueNull);*/return "OK";}
运行结果

三.List操作
@GetMapping("/testList")@ResponseBodypublic String testList() {//清空redis中所有数据,防止影响其他测试,慎用redisTemplate.getConnectionFactory().getConnection().flushAll();String ListNull = redisTemplate.opsForList().leftPop("key");System.out.println("ListNull: "+ListNull);//存储一个值,键是key,值是aredisTemplate.opsForList().leftPush("key", "a");//存储多个值,但是键值键一样都是key,值是b,c,dredisTemplate.opsForList().leftPushAll("key", "b", "c", "d");//获取第一个元素String firstElement = redisTemplate.opsForList().leftPop("key");System.out.println("frist:"+firstElement);//获取列表key的第2到第3个元素(索引从0开始),但是这里获取之后并未取出来List<String> values = redisTemplate.opsForList().range("key", 1, 2);System.out.println(values);//获取列表key的最后一个元素String finalElement = redisTemplate.opsForList().leftPop("key");System.out.println("finalElement: "+finalElement);return "OK";}
运行结果
ListNull: null
frist:d
[b, a]
finalElement: c
注意:leftPush()是往左存储,最终存储后顺序是的,d,c,b,a
四.Hash操作
@GetMapping("/testHashmap")@ResponseBodypublic String testHashmap() {//清空redis中所有数据,防止影响其他测试,慎用redisTemplate.getConnectionFactory().getConnection().flushAll();//向Redis中插入一个Hash键值对,键为 "key",字段为 "name",值为 "zhangsan"redisTemplate.opsForHash().put("key", "name", "zhangsan");//从Redis中获取刚刚插入的Hash值String value = (String) redisTemplate.opsForHash().get("key", "name");System.out.println(value);//删除Hash中的字段 "name"redisTemplate.opsForHash().delete("key", "name");//检查字段 "name" 是否还存在于Hash中boolean ok = redisTemplate.opsForHash().hasKey("key", "name");System.out.println(ok);//删除整个Hash键 "key"redisTemplate.delete("key");return "OK";}
运行结果
zhangsan
false
五.Set
@GetMapping("/testSet")@ResponseBodypublic String testSet() {//清空redis中所有数据,防止影响其他测试,慎用redisTemplate.getConnectionFactory().getConnection().flushAll();//向Redis的key中添加三个元素:aaa、bbb、cccredisTemplate.opsForSet().add("key", "aaa", "bbb", "ccc");//检查key中是否包含aaaboolean ok = redisTemplate.opsForSet().isMember("key", "aaa");System.out.println(ok);//从key中移除aaaredisTemplate.opsForSet().remove("key", "aaa");//获取key中剩余元素的数量long n = redisTemplate.opsForSet().size("key");System.out.println(n);//删除keyredisTemplate.delete("key");return "OK";}
运行结果
true
2
六.ZSet
@GetMapping("/testZSet")@ResponseBodypublic String testZSet() {//向Redis中名为key的有序集合添加三个成员:吕布、赵云和典韦,分别赋予不同的分数redisTemplate.opsForZSet().add("key", "吕布", 100);redisTemplate.opsForZSet().add("key", "赵云", 98);redisTemplate.opsForZSet().add("key", "典⻙", 95);//获取并打印分数最高的前3个成员,切记ZSet是有序集合Set<String> values = redisTemplate.opsForZSet().range("key", 0, 2);System.out.println(values);//统计并打印分数在95到100之间的成员数量long n = redisTemplate.opsForZSet().count("key", 95, 100);System.out.println(n);redisTemplate.delete("key");return "OK";}
运行结果
[典⻙, 赵云, 吕布]
3
相关文章:
Redis集成到SpingBoot 的数据结构常见操作
一.环境配置 1.依赖注入 2.yaml文件配置 3.启动本地Redis服务 (或在虚拟机上启动,这里为了方便演示在本地启动) 4.启动成功案例 5.创建一个Controller我们开始演示 RestController public class MyController {Autowiredprivate StringRedisTemplate redisTemplate;} 二 …...
输入输出(I/O):熟悉 Java 的 I/O 类库,尤其是 NIO 和文件操作
输入输出(I/O):熟悉 Java 的 I/O 类库,尤其是 NIO 和文件操作 在 Java 中,I/O(输入输出)操作是开发中非常重要的一部分,用于与文件、网络和其他数据流交互。Java 提供了传统的 I/O&…...
mysql建立主从集群
mysql建立主从集群需要多个mysql服务器,主从数据库是通过log日志来进行同步的,所以需开启log-bin。本地安装多个mysql参考底部 主数据库配置 打开主数据库my.ini配置文件,给其配置server_id1 [mysqld] port3306 basedirD:/phpstudy_pro/1/…...
Python AI 教程之四:无监督学习
什么是无监督学习? 无监督学习是机器学习的一个分支,用于处理未标记的数据。与监督学习(其中数据被标记为特定类别或结果)不同,无监督学习算法的任务是在不了解数据含义的情况下寻找数据中的模式和关系。这使得无监督学习成为探索性数据分析的强大工具,其目标是了解数据…...
ReactiveStreams、Reactor、SpringWebFlux
注意: 本文内容于 2024-12-28 21:22:12 创建,可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容,请访问原文地址:ReactiveStreams、Reactor、SpringWebFlux。感谢您的关注与支持! ReactiveStreams是…...
Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(下)
Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(下) 前言一. 信号槽的误用导致崩溃的常见原因1.信号和槽连接的对象被提前释放案例解决方法 2.参数类型不匹配案例解决方法 3. 多线程信号槽使用不当案例解决方法 4. 信号重复…...
opencv(cpp) Mat使用总结
opencv访问矩阵的通道数 #include <opencv2/opencv.hpp> #include <iostream>int main() {// 创建一个3通道的彩色图像(例如,BGR格式)cv::Mat colorImage cv::Mat::zeros(100, 100, CV_8UC3);// 创建一个单通道的灰度图像cv::M…...
【Hackthebox 中英 Write-Up】Web Request | 分析 HTTP 请求和响应
欢迎来到我的writeup分享!我希望大家不要只关注结果或答案,而是通过耐心阅读,尝试逆向工程理解背后的运作原理。在这里,你不仅能找到解题的思路,还能学到更多与Hack The Box等平台相关的技术和技巧,期待与你…...
c#多线程之生产者-消费者模型
在 C# 中实现 生产者-消费者模式,通常需要多个线程来处理数据的生产和消费。我们可以使用 Queue<T> 来作为存储数据的队列,并使用 Thread、Mutex 或 Monitor 来确保线程安全。BlockingCollection<T> 是 C# 提供的一个线程安全的集合…...
Spring Boot中幂等性的应用
在 Spring Boot 中,幂等性是实现分布式系统设计和接口调用的一个重要概念,尤其在高并发、分布式环境下,确保接口重复调用不会引发系统数据异常至关重要。 幂等性概念 幂等性(Idempotence)是指一次请求和重复多次请求…...
【机器学习】分类
文章目录 1. 能否用回归解决分类问题2. 生成模型(概率生成)3. 判别模型(逻辑回归)4. 多分类问题 1. 能否用回归解决分类问题 二元分类 数据分布不规律,回归函数会尽量减少误差,导致不合理的偏移离分界较远…...
5.若依的角色权限控制
RBAC 基于角色的访问控制,通过角色来分配和管理用户的菜单权限。 修改课程管理的菜单到主类目下 新建角色并分配菜单 新建用户并分配角色 添加一个根菜单,父级为主类目...
Lumos学习王佩丰Excel第二十三讲:饼图美化与PPT图表
一、双坐标柱形图的补充知识 1、主次坐标设置 2、主次坐标柱形避让(通过增加两个系列,挤压使得两个柱形挨在一起) 增加两个系列 将一个系列设置成主坐标轴,另一个设成次坐标轴 调整系列位置 二、饼图美化 1、饼图美化常见设置 …...
安装winserver2008R2虚拟机步骤
一、服务器系统介绍 1.1什么是服务器? 服务器英文名称为“Server”,指的是网络环境下为客户机(Client)提供某种服务的专用计算机,服务器安装有网络操作系统(如Windows 2000 Server、Linux、Unix等)和各种服务器应用系统软件(如Web服务、电子…...
ACPI PM Timer
ACPI PM Timer 概述: ACPI PM Timer是一个非常简单的计时器,它以 3.579545 MHz 运行,在计数器溢出时生成系统控制中断(SCI)。它精度较低,建议使用其他定时器,如HPET或APIC定时器。 检测ACPI P…...
Linux 和设备树
“开放固件设备树”,简称 Devicetree (DT),是一种用于描述硬件的数据结构和语言。更具体地说,它是操作系统可读取的硬件描述,因此操作系统无需对机器的详细信息进行硬编码。 从结构上看,DT 是一棵树,或具有…...
Qt仿音乐播放器:QFileDialog添加本地文件
一、套路 QFileDialog fileDialog(this);// 创建对话框,并设置父元素;fileDialog.setWindowTitle("添加本地下载的音乐");//设置窗口标题//设置文件对话框的默认打开路径 QString projectPathQDir::currentPath();//获取当前目录 QDir dir(pr…...
Odoo 引用字段 fields.Reference:动态关系的选择器
在 Odoo 模型开发中,关系型字段是构建复杂应用的基础。 然而,传统的 m2o、o2m 和 m2m 字段需要在模型定义时就明确指定关系的目标模型,这在某些场景下会显得不够灵活。 为了解决这个问题,Odoo 提供了 fields.Reference 引用字段&a…...
Android笔试面试题AI答之Android基础(6)
Android入门请看《Android应用开发项目式教程》 文章目录 1.Android Studio版本与Gradle版本有什么关联?**1. Gradle 的作用****2. Android Studio 与 Gradle 的关系****3. 版本对应关系****4. 如何查看和修改版本****查看当前版本****修改版本** **5. 版本不兼容的…...
C# 中的记录类型简介 【代码之美系列】
🎀🎀🎀代码之美系列目录🎀🎀🎀 一、C# 命名规则规范 二、C# 代码约定规范 三、C# 参数类型约束 四、浅析 B/S 应用程序体系结构原则 五、浅析 C# Async 和 Await 六、浅析 ASP.NET Core SignalR 双工通信 …...
YOLOv8训练自己的道路裂缝数据集,从数据标注到模型部署的保姆级避坑指南
YOLOv8道路裂缝检测实战:从数据标注到模型部署的全流程避坑指南 道路养护工程师小张最近遇到了头疼的问题——每天需要人工巡检数十公里道路,用粉笔标记裂缝位置再拍照记录。这种传统方式效率低下且容易遗漏细微裂缝。直到他发现了YOLOv8这个目标检测利器…...
chronyd服务端123端口未启动的深度排查与修复指南
1. 问题现象与初步判断 最近在搭建NTP时间同步架构时遇到了一个典型问题:作为中转节点的Master服务器123端口未启动,导致下游ServerA设备无法同步时间。具体表现为执行chronyc sources命令时,客户端显示^?符号(表示无法连接服务端…...
基于carsim Simulink联合仿真和预瞄PID算法的轨迹跟踪模型】车辆路径跟踪包括主车...
基于carsim Simulink联合仿真和预瞄PID算法的轨迹跟踪模型】车辆路径跟踪包括主车的纵向和横向运动控制,纵向控制是通过调整轮毂电机的扭矩,使得车辆以期望的速度行驶;横向控制是通过调整主车的转向,使主车沿预期的轨迹行驶。 本模…...
如何高效解析和生成PSD文件:Ag-PSD库完整指南
如何高效解析和生成PSD文件:Ag-PSD库完整指南 【免费下载链接】ag-psd Javascript library for reading and writing PSD files 项目地址: https://gitcode.com/gh_mirrors/ag/ag-psd 在当今数字设计工作流中,Photoshop文档(PSD&#…...
SAP ABAP RFC函数外部调用Debug全攻略:从SE37设置到断点跟踪
SAP ABAP RFC函数外部调用Debug全攻略:从SE37设置到断点跟踪 在跨系统集成的复杂场景中,RFC函数调试往往让开发者头疼不已。想象一下这样的场景:你开发的RFC接口在生产环境突然报错,但本地测试一切正常;或者第三方系统…...
别再手动测PLC了!用C# + Modbus Poll/Slave + VSPD三件套,5分钟搞定ModbusRTU通信仿真
工业自动化开发者的效率革命:C#与Modbus仿真工具链实战指南 在工业自动化领域,时间就是金钱。传统PLC调试过程中,工程师常常需要反复连接真实硬件设备,忍受着物理线路故障、设备资源占用和不可复现的测试环境等问题。这种低效的工…...
Buildah多平台容器构建终极指南:使用QEMU跨架构构建Docker镜像
Buildah多平台容器构建终极指南:使用QEMU跨架构构建Docker镜像 【免费下载链接】buildah A tool that facilitates building OCI images. 项目地址: https://gitcode.com/gh_mirrors/bu/buildah Buildah作为专业的OCI镜像构建工具,为开发者提供了…...
uniapp 抖音生态集成实战:从授权登录到内容发布与社交分享
1. 为什么要在uniapp中集成抖音生态? 对于电商类或内容社区类的uniapp应用来说,抖音生态的集成价值主要体现在三个方面:流量获取、用户增长和内容传播。抖音作为国内最大的短视频平台之一,拥有庞大的用户群体和活跃的内容生态。通…...
比迪丽FLUX.1效果对比:相比SDXL,面部结构准确率提升18.7%
比迪丽FLUX.1效果对比:相比SDXL,面部结构准确率提升18.7% 1. 引言:当动漫角色遇上新一代AI绘画引擎 如果你是一位《龙珠》的粉丝,或者热衷于用AI生成动漫角色,那么“比迪丽”这个名字你一定不陌生。作为悟饭的妻子&a…...
Realistic Vision V5.1显存占用对比:启用offload前后VRAM峰值下降62%实测
Realistic Vision V5.1显存占用对比:启用offload前后VRAM峰值下降62%实测 1. 项目背景与技术特点 Realistic Vision V5.1是目前Stable Diffusion 1.5生态中最顶级的写实风格模型之一,能够生成媲美专业单反相机拍摄的人像作品。然而在实际使用中&#x…...
