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

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项目中&#xff0c;可以使用Spring Data Redis来简化Redis操作&#xff0c;maven的依赖坐标&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></…...

sqlite触发器1

SQLite 的触发器&#xff08;Trigger&#xff09;可以指定在特定的数据库表发生 DELETE、INSERT 或 UPDATE 时触发&#xff0c;或在一个或多个指定表的列发生更新时触发。 SQLite 只支持 FOR EACH ROW 触发器&#xff08;Trigger&#xff09;&#xff0c;没有 FOR EACH STATEM…...

python中——requests爬虫【中文乱码】的3种解决方法

requests是一个较为简单易用的HTTP请求库&#xff0c;是python中编写爬虫程序最基础常用的一个库。 而【中文乱码】问题&#xff0c;是最常遇到的问题&#xff0c;对于初学者来说&#xff0c;是很困恼的。 本文将详细说明&#xff0c;python中使用requests库编写爬虫程序时&…...

E. Nastya and Potions(DFS+记忆化搜索)

炼金术士纳斯蒂亚喜欢混合药剂。一共有n种药剂&#xff0c;ci硬币可以买到一种 i 型药剂。 任何一种药剂都只能通过一种方式获得&#xff0c;即混合其他几种药剂。混合过程中使用的药剂将被消耗掉。此外&#xff0c;任何药剂都不能通过一个或多个混合过程从自身获得。 作为一名…...

什么是tcp rst以及什么时候产生?

rst包是仅在header control bits设置rst的空payload包&#xff0c;用于强制关闭tcp连接。常在以下场景发送 远程主机没有监听该端口 远程主机强迫关闭了一个现有连接。比如服务端进程崩溃后重启会向之前连接发送rst 相比于四次挥手的fin&#xff0c;rst是在异常情况下的无条…...

Visual Studio Code配置免密远程开发环境

VSCode安装插件 要是想连接远程服务器&#xff0c;先在本地安装下面的插件&#xff08;红色圈起来的需要装&#xff09; 连接远程服务器 配置服务器信息 保存然后再连接&#xff0c;输入密码&#xff0c;如果能连接上说明是没问题的&#xff0c;下面开始免密登录 免密配置 客…...

flutter android Webview 打开网页错误ERR_CLEARTEXT_NOT_PERMITTED 、 net:ERR_CACHE_MISS

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

ARP协议(地址解析协议)

文章目录 ARP协议&#xff08;地址解析协议&#xff09;MAC地址ARP协议ARP具体实现同一链路不同链路 ARP 缓存缓存查询 APR请求/响应报文 ARP协议&#xff08;地址解析协议&#xff09; MAC地址 MAC 地址的全称是 Media Access Control Address&#xff0c;即媒体访问控制地址…...

【贪心算法】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 网站的代码开源了。 今年迷上摄影和剪辑了&#xff0c;所以很少投入到网站的维护。 然后经过群友的一些反馈&#xff0c;所以决定 将网站上demo开源放出来了。 后面有机会再出一些好玩的东西。 哦 对了 3d 编辑器我已经融入地图了 年底搞一些好玩的东西出来。 可以关注…...

3. Spring 更简单的读取和存储对象(五大类注解 方法注解)

目录 1. 存储 Bean 对象 1.1 配置扫描路径 1.2 添加注解存储 Bean 对象 1.2.1 Controller&#xff08;控制器存储&#xff09; 1.2.2 Service&#xff08;服务存储&#xff09; 1.2.3 Repository&#xff08;仓库存储&#xff09; 1.2.4 Component&#xff08;组件存储&…...

TypeScript基础篇 - 泛型

目录 泛型的概念 接口是对方面的描述&#xff08;Aspect&#xff09;&#xff0c;继承其中几个方法。重定义方法 泛型是对共性的提取 泛型&#xff08;Generics&#xff09; 泛型的例子 泛型类 推荐写法 泛型约束 keyof操作符 泛型的特化&#xff08;实例化&#xff…...

C++ 常量

常量是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。 常量可以是任何的基本数据类型&#xff0c;可分为整型数字、浮点数字、字符、字符串和布尔值。 常量就像是常规的变量&#xff0c;只不过常量的值在定义后不能进行修改。 整数常量…...

智安网络|实现数据安全:探索数据动态脱敏的落地策略

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

全加器(多位)的实现

一&#xff0c;半加器 定义 半加器&#xff08;Half Adder&#xff09;是一种用于执行二进制数相加的简单逻辑电路。它可以将两个输入位的和&#xff08;Sum&#xff09;和进位&#xff08;Carry&#xff09;计算出来。 半加器有两个输入&#xff1a;A 和 B&#xff0c;分别代表…...

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获取多个参数 传参注意事项&#xff1a; 2.获取对象 3.后端参数重命名RequestParam 4.获取JSON对象RequestBody 5.从 URL 地址中获取参数 PathVariable 6.上传文件 RequestPart 7.获取Cookie/Session/Header 7.1 获取 Request 和…...

超短脉冲激光自聚焦效应

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

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;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 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

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

OPENCV形态学基础之二腐蚀

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

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...