Spring Data Redis操作Redis
- 在Spring Boot项目中,可以使用Spring Data Redis来简化Redis操作,maven的依赖坐标:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
8.3.3、操作Redis的步骤
(1)创建一个Spring Boot工程;
(2)在pom.xml文件中导入以上Spring Data Redis的依赖坐标;
(3)配置application.yml文件:
#spring的配置
spring:application:name: springdataRedis_demomain:#解决升级Spring Boot2.6后,因依赖循环引用导致启动时报错的问题allow-circular-references: true#Redis的相关配置(在spring下)redis:port: 6379 #默认端口号host: localhost #表示连接的是本地的服务,要连接远程的话,需要更改为远程服务器的ip地址#设置密码(在redis的redis.windows.conf配置文件中有设置密码的话,这里要配置)#password: 123456database: 0 #默认提供了16个数据库,编号为0-15,在命令行可以通过select index更改数据库#jedis的配置jedis:#Redis连接池配置pool:max-active: 8 #最大连接数max-wait: 1ms #连接池最大阻塞等待时间max-idle: 4 #连接池中的最大空闲连接min-idle: 0 #连接池中最小空闲连接
(4)配置序列化配置类:
package com.itcast.springdataredis_demo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** @author :LTY* @date :Created in 2023/7/20 16:37* @description:序列化配置类* @modified By:* @version: $*/
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {//1.创建RedisTemplate对象RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();//默认的key序列化器为: JdkSerializationRedisSerializerredisTemplate.setKeySerializer(new StringRedisSerializer()); //String类型redisTemplate.setHashKeySerializer(new StringRedisSerializer()); //Hash哈希类型//设置Value的序列化redisTemplate.setValueSerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new StringRedisSerializer());//2.设置连接工厂redisTemplate.setConnectionFactory(redisConnectionFactory);return redisTemplate;}
}
(5)测试各数据类型的数据
首先在测试类上进行如下修改:
-
String类型数据
测试代码:
/*** 操作String类型数据*/@Testpublic void testString() {redisTemplate.opsForValue().set("city12", "beijing");String city = (String)redisTemplate.opsForValue().get("city12");System.out.println(city);//设置10秒的过去时间(对应redis的String类型的setex key seconds value命令)redisTemplate.opsForValue().set("key1", "value1", 10L, TimeUnit.SECONDS);//对应redis的String类型的setnx key value命令redisTemplate.opsForValue().setIfAbsent("city12","shanghai");}
运行结果如下:
- Hash哈希类型数据
测试代码:
/*** hash哈希类型数据*/@Testpublic void testHash() {HashOperations hashOperations = redisTemplate.opsForHash();//存入数据(对应hset命令)hashOperations.put("002","name","xiaohong");hashOperations.put("002","age","21");hashOperations.put("002","sex","male");//获取单个字段的值(对应hget命令)String name = (String)hashOperations.get("002", "name");System.out.println("获得单个字段的值(hget key field): " +name);//获得hash结构中所有的字段(对应hkeys命令)System.out.println("获得hash结构中所有的字段(hkeys key): ");Set keys = hashOperations.keys("002");for (Object key : keys) {System.out.println(key);}//获得hash结构中所有的字段的值(对应hvals命令)System.out.println("获得hash结构中所有的字段的值(kvals key): ");List values = hashOperations.values("002");for (Object value : values) {System.out.println(value);}//获取哈希表中指定key的所有字段和值(hgetall key)System.out.println("获得哈希表中指定key的所有字段和值(hgetall key): ");Map entries = hashOperations.entries("002");System.out.println(entries);}
运行结果如下:
-
List类型数据
测试代码:
/*** 操作List类型的数据*/@Testpublic void testList() {ListOperations listOperations = redisTemplate.opsForList();//存值(从左边存值)listOperations.leftPush("mylist", "a"); //存一个listOperations.leftPushAll("mylist","b","c","d"); //存多个//从右边存值listOperations.rightPush("mylist", "e");listOperations.rightPushAll("mylist", "f","g");//此时存入的值顺序:d c b a e f g//取值(从表头到表尾依次输出)List<String> mylist = listOperations.range("mylist", 0, -1);for (String s : mylist) {System.out.println(s); //输出:d c b a e f g}//获取列表的菜单llenSystem.out.println("...............移除...........");Long size = listOperations.size("mylist");int i1 = size.intValue();for (int i = 0; i < i1; i++) {//出队/*** leftPop:移除并获取第一个元素(从表头出队(左边))* rightPop:移除并获取最后一个元素(从表尾移除(右边))*/ // String mylist1 = (String)listOperations.rightPop("mylist"); // System.out.println(mylist1); //输出:g f e a b c d//rightPopAndLeftPush:从mylist表尾移除数据,并在mylist2左边(表头)存值listOperations.rightPopAndLeftPush("mylist","mylist2", 10l, TimeUnit.SECONDS);//存入顺序:d c b a e f g}//取值System.out.println("..........mylist2..........");List<String> mylist2 = listOperations.range("mylist2", 0, -1);for (String s1 : mylist2) {System.out.println(s1); //输出:d c b a e f g}}
运行结果如下:
- Set类型数据
①基本操作
测试代码:
/*** 操作Set类型数据*/@Testpublic void testSet() {SetOperations setOperations = redisTemplate.opsForSet();//存值(sadd)setOperations.add("myset", "a", "b", "c","a");//取值(smembers)Set<String> myset = setOperations.members("myset");//获得集合的成员数(scard)System.out.println("集合的成员数为: " + setOperations.size("myset"));for (String s : myset) {System.out.println(s); //输出:}//删除一个或多个成员(srem)setOperations.remove("myset", "a", "b");//取值myset = setOperations.members("myset");for (String string : myset) {System.out.println(string);}}
运行结果:
②交集、并集和差集
测试代码:
/*** 交集、并集和差集*/@Testpublic void testSet2() {redisTemplate.opsForSet().add("myset2", "a", "b", "c");redisTemplate.opsForSet().add("myset3", "a", "b", "e");//交集System.out.println("myset2与myset3的交集为: ");Set<String> intersect = redisTemplate.opsForSet().intersect("myset2", "myset3");for (String o : intersect) {System.out.println(o);}//并集System.out.println("myset2与myset3的并集为: ");Set<String> union = redisTemplate.opsForSet().union("myset2", "myset3");for (String o : union) {System.out.println(o);}//差集//myset2-myset3System.out.println("myset2与myset3的差集为(myset2-myset3): ");Set<String> difference1 = redisTemplate.opsForSet().difference("myset2", "myset3");for (String o : difference1) {System.out.println(o);}//myset3-myset2System.out.println("myset3与myset2的差集为(myset3-myset2): ");Set<String> difference2 = redisTemplate.opsForSet().difference("myset3", "myset2");for (String o : difference2) {System.out.println(o);}}
运行结果:
- ZSet类型数据
测试代码:
/*** 操作ZSet类型数据*/@Testpublic void testZSet() {ZSetOperations zSetOperations = redisTemplate.opsForZSet();//存值zSetOperations.add("myZSet", "a", 20.0);zSetOperations.add("myZSet", "b", 30.0);zSetOperations.add("myZSet", "c", 40.0);zSetOperations.add("myZSet", "a", 50.0);//取值Set<String> myZSet = zSetOperations.range("myZSet", 0, -1);for (String s : myZSet) {System.out.println(s);}
运行结果:
- 通用操作
测试代码:
/*** 通用操作,针对不同类型的数据类型都可以进行操作*/@Testpublic void testCommon() {//获取Redis中所有的keySet<String> keys = redisTemplate.keys("*");for (String key : keys) {System.out.println(key);}//判断某个key是否存在Boolean itcast = redisTemplate.hasKey("itcast");System.out.println(itcast);//删除指定的keyredisTemplate.delete("myZSet");//获得指定的key对应的value的数据类型DataType type = redisTemplate.type("myset");System.out.println(type);}
运行结果:
相关文章:

Spring Data Redis操作Redis
在Spring Boot项目中,可以使用Spring Data Redis来简化Redis操作,maven的依赖坐标: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></…...

sqlite触发器1
SQLite 的触发器(Trigger)可以指定在特定的数据库表发生 DELETE、INSERT 或 UPDATE 时触发,或在一个或多个指定表的列发生更新时触发。 SQLite 只支持 FOR EACH ROW 触发器(Trigger),没有 FOR EACH STATEM…...

python中——requests爬虫【中文乱码】的3种解决方法
requests是一个较为简单易用的HTTP请求库,是python中编写爬虫程序最基础常用的一个库。 而【中文乱码】问题,是最常遇到的问题,对于初学者来说,是很困恼的。 本文将详细说明,python中使用requests库编写爬虫程序时&…...
E. Nastya and Potions(DFS+记忆化搜索)
炼金术士纳斯蒂亚喜欢混合药剂。一共有n种药剂,ci硬币可以买到一种 i 型药剂。 任何一种药剂都只能通过一种方式获得,即混合其他几种药剂。混合过程中使用的药剂将被消耗掉。此外,任何药剂都不能通过一个或多个混合过程从自身获得。 作为一名…...
什么是tcp rst以及什么时候产生?
rst包是仅在header control bits设置rst的空payload包,用于强制关闭tcp连接。常在以下场景发送 远程主机没有监听该端口 远程主机强迫关闭了一个现有连接。比如服务端进程崩溃后重启会向之前连接发送rst 相比于四次挥手的fin,rst是在异常情况下的无条…...

Visual Studio Code配置免密远程开发环境
VSCode安装插件 要是想连接远程服务器,先在本地安装下面的插件(红色圈起来的需要装) 连接远程服务器 配置服务器信息 保存然后再连接,输入密码,如果能连接上说明是没问题的,下面开始免密登录 免密配置 客…...

flutter android Webview 打开网页错误ERR_CLEARTEXT_NOT_PERMITTED 、 net:ERR_CACHE_MISS
当你在Flutter应用中尝试打开一个非安全连接的网页(例如HTTP连接而不是HTTPS连接)时,可能会遇到"ERR_CLEARTEXT_NOT_PERMITTED"错误。这是因为默认情况下,Android 9及更高版本禁止应用程序通过非安全的明文HTTP连接进行…...

ARP协议(地址解析协议)
文章目录 ARP协议(地址解析协议)MAC地址ARP协议ARP具体实现同一链路不同链路 ARP 缓存缓存查询 APR请求/响应报文 ARP协议(地址解析协议) MAC地址 MAC 地址的全称是 Media Access Control Address,即媒体访问控制地址…...
【贪心算法】334. 递增的三元子序列
334. 递增的三元子序列 解题思路 找到的递增序列 不一定是连续的固定第一个数first 然后开始向后找第二个数second要求second 大于 first 找到之后 向后找第三个数third 找到 返回true如果third < first 那么更新first third 重新找如果只是third > first 更新second …...

react实现路由跳转动画
下载插件 npm i react-transition-group 配置路由 import { createBrowserRouter as ReactRouter,Navigate } from "react-router-dom";import App from ../App.js import Login from "../view/login.js"; import Home from "../home.js"; co…...

(二)RabbitMQ【安装Erlang、安装RabbitMQ 、账户管理、管控台、Docker安装 】
Lison <dreamlison163.com>, v1.0.0, 2023.06.22 RabbitMQ【安装Erlang、安装RabbitMQ 、账户管理、管控台、Docker安装 】 文章目录 RabbitMQ【安装Erlang、安装RabbitMQ 、账户管理、管控台、Docker安装 】**安装Erlang**安装RabbitMQ账户管理管控台Docker安装RabbitM…...

springboot mybatis-plus 多数据源配置(HikariCP)
1.导入依赖jar <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.postgresql</groupId><artifactId>postgres…...

跃焱邵隼网站demo
xdm 网站的代码开源了。 今年迷上摄影和剪辑了,所以很少投入到网站的维护。 然后经过群友的一些反馈,所以决定 将网站上demo开源放出来了。 后面有机会再出一些好玩的东西。 哦 对了 3d 编辑器我已经融入地图了 年底搞一些好玩的东西出来。 可以关注…...

3. Spring 更简单的读取和存储对象(五大类注解 方法注解)
目录 1. 存储 Bean 对象 1.1 配置扫描路径 1.2 添加注解存储 Bean 对象 1.2.1 Controller(控制器存储) 1.2.2 Service(服务存储) 1.2.3 Repository(仓库存储) 1.2.4 Component(组件存储&…...
TypeScript基础篇 - 泛型
目录 泛型的概念 接口是对方面的描述(Aspect),继承其中几个方法。重定义方法 泛型是对共性的提取 泛型(Generics) 泛型的例子 泛型类 推荐写法 泛型约束 keyof操作符 泛型的特化(实例化ÿ…...
C++ 常量
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。 常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。 常量就像是常规的变量,只不过常量的值在定义后不能进行修改。 整数常量…...

智安网络|实现数据安全:探索数据动态脱敏的落地策略
在当今数字化时代,数据安全成为企业和组织管理中的头等大事。然而,数据共享和数据大规模处理的需求也日益增长,这就需要在数据传输和存储过程中采取措施来保护用户的隐私。数据动态脱敏技术应运而生,为解决数据隐私和保护的问题提…...

全加器(多位)的实现
一,半加器 定义 半加器(Half Adder)是一种用于执行二进制数相加的简单逻辑电路。它可以将两个输入位的和(Sum)和进位(Carry)计算出来。 半加器有两个输入:A 和 B,分别代表…...

Clion开发stm32之微妙延迟(采用nop指令实现)
前言 需要借助逻辑分析仪动态调整参数此次测试的开发芯片为stm32f103vet6 延迟函数 声明 #define NOP_US_DELAY_MUL_CNT 5 /*nop 微妙延迟需要扩大的倍数(根据实际动态修改)*/ void bsp_us_delay_nop(uint32_t us);void bsp_ms_delay_nop(uint32_t ms);定义 void bsp_us_dela…...

Spring MVC -- 获取参数(普通对象+JSON对象+URL地址参数+文件+Cookie/Session/Header)
目录 1.获取参数 1.1获取单个参数 1.2获取多个参数 传参注意事项: 2.获取对象 3.后端参数重命名RequestParam 4.获取JSON对象RequestBody 5.从 URL 地址中获取参数 PathVariable 6.上传文件 RequestPart 7.获取Cookie/Session/Header 7.1 获取 Request 和…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...