Redis学习(十)RedisTemplate 对各种数据类型的支持

目录

    • 一、SpringDataRedis 简介
      • 1.1 什么是 Redis?
      • 1.2 什么是 Jedis?
      • 1.3 什么是 Spring Data Redis?
    • 二、RedisTemplate 中 API 使用
      • 2.1 pom.xml 依赖
      • 2.2 配置文件
      • 2.3 RedisTemplate 的直接方法
      • 2.4 String 类型相关操作
      • 2.5 Hash 类型相关操作
      • 2.6 Set 类型相关操作
      • 2.7 List 类型相关操作
      • 2.8 ZSet 类型相关操作

一、SpringDataRedis 简介

1.1 什么是 Redis?

Redis 是一款开源的 Key-Value 数据库,运行在内存中,由 C 语言编写。企业卡法通常采用 Redis 来实现缓存。同类的产品还有 Memecache、Memcached 等。

1.2 什么是 Jedis?

Jedis 是 Redis 官方推出的一款面向 Java 的客户端,提供了很多接口供 Java 语言调用。可以在 Redis 官网下载,当然还有一些开源爱好者提供的客户端,如:Jredis、SRP 等等,推荐使用 Jedis。

1.3 什么是 Spring Data Redis?

spring-data-redis 是 Spring 大家族的一部分,提供了在 Spring 应用中通过简单的配置访问 Redis 服务,对 Redis 底层开发包(Jedis、JRedis、RJC)进行了高度封装,RedisTemplate 提供了 Redis 各种数据操作、异常处理及序列化、支持发布订阅,并对 Spring 3.1 Cache 进行了实现。

spring-data-redis 提供功能如下:

  1. 连接池自动管理,提供了一个高度封装的 “RedisTemplate” 类。
  2. 针对 Jedis 客户端中大量 API 进行了归类封装,将同一类型操作封装为 Operation 接口:
    • ValueOperations: 简单 K-V 操作;
    • SetOperation: Set 类型数据操作;
    • ZSetOperations: ZSet 类型数据操作;
    • HashOperations: Map 类型的数据操作;
    • ListOperations: List 类型的数据操作。
  3. 提供了对 Key 的 “Bound” 便捷化操作 API,可以通过 Bound 封装指定的 Key,然后进行一系列的操作而无须 “显式” 的再次指定 Key,即 BoundKeyOperation:
    • BoundValueOperations
    • BoundListOperations
    • BoundHashOperations
    • BoundSetOperations
    • BoundZSetOperations

在这里插入图片描述

  1. 将事务操作封装,有容器控制。
  2. 针对数据的 “序列化/反序列化”,提供了多种可选择策略(RedisSerializer)。
    • JdkSerializationRedisSerializer:POJO 对象的存取场景。使用 JDK 本身序列化机制,将 POJO 类通过 ObjectInputStream/ObjectOutputStream 进行序列化操作,最终 redis-server 中将存储字节序列化。这是目前最常用的序列化策略。
    • StringRedisSerializer:Key 或者 Value 为字符串的场景。根据指定的 charset 对数据的字节序列编码成 String,是 “new String(bytes, charset)” 和 “string.getBytes(charset)” 的直接封装。是最轻量级和高效的策略。
    • JacksonJsonRedisSerializer:jackson-json 工具提供了 JavaBean 与 JSON 之间的转换能力,可以将 POJO 实例序列化成 JSON 格式存储在 Redis 中,也可以将 JSON 格式的数据转换成 POJO 实例。因为 jackson 工具在序列化和反序列化时,需要明确指定 Class 类型,所以此策略封装起来稍微复杂。【需要 jackson-mapper-asl 工具支持】

二、RedisTemplate 中 API 使用

2.1 pom.xml 依赖

<!-- Redis -->
<dependency>
	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.2 配置文件

# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(适用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值标识没有限制)
spring.redis-jedis.pool.max-wait=-1ms
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=5000ms

2.3 RedisTemplate 的直接方法

@Autowired
private RedisTemplate redisTemplate;

// 删除单个key
redisTemplate.delete("keyTest");

// 删除多个key
redisTemplate.deleteKey("keyTest1", "keyTest2");

// 指定key的失效时间
redisTemplate.expire("keyTest", 1, TimeUnit.SECONDS);

// 根据key获取过期时间
long expire  = redisTemplate.getExpire("keyTest");

// 判断key是否存在
boolean hasKey = redisTemplate.hasKey("keyTest");

2.4 String 类型相关操作

@Autowired
private RedisTemplate redisTemplate;

// 添加缓存(通过 BoundValueOperations 设置值)
redisTemplate.boundValueOps("KeyTest").set("ValueTest");
redisTemplate.boundValueOps("KeyTest").set("ValueTest", 1, TimeUnit.SECONDS);
// 添加缓存(通过 ValueOperations 设置值)
redisTemplate.opsForValue().set("KeyTest", "ValueTest");
redisTemplate.opsForValue().set("KeyTest", "ValueTest", 1, TimeUnit.SECONDS);

// 设置过期时间(单独设置)
redisTemplate.boundValueOps("KeyTest").expire(1, TimeUnit.SECONDS);
redisTemplate.expire("KeyTest", 1, TimeUnit.SECONDS);

// 获取缓存(通过 BoundValueOperations/ValueOperations 获取值)
String valueTest = redisTemplate.boundValueOps("KeyTest").get();
String valueTest = redisTemplate.opsForValue().get("KeyTest");

// 删除缓存
Boolean result = redisTemplate.delete("KeyTest");

// 顺序递增
redisTemplate.boundValueOps("KeyTest").increment(1L);

// 顺序递减
redisTemplate.boundValueOps("KeyTest").increment(-1L);

2.5 Hash 类型相关操作

// 添加缓存(通过 BoundHashOperations/HashOperations 设置值)
redisTemplate.boundHashOps("KeyTest").put("name", "ACGkaka");
redisTemplate.opsForHash().put("KeyTest", "name", "ACGkaka");

// 设置过期时间(单独设置)
redisTemplate.boundValueOps("KeyTest").expire(1, TimeUnit.SECONDS);
redisTemplate.expire("KeyTest", 1, TimeUnit.SECONDS);

// 添加一个Map集合
HashMap<String, String> map = new HashMap<>();
redisTemplate.boundHashOps("KeyTest").putAll(map);

// 获取对象的所有属性key
Set keys = redisTemplate.boundHashOps("KeyTest").keys();
Set keys = redisTemplate.opsForHash().keys("KeyTest");

// 获取对象的所有属性value
List values = redisTemplate.boundHashOps("KeyTest").values();
List values = redisTemplate.opsForHash().values("KeyTest");

// 根据对象的属性key,获取属性value
String value = (String) redisTemplate.boundHashOps("KeyTest").get("name");
String value = (String) redisTemplate.opsForHash().get("KeyTest", "name");

// 获取对象的所有属性键值对集合
Map entries = redisTmpelate.boundHashOps("KeyTest").entries();
Map entries = redisTemplate.opsForHash().entries("KeyTest");

// 删除对象
redisTemplate.delete("KeyTest");

// 删除对象属性
redisTemplate.boundHashOps("KeyTest").delete("name");

// 判断对象是否存在
Boolean isEmpty = redisTemplate.boundHashOps("KeyTest").hasKey("name");

2.6 Set 类型相关操作

// 添加缓存(通过 BoundHashOperations/HashOperations 设置值)
redisTemplate.boundSetOps("KeyTest").add("ValueTest1", "ValueTest2");
redisTemplate.opsForSet().add("KeyTest", "ValueTest1", "ValueTest2");

// 设置过期时间(单独设置)
redisTemplate.boundValueOps("KeyTest").expire(1, TimeUnit.SECONDS);
redisTemplate.expire("KeyTest", 1, TimeUnit.SECONDS);

// 根据key,获取Set中的所有值
Set set = redisTemplate.boundSetOps("KeyTest").members();
Set set = redisTemplate.opsForSet().members("KeyTest");

// 根据value,从Set中查询是否存在
Boolean isEmpty = redisTemplate.boundSetOps("KeyTest").isMember("ValueTest");

// 获取Set缓存长度
Long size = redisTemplate.boundSetOps("KeyTest").size();

// 移除指定的单元
Long result = redisTemplate.boundSetOps("KeyTest").remove("ValueTest");

// 移除指定的key
Boolean result = redisTemplate.delete("KeyTest");

2.7 List 类型相关操作

// 添加缓存(通过 BoundHashOperations 设置值)
redisTemplate.boundListOps("KeyTest").leftPush("ValueTest");
redisTemplate.boundListOps("KeyTest").rightPush("ValueTest");
// 添加缓存(通过 HashOperations 设置值)
redisTemplate.opsForList().leftPush("KeyTest", "ValueTest");
redisTemplate.opsForList().rightPush("KeyTest", "ValueTest");

// 设置过期时间
redisTemplate.boundValueOps("KeyTest").expire(1, TimeUnit.SECONDS);
redisTemplate.expire("KeyTest", 1, TimeUnit.SECONDS);

// 添加一个List集合
List<String> list = new ArrayList<>();
redisTemplate.boundListOps("KeyTest").leftPushAll(list);
redisTemplate.boundListOps("KeyTest").rightPushAll(list);

// 根据索引,获取一段缓存
List list = redisTemplate.boundListOps("KeyTest").range(0, 10);

// 从左弹出一个元素
String key = (String) redisTemplate.boundListOps("KeyTest").leftPop();

// 从右弹出一个元素
String key = (String) redisTemplate.boundListOps("KeyTest").rightPop();

// 根据索引,查询元素
String key = (String) redisTemplate.boundListOps("KeyTest").index(1);

// 获取List缓存的长度
Long size = redisTemplate.boundListOps("KeyTest").size();

// 根据索引,修改List中的某条数据
redisTemplate.boundListOps("KeyTest").set(3L, "ValueTest");

// 移除N个value值
redisTemplate.boundListOps("KeyTest").remove(3L, "ValueTest");

2.8 ZSet 类型相关操作

zset中value不允许重复,默认升序排序。

// 添加缓存(通过 BoundHashOperations 设置值)
redisTemplate.boundZSetOps("KeyTest").add("ValueTest", 10D);
// 添加缓存(通过 HashOperations 设置值)
redisTemplate.opsForZSet().add("KeyTest", "ValueTest", 10D);

// 添加多个缓存
DefaultTypedTuple<String> p1 = new DefaultTypedTuple<>("ValueTest", 1.1D);
DefaultTypedTuple<String> p2 = new DefaultTypedTuple<>("ValueTest", 1.2D);
redisTemplate.boundZSetOps("KeyTest").add(new HashSet<>(Arrays.asList(p1, p2)));

// 按照排名先后(从小到大)打印指定区间内的元素,-1为打印全部
Set<String> range = redisTemplate.boundZSetOps("KeyTest").range(0, -1);

// 获取指定元素的分数
Double score = redisTemplate.boundZSetOps("KeyTest").score("VelueTest");

// 获取元素个数
Long size = redisTemplate.boundZSetOps("KeyTest").size();

// 获取分数范围内的元素个数
Long count = redisTemplate.boundZSetOps("KeyTest").count(0D, 2.2D);

// 获取分数范围内的元素
Set set = redisTemplate.boundZSetOps("KeyTest").rangeByScore(0D, 2.2D);

// 获取分数范围内的元素,带偏移量和个数(key, 起始分数, 最大分数, 偏移量, 个数)
Set set = redisTemplate.opsForZSetOps().rangeByScore("KeyTest", 0D, 2.2D, 1, 3);

// 获取分数范围内元素的排名及分数
Set<TypedTuple<String>> tuples = redisTemplate.boundZSetOps("KeyTest").rangeWithScores(0L, 3L);
for (TypedTuple<String> tuple : tuples) {
    System.out.println(tuple.getValue() + ":" + tuple.getScore());
}

// 获取排名(从小到大)
Long rank = redisTemplate.boundZSetOps("KeyTest").rank("ValueSet");

// 获取排名(从大到小)
Long reverseRank = redisTemplate.boundZSetOps("KeyTest").reverseRank("ValueSet");

// 根据value删除元素
redisTemplate.boundZSetOps("KeyTest").remove("ValueSet");

// 根据索引范围删除元素
redisTemplate.boundZSetOps("KeyTest").removeRange(0L, 3L);

// 根据分数范围删除元素
redisTemplate.boundZSetOps("KeyTest").removeRangeByScore(0D, 2.2D);

// 根据value为元素加分
Double score = redisTemplate.boundZSetOps("KeyTest").incrementScore("ValueTest", 1.1D);

整理完毕,完结撒花~ 🌻





参考地址:

1.RedisTemplate操作Redis,这一篇文章就够了(一),https://blog.csdn.net/lydms/article/details/105224210

2.Springboot使用RedisTemplate优雅地操作redis,https://zhuanlan.zhihu.com/p/69103214

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

APP安全测试详解

在工作过程中&#xff0c;我接触到了一些SDL安全提测的工作。原来我是学web端渗透比较多的&#xff0c;移动端这块基本没怎么试过手&#xff0c;结果刚开始一直踩坑&#xff0c;连抓包都抓不到(&#xff34;▽&#xff34;)。 下面记录下我遇到的部分问题和解决方法&#xff0…

《QT从基础到进阶·十八》QT中的各种鼠标事件QEvent

1、界面标题栏事件&#xff1a; NonClientAreaMouseButtonPress 标题栏点击事件 NonClientAreaMouseButtonRelease 标题栏释放事件 bool CustomPopDialog::event(QEvent* event) {switch (event->type()){case QEvent::MouseButtonRelease://Event of mouse releasing wind…

Python爬虫抓取微博数据及热度预测

首先我们需要安装 requests 和 BeautifulSoup 库&#xff0c;可以使用以下命令进行安装&#xff1a; pip install requests pip install beautifulsoup4然后&#xff0c;我们需要导入 requests 和 BeautifulSoup 库&#xff1a; import requests from bs4 import BeautifulSou…

奇异矩阵、非奇异矩阵

对于一个方阵A&#xff1a; 如果A的行列式等于0&#xff0c;称矩阵A为奇异矩阵如果A的行列式不等于0&#xff0c;称A 非奇异矩阵 也就是说&#xff0c;对于方阵A&#xff0c;如果它是满秩的&#xff0c;即它的秩等于矩阵的阶数&#xff0c;就是非奇异矩阵&#xff1b;如果秩小…

【 云原生 | K8S 】kubectl 详解

目录 1 kubectl 2 基本信息查看 2.1 查看 master 节点状态 2.2 查看命名空间 2.3 查看default命名空间的所有资源 2.4 创建命名空间app 2.5 删除命名空间app 2.6 在命名空间kube-public 创建副本控制器&#xff08;deployment&#xff09;来启动Pod&#xff08;nginx-wl…

Intel x86_64 LBR功能

文章目录 前言一、CPUID指令1.1 CPUID功能简介1.2 输入参数01H返回结果1.2.1 ECX返回结果1.2.2 EDX返回结果 1.3 Linux中CPUID指令1.3.1 应用层调用cpid指令1.3.2 linux内核中调用cpuid指令 二、MSR寄存器2.1 MSR 寄存器简介2.2 RDMSR,WRMSR指令介绍2.3 IA32_DEBUGCTL MSR 寄存…

OSG交互:选中场景模型并高亮显示

1、目的 可以在osg视图中选中指定模型实体,并高亮显示。共分为两种,一种鼠标点选,一种框选。 2、鼠标点选 2.1 功能说明 生成两组对象,一组cow对象可以被选中,另一组robot不能被选中;点击cow对象被选中高亮,点击robot被选中不高亮;点击空白处,弹出“select nothing!…

匹配不同应用场景,玩转HyperBDR的两种同步模式!

HyperBDR云容灾是万博智云打造的云原生业务级别容灾工具&#xff0c;实现20云的自动化对接&#xff0c;适配云上、云下、云间多种场景容灾&#xff0c;尤其在容灾上云的场景上&#xff0c;由于大幅节约了容灾过程中的计算资源&#xff0c;以更普惠的方案打造云容灾新场景&#…

React构建组件的方式有哪些?区别?

一、是什么 组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念&#xff08;组件&#xff09;来实现开发的模式 在React中&#xff0c;一个类、一个函数都可以视为一个组件 在之前文章中&#xff0c;我们了解到组件所存在的优势&#xff1a; 降低整个系统的耦合度&am…

文件重命名自动化:批量处理让生活更简单

在我们的日常生活和工作中&#xff0c;需要处理大量的文件&#xff0c;无论是文档、图片、音频还是视频。很多时候&#xff0c;为了更好地管理和查找&#xff0c;我们都需要对文件进行重命名。然而&#xff0c;一个一个地重命名文件既耗时又容易出错。幸运的是&#xff0c;随着…

多路转接(中)——poll和epoll

目录 一、poll 1.select的缺点 2.认识poll系统调用 3.poll的优点 二、poll服务器 三、epoll 1.poll的缺点 2.认识epoll的三个接口 3.epoll的原理 四、epoll服务器 一、poll 1.select的缺点 select虽然可以增加IO的效率&#xff0c;但是它有两个问题&#xff1a; &…

高级算法复习

时间代价 主定理 递归树 排序 贪心算法 贪心选择性&#xff08;Greedy-choice property&#xff09;&#xff1a; 通过做出局部最优&#xff08;贪婪&#xff09;选择&#xff0c;可以得出全局最优解——这是贪心算法可行的第一个基本要素&#xff0c;也是贪心算法与动态规划…

使用 Redis 实现生成分布式全局唯一ID(使用SpringBoot环境实现)

目录 一、前言二、如何通过Redis设计一个分布式全局唯一ID生成工具2.1、使用 Redis 计数器实现2.2、使用 Redis Hash结构实现 三、通过代码实现分布式全局唯一ID工具3.1、编写获取工具3.2、测试获取工具 四、总结 一、前言 在很多项目中生成类似订单编号、用户编号等有唯一性数…

创建云端服务器

1.申请云端服务器 每个账户有三个月的免费试用 我的服务器选择是centos7 &#xff0c;别选成win了。 2.创建实例 创建实例的步骤&#xff0c;阿里云有文档 介绍 大致就是 左边点实例 -》 顶部选你申请服务器时的地区-》下面就出现一条实例-》点更多 -》要重置实例密码 -》同一…

Docker安装ewomail

ewomail相关链接 官网官方安装文档gitee 开始安装 快速安装 wget -c https://down.ewomail.com/install-03.sh && sh install-03.sh 域名docker安装 创建docker容器 docker run -idt \-p 25:25 \-p 110:110 \-p 143:143 \-p 465:465 \-p 587:587 \-p 993:993 \-…

【带头学C++】----- 三、指针章 ---- 3.10 函数指针(补充基础知识)

1.函数指针 1.1 函数的返回值类型为指针类型 将函数内部的合法地址通过返回值 返回给函数外部使用 注意:函数不要返回普通局部变量的地址 分析&#xff1a; 在这段代码中&#xff0c;函数getAddr()返回一个指向局部变量data地址&#xff08;作用域是函数内部&#xff09;的指…

DevOps简介

DevOps简介 1、DevOps的起源2、什么是DevOps3、DevOps的发展现状4、DevOps与虚拟化、容器 1、DevOps的起源 上个世纪40年代&#xff0c;世界上第一台计算机诞生。计算机离不开程序&#xff08;Program&#xff09;驱动&#xff0c;而负责编写程序的人&#xff0c;被称为程序员&…

Django ModelSerializer 实现自定义验证详解

随着 Web 开发的日益复杂化&#xff0c;对数据验证的需求也日益增加。Django REST framework 提供了一套强大的、灵活的验证系统&#xff0c;帮助开发者轻松处理各种复杂情况。本文将重点探讨 Django ModelSerializer 中如何实现自定义验证。 1. 简介 Django ModelSerializer…

深度学习 opencv python 实现中国交通标志识别 计算机竞赛_1

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…

2023面试笔记四

1、gc导致的cpu冲高 排查是否为gc导致&#xff0c;看如下两点&#xff1a; gc频率和耗时 内存占用率 &#xff08;1&#xff09;gc频率和耗时有两种手段看&#xff1a; 第一种&#xff1a;根据gc日志的打印时间&#xff0c;可确定每次gc间隔的时间和耗时&#xff1a; 使用…