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

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 和文件操作

输入输出&#xff08;I/O&#xff09;&#xff1a;熟悉 Java 的 I/O 类库&#xff0c;尤其是 NIO 和文件操作 在 Java 中&#xff0c;I/O&#xff08;输入输出&#xff09;操作是开发中非常重要的一部分&#xff0c;用于与文件、网络和其他数据流交互。Java 提供了传统的 I/O&…...

mysql建立主从集群

mysql建立主从集群需要多个mysql服务器&#xff0c;主从数据库是通过log日志来进行同步的&#xff0c;所以需开启log-bin。本地安装多个mysql参考底部 主数据库配置 打开主数据库my.ini配置文件&#xff0c;给其配置server_id1 [mysqld] port3306 basedirD:/phpstudy_pro/1/…...

Python AI 教程之四:无监督学习

什么是无监督学习? 无监督学习是机器学习的一个分支,用于处理未标记的数据。与监督学习(其中数据被标记为特定类别或结果)不同,无监督学习算法的任务是在不了解数据含义的情况下寻找数据中的模式和关系。这使得无监督学习成为探索性数据分析的强大工具,其目标是了解数据…...

ReactiveStreams、Reactor、SpringWebFlux

注意&#xff1a; 本文内容于 2024-12-28 21:22:12 创建&#xff0c;可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容&#xff0c;请访问原文地址&#xff1a;ReactiveStreams、Reactor、SpringWebFlux。感谢您的关注与支持&#xff01; ReactiveStreams是…...

Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(下)

Qt 的信号槽机制详解&#xff1a;之信号槽引发的 Segmentation Fault 问题拆析&#xff08;下&#xff09; 前言一. 信号槽的误用导致崩溃的常见原因1.信号和槽连接的对象被提前释放案例解决方法 2.参数类型不匹配案例解决方法 3. 多线程信号槽使用不当案例解决方法 4. 信号重复…...

opencv(cpp) Mat使用总结

opencv访问矩阵的通道数 #include <opencv2/opencv.hpp> #include <iostream>int main() {// 创建一个3通道的彩色图像&#xff08;例如&#xff0c;BGR格式&#xff09;cv::Mat colorImage cv::Mat::zeros(100, 100, CV_8UC3);// 创建一个单通道的灰度图像cv::M…...

【Hackthebox 中英 Write-Up】Web Request | 分析 HTTP 请求和响应

欢迎来到我的writeup分享&#xff01;我希望大家不要只关注结果或答案&#xff0c;而是通过耐心阅读&#xff0c;尝试逆向工程理解背后的运作原理。在这里&#xff0c;你不仅能找到解题的思路&#xff0c;还能学到更多与Hack The Box等平台相关的技术和技巧&#xff0c;期待与你…...

c#多线程之生产者-消费者模型

在 C# 中实现 生产者-消费者模式&#xff0c;通常需要多个线程来处理数据的生产和消费。我们可以使用 Queue<T> 来作为存储数据的队列&#xff0c;并使用 Thread、Mutex 或 Monitor 来确保线程安全。BlockingCollection<T> 是 C# 提供的一个线程安全的集合&#xf…...

Spring Boot中幂等性的应用

在 Spring Boot 中&#xff0c;幂等性是实现分布式系统设计和接口调用的一个重要概念&#xff0c;尤其在高并发、分布式环境下&#xff0c;确保接口重复调用不会引发系统数据异常至关重要。 幂等性概念 幂等性&#xff08;Idempotence&#xff09;是指一次请求和重复多次请求…...

【机器学习】分类

文章目录 1. 能否用回归解决分类问题2. 生成模型&#xff08;概率生成&#xff09;3. 判别模型&#xff08;逻辑回归&#xff09;4. 多分类问题 1. 能否用回归解决分类问题 二元分类 数据分布不规律&#xff0c;回归函数会尽量减少误差&#xff0c;导致不合理的偏移离分界较远…...

5.若依的角色权限控制

RBAC 基于角色的访问控制&#xff0c;通过角色来分配和管理用户的菜单权限。 修改课程管理的菜单到主类目下 新建角色并分配菜单 新建用户并分配角色 添加一个根菜单&#xff0c;父级为主类目...

Lumos学习王佩丰Excel第二十三讲:饼图美化与PPT图表

一、双坐标柱形图的补充知识 1、主次坐标设置 2、主次坐标柱形避让&#xff08;通过增加两个系列&#xff0c;挤压使得两个柱形挨在一起&#xff09; 增加两个系列 将一个系列设置成主坐标轴&#xff0c;另一个设成次坐标轴 调整系列位置 二、饼图美化 1、饼图美化常见设置 …...

安装winserver2008R2虚拟机步骤

一、服务器系统介绍 1.1什么是服务器&#xff1f; 服务器英文名称为“Server”&#xff0c;指的是网络环境下为客户机(Client)提供某种服务的专用计算机&#xff0c;服务器安装有网络操作系统(如Windows 2000 Server、Linux、Unix等)和各种服务器应用系统软件(如Web服务、电子…...

ACPI PM Timer

ACPI PM Timer 概述&#xff1a; ACPI PM Timer是一个非常简单的计时器&#xff0c;它以 3.579545 MHz 运行&#xff0c;在计数器溢出时生成系统控制中断&#xff08;SCI&#xff09;。它精度较低&#xff0c;建议使用其他定时器&#xff0c;如HPET或APIC定时器。 检测ACPI P…...

Linux 和设备树

“开放固件设备树”&#xff0c;简称 Devicetree (DT)&#xff0c;是一种用于描述硬件的数据结构和语言。更具体地说&#xff0c;它是操作系统可读取的硬件描述&#xff0c;因此操作系统无需对机器的详细信息进行硬编码。 从结构上看&#xff0c;DT 是一棵树&#xff0c;或具有…...

Qt仿音乐播放器:QFileDialog添加本地文件

一、套路 QFileDialog fileDialog(this);// 创建对话框&#xff0c;并设置父元素&#xff1b;fileDialog.setWindowTitle("添加本地下载的音乐");//设置窗口标题//设置文件对话框的默认打开路径 QString projectPathQDir::currentPath();//获取当前目录 QDir dir(pr…...

Odoo 引用字段 fields.Reference:动态关系的选择器

在 Odoo 模型开发中&#xff0c;关系型字段是构建复杂应用的基础。 然而&#xff0c;传统的 m2o、o2m 和 m2m 字段需要在模型定义时就明确指定关系的目标模型&#xff0c;这在某些场景下会显得不够灵活。 为了解决这个问题&#xff0c;Odoo 提供了 fields.Reference 引用字段&a…...

Android笔试面试题AI答之Android基础(6)

Android入门请看《Android应用开发项目式教程》 文章目录 1.Android Studio版本与Gradle版本有什么关联&#xff1f;**1. Gradle 的作用****2. Android Studio 与 Gradle 的关系****3. 版本对应关系****4. 如何查看和修改版本****查看当前版本****修改版本** **5. 版本不兼容的…...

C# 中的记录类型简介 【代码之美系列】

&#x1f380;&#x1f380;&#x1f380;代码之美系列目录&#x1f380;&#x1f380;&#x1f380; 一、C# 命名规则规范 二、C# 代码约定规范 三、C# 参数类型约束 四、浅析 B/S 应用程序体系结构原则 五、浅析 C# Async 和 Await 六、浅析 ASP.NET Core SignalR 双工通信 …...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

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

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

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...