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 双工通信 …...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...