Redis 之九:Spring Data Redis -- Redis Template 用法

SpringData Redis

Spring Data Redis 是 Spring Data 项目的一部分,它为 Java 应用程序提供了一种便捷的方式来与 Redis 数据库进行交互。

Spring Data Redis 提供了对 Redis 的抽象封装,使得开发者能够以面向对象的方式操作 Redis,并简化了 Redis 在 Spring 管理的应用中的集成工作。

其主要特性包括:

  1. 自动配置:在使用 Spring Boot 时,通过引入 spring-boot-starter-data-redis 启动器,可以快速实现自动配置和连接到 Redis 服务器。
  2. 模板类:提供了 RedisTemplate 类,这是一个通用的 Redis 操作类,用于执行 Redis 命令以及转换键值对的序列化和反序列化过程。
  3. Repository 支持:类似于 Spring Data JPA,Spring Data Redis 也支持自定义 Repository 接口,通过继承 CrudRepositoryPagingAndSortingRepository 或自定义方法来简化 CRUD 操作。
  4. 数据绑定:可以通过注解或元数据映射将 Java 对象与 Redis 中的数据结构(例如 Hash)关联起来,简化复杂类型的操作。
  5. 事务管理:支持 Redis 事务处理,可以通过编程式或者声明式事务管理来保证数据的一致性。
  6. 发布订阅(Pub/Sub):提供了对 Redis 发布/订阅功能的支持,方便构建消息驱动的系统。
  7. 缓存支持:结合 Spring Cache Abstraction,可以利用 Redis 作为分布式缓存解决方案

Spring Data Redis 提供的两个核心API:RedisTemplate 模板类 和 CrudRepository 持久化接口

下面先来介绍 Spring Data Redis 中的 RedisTemplate 的具体用法

一、配置pom.xml

首先创建springboot项目

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency>
</dependencies>

二、配置 application

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456
spring.redis.database=1      # 0~15 默认0

三、DAO RedisTemplate依赖

@Autowired
private RedisTemplate redisTemplate;
 public void set(Student student){//保存基本信息  String  注意:不能使用相同的 name 去redis客户端取值的。redisTemplate.opsForValue().set("name",student.getName());}public void get(String key){String name = redisTemplate.opsForValue().get("name").toString();System.out.println(name);}

四、测试

@SpringBootTest
class DemoApplicationTests {@Autowiredprivate StudentDao studentDao;@Testvoid set() {Student student = new Student();student.setName("AAAAAAAAAAABBBBBBBBBBB");studentDao.set(student);}@Testvoid get(){studentDao.get(null);}
}

就此,来测试是否连通 redis 。保存和取值 String 进行测试。

五、保存一个对象

1. 实体类,实现序列化接口

@Data
public class Student implements Serializable {private String name;private int age;
}

2.编写DAO

    public void set(Student student){redisTemplate.opsForValue().set("student",student);  //存储对象}
  public Student get(String key){return (Student) redisTemplate.opsForValue().get(key);}

六、list 类型操作

public void pushlist(){//获取操作list类型的 工具类ListOperations<String,String> listOperations = redisTemplate.opsForList();listOperations.leftPush("words","Sky");listOperations.leftPush("words","Desk");listOperations.leftPush("words","Person");  //添加队头listOperations.rightPush("words","Apple");  //追加队尾
}
public void rangeList(){ListOperations<String,String> listOperations = redisTemplate.opsForList();List<String> list = listOperations.range("words", 0, Integer.MAX_VALUE);System.out.println(list);
}

七、set 类型

public void setadd(){SetOperations setOperations = redisTemplate.opsForSet();setOperations.add("myset","A","B","C");setOperations.add("myset","X","Y","C");}
public void setmembers(){SetOperations setOperations = redisTemplate.opsForSet();Set myset = setOperations.members("myset");System.out.println(myset);
}

八、zset 类型

public void zsetadd(){ZSetOperations zSetOperations = redisTemplate.opsForZSet();//第三个为score 排序依据分数 权重zSetOperations.add("zset","CCC",5);zSetOperations.add("zset","DDD",3);zSetOperations.add("zset","AAA",1);zSetOperations.add("zset","EEE",2);zSetOperations.add("zset","BBB",4);
}
public void zsetget(){ZSetOperations zSetOperations = redisTemplate.opsForZSet();Set zset = zSetOperations.range("zset", 0, 100);System.out.println(zset);
}

九、hash 类型

public void hashadd(){HashOperations hashOperations = redisTemplate.opsForHash();hashOperations.put("person","sid","1001");hashOperations.put("person","age","23");Map<String,String> map = new HashMap<>();map.put("name","诸葛亮");map.put("email","zhuge@sina.com");hashOperations.putAll("person",map);
}public void hashget(){HashOperations<String,String,String> hashOperations = redisTemplate.opsForHash();Map<String,String> map =  hashOperations.entries("person");System.out.println(map);
}

十、序列化乱码问题

使用 RedisTemplate 存取redis的数据时,因为序列化原因,存入的数据看上去乱码,不是原本设置的key。 但是不影响应用程序的存取。但是直接操作redis 查看还是不太方便。下面来解决这个问题

1. 添加 jackson 依赖

因为下面的配置类需要依赖json

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.11.0</version>
</dependency>

2. 编写配置类

package com.example.demo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class Config {@Autowiredprivate RedisTemplate redisTemplate;@Beanpublic RedisTemplate redisTemplateInit() {//设置序列化Key的实例化对象redisTemplate.setKeySerializer(new StringRedisSerializer());//设置序列化Value的实例化对象redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());return redisTemplate;}
}

再次运行保存

 public void set(Student student){
//        redisTemplate.opsForValue().set("name",student.getName());redisTemplate.opsForValue().set("student",student);  //存储对象}

在redis 中就可以看到和使用 student 作为 key 来查看数据了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab 写入格式化文本文件

目录 一、save函数 二、fprintf函数 matlab 写入文本文件可以使用save和fprintf函数 save输出结果: fprintf输出结果: 1.23, 2.34, 3.45 4.56, 5.67, 6.78 7.89, 8.90, 9.01 可以看出fprintf输出结果更加人性化,符合要求,下面分别介绍。 一、save函数 …

linux系统Jenkins工具介绍

Jenkins概念介绍 Jenkins概念Jenkins目的特性产品发布流程 Jenkins概念 Jenkins是一个功能强大的应用程序&#xff0c;允许持续集成和持续交付项目&#xff0c;无论用的是什么平台。这是一个免费的源代码&#xff0c;可以处理任何类型的构建或持续集成。集成Jenkins可以用于一些…

MQL5-MT5连接上国内期货

主要原因是昨天在学习MACD时发现给的基础代码感觉不对&#xff0c;但无法证明&#xff0c;因为MT5接的都是外汇交易&#xff0c;数据和国内的文华啥的全对不上&#xff0c;便找了一些国内接CTP的&#xff0c;直接写代码有点麻烦&#xff0c;虽然之前对接过国内CTP的东西&#x…

AI入门笔记(三)

神经网络是如何工作的 神经网络又是如何工作的呢&#xff1f;我们用一个例子来解释。我们看下面这张图片&#xff0c;我们要识别出这些图片都是0并不难&#xff0c;要怎么交给计算机&#xff0c;让计算机和我们得出同样的结果&#xff1f;难点就在于模式识别的答案不标准&…

十二、Nacos源码系列:Nacos配置中心原理(四)- RefreshEvent 事件处理

前面文章&#xff0c;我们说到回调监听器的方法中&#xff0c;主要就是发布了一个RefreshEvent事件&#xff0c;这个事件主要由 SpringCloud 相关类来处理。今天我们继续分析后续的流程。 RefreshEvent 事件会由 RefreshEventListener 来处理&#xff0c;该 listener 含有一个 …

Object类方法

toString(): 返回对象的字符串表示形式。默认情况下&#xff0c;返回对象的类名和哈希码的十六进制表示。 equals(Object obj): 比较两个对象是否相等。默认情况下&#xff0c;这个方法比较的是两个对象的引用是否相同&#xff0c;但是通常会在子类中重写这个方法以实现自定义…

武器大师——操作符详解(下)

目录 六、单目操作符 七、逗号表达式 八、下标引用以及函数调用 8.1.下标引用 8.2.函数调用 九、结构体 9.1.结构体 9.1.1结构的声明 9.1.2结构体的定义和初始化 9.2.结构成员访问操作符 9.2.1直接访问 9.2.2间接访问 十、操作符的属性 10.1.优先性 10.2.结合性 …

sql基本语法+实验实践

sql语法 注释&#xff1a; 单行 --注释内容# 注释内容多行 /* 注释内容 */数据定义语言DDL 查询所有数据库 show databases;注意是databases而不是database。 查询当前数据库 select database();创建数据库 create database [if not exists] 数据库名 [default charset 字符…

备战蓝桥杯Day22 - 计数排序

计数排序问题描述 对列表进行排序&#xff0c;已知列表中的数范围都在0-100之间。设计时间复杂度为O(n)的算法。 比如列表中有一串数字&#xff0c;2 5 3 1 6 3 2 1 &#xff0c;需要将他们按照从小到大的次序排列&#xff0c;得到1 1 2 2 3 3 5 6 的结果。那么此时计数排序是…

一:面试流程

面试 项目介绍功能测试接口测试性能测试测试用例 项目介绍 南网智搜是南方电网公司研发的搜索引擎&#xff0c;主要场景Web 端场景有搜索频道、个人中心、和一些积分活动等&#xff0c;我在里面主要负责功能测试&#xff0c;接口测试&#xff0c;性能测试&#xff0c;压力测试…

Jetson Xavier NX 开发板Ubuntu18.04 安装arduino IDE详细步骤

Jetson 平台是arch架构&#xff0c;官网上面几乎都是x86或者arm64的这两种错误版本都存在匹配问题无法使用&#xff0c;不要下载不要下载&#xff01; uname -a #版本查询1.正确下载打开方式 https://downloads.arduino.cc/arduino-1.8.19-linuxaarch64.tar.xz选择自己想要下…

LeetCode #104 二叉树的最大深度

104. 二叉树的最大深度 题目 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出&#xff1a;2 分析 …

【Godot4自学手册】第十九节敌人的血量显示及掉血特效

这一节&#xff0c;我主要学习敌人的血量显示、掉血显示和死亡效果。敌人的血量显示和主人公的血量显示有所不同&#xff0c;主要是在敌人头顶有个红色的血条&#xff0c;受到攻击敌人的血条会减少&#xff0c;并且有掉血数量的文字显示&#xff0c;效果如下&#xff1a; 一、…

《中华人民共和国消防法》(2021年修订版)解读

单选题&#xff08;共7题&#xff0c;每题5分&#xff09; 1、举办大型群众性活动&#xff0c;承办人应当依法向&#xff08;&#xff09;申请安全许可。 正确答案&#xff1a;B、公安机关 2、违反消防安全规定进入生产、储存易燃易爆危险品场所的&#xff0c;情节严重的要处…

基于springboot+vue的医院后台管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

胎神游戏集第一期

目录 一、变色小跳龙 二、超级按钮 三、超级迷宫 四 、城市守卫战 五、 愤怒的小胎 既然是胎神游戏集&#xff0c;那当然要先感谢我们的胎神大大了 胎神洛谷名&#xff1a;TSzza 好了&#xff0c;言归正传&#xff0c;知道你们不喜欢啰嗦&#xff0c;直接上代码 一、…

SMBGhost漏洞技术分析与防御方案

事件分析 最近国内外各安全厂商都发布了SMBGhost(CVE-2020-0796)漏洞的预警报告和分析报告&#xff0c;笔者利用周末休息时间也研究了一下&#xff0c;就算是做一个笔记了&#xff0c;分享给大家一起学习下&#xff0c;目前外面研究的POC大部分是通过SMB压缩数据包长度整数溢出…

【openGL4.x手册04】基元

一、说明 OpenGL 中的术语“基元”用于指代两个相似但独立的概念。 “原语”的第一个含义是指 OpenGL 使用的解释方案来确定渲染时顶点流所代表的内容&#xff0c;例如“GL_POINTS”。这样的顶点序列可以是任意长的。 “原语”的另一个含义&#xff0c;也称为“基本原语”&…

如何根据玩家数量和游戏需求选择最合适的服务器配置?

根据玩家数量和游戏需求选择最合适的服务器配置&#xff0c;首先需要考虑游戏的类型、玩家数量、预计的在线时间以及对内存和CPU性能的需求综合考虑。对于大型多人在线游戏&#xff0c;如MMORPG或MOBA等&#xff0c;由于需要更多的CPU核心数来支持更复杂的游戏逻辑和处理大量数…

操作系统|概述|系统分类——笔记

1.1_1操作系统的概念和功能 操作系统的概念 操作系统&#xff08;Operating System&#xff0c; OS&#xff09; 是指控制和管理整个计算机系统的 硬件和软件 资源&#xff0c;并合理地组织调度计算机和工作和资源的分配&#xff1b; 1操作系统是系统资源的管理者 以提供给用…