当前位置: 首页 > 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 和…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

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 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...