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

news2024/11/29 12:27:06

目录

    • 一、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

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

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

相关文章

台灯选用什么类型好?双十一值得入手的护眼台灯推荐

如何给孩子挑选一盏能够护眼的台灯一直是许多家长都为之头痛的一大难题&#xff0c;主要是如今市面上的台灯实在太多了&#xff0c;而且迭代速度非常快&#xff0c;再加上这些产品中还混杂了许多不专业品牌、网红产品和低价劣质产品等等&#xff0c;想要挑选到一款好的台灯确实…

MVC模式和三层架构:

MVC模式&#xff1a; M&#xff1a;Model&#xff0c;业务模型&#xff0c;处理业务 V&#xff1a;View&#xff0c;视图&#xff0c;界面展示 C&#xff1a;Controller&#xff0c;控制器&#xff0c;处理请求&#xff0c;调用模型和视图 MVC优点&#xff1a; 职责单一&am…

C++ Lambda表达式 在竞赛中提高你的代码连贯性

本文中的lambda表达式使用方式应该在目前的所有比赛中&#xff08;C11及以上&#xff09;都是可以使用的&#xff0c;因为比较落后的蓝桥杯都更新到了C14。 当题目做的越来越多&#xff0c;难度越来越大&#xff0c;相应的代码就会越来越长&#xff0c;通常在100行左右。 在行…

你的GPU能跑Llama 2等大模型吗?用这个开源项目上手测一测

你的 GPU 内存够用吗&#xff1f;这有一个项目&#xff0c;可以提前帮你查看。 在算力为王的时代&#xff0c;你的 GPU 可以顺畅的运行大模型&#xff08;LLM&#xff09;吗&#xff1f; 对于这一问题&#xff0c;很多人都难以给出确切的回答&#xff0c;不知该如何计算 GPU 内…

云栖大会72小时沉浸式精彩回顾

计算&#xff0c;为了无法计算的价值 2023 杭州云栖大会震撼落幕 自2015年&#xff0c;云计算支撑着移动互联网创新 AI时代&#xff0c;继续支撑所有开发者的创新与梦想 当大会主题再次回归 让我们也打开时空隧道 一起回顾72小时云栖之旅 打造一朵AI时代最开放的云 随着…

SpringBoot单元测试报错“Error creating bean with name ‘serverEndpointExporter‘ ”

问题场景 在SpringBoot中使用单元测试时&#xff0c;出现以下报错&#xff0c;意思是创建名为‘serverEndpointExporter’的bean时出错。 org.springframework.beans.factory.BeanCreationException: Error creating bean with name serverEndpointExporter defined in class…

折叠旗舰新战局:华为先行,OPPO接棒

乌云中的曙光&#xff0c;总能带给人希望。 全球智能手机出货量已经连续八个季度下滑&#xff0c;行业里的乌云挥之不散。不过&#xff0c;也能看到高端市场逆势上涨&#xff0c;散发光亮。个中逻辑在于&#xff0c;当前换机周期已经达到了34个月&#xff0c;只有创新产品才能…

使用R语言构建HTTP爬虫:IP管理与策略

目录 摘要 一、HTTP爬虫与IP管理概述 二、使用R语言进行IP管理 三、爬虫的伦理与合规性 四、注意事项 结论 摘要 本文深入探讨了使用R语言构建HTTP爬虫时如何有效管理IP地址。由于网络爬虫高频、大量的请求可能导致IP被封禁&#xff0c;因此合理的IP管理策略显得尤为重要…

简单的nvm语法

文章目录 导文常用的nvm语法 导文 nvm&#xff08;Node Version Manager&#xff09;是一个用于管理Node.js版本的工具&#xff0c;它提供了一些简单的命令来操作Node.js的安装、切换和管理。 常用的nvm语法 这些命令可以在终端中执行&#xff0c;以方便地进行Node.js版本的管…

汇编-DUP操作符

DUP操作符使用整数表达式作为计数器&#xff0c; 为多个数据项分配存储空间。 在为字符串或数组分配存储空间时&#xff0c;这个操作符尤其有用&#xff0c;并且可以使用初始化或非初始化数据&#xff1a; .data BYTE 20 DUP(0) ;20个字节&#xff0c;都等于0 BYTE 20 …

C++入门学习(2)缺省参数

前言 继上回我们学习了命名空间和在C里面的输入输出之后&#xff0c;我们知道了命名空间可以解决C语言命名冲突的问题&#xff0c;也简单掌握了命名空间的使用&#xff0c;我们已经可以写出简单的C代码&#xff0c;所以大家还是要继续练习敲代码&#xff0c;提高语感。 #includ…

再谈Android重要组件——Handler(Native篇)

前言 最近工作比较忙&#xff0c;没怎么记录东西了。Android的Handler重要性不必赘述&#xff0c;之前也写过几篇关于hanlder的文章了&#xff1a; Handler有多深&#xff1f;连环二十七问Android多线程&#xff1a;深入分析 Handler机制源码&#xff08;二&#xff09; And…

构建金融新核心生态!金融级数字底座“源启”与易捷行云可进化数字原生平台完成互认证

近日&#xff0c;金融级数字底座“源启”顺利与易捷行云可进化数字原生云平台V6完成互认证。易捷行云云平台V6可支持金融机构核心应用实现高速响应、秒级扩容&#xff0c;并切实保障银行核心系统安全稳定&#xff0c;符合“源启”金融级数字底座&#xff08;2.0版&#xff09;技…

开源Open JDK哪家强?Oracle JDK替代解决方案盘点

开源Open JDK哪家强&#xff1f;Oracle JDK替代解决方案盘点 1.1 引言1.2 Open JDK 版本分支1.3 Open JDK 选择推荐1.3.1 Liberica JDK 是什么&#xff1f;1.3.2 Oracle JDK、 OpenJDK 和Liberica JDK 之间有什么区别&#xff1f;1.3.2 OpenJDK 和 Liberica JDK 一样吗&#xf…

2034:D 类音频功率放大器的引脚排列

2034芯片是一款无滤波器5.2W单声道纯D类音频放大器。低EMI适合应用于便携式设备中。 2034芯片的引脚排列&#xff1a; 2034芯片管脚描述&#xff1a; 2034芯片具有关断功能&#xff0c;延长系统的待机时间。过热保护功能增强系统。POP声抑Z功能改进了系统的听觉感受&#xff0…

企业通配符SSL证书的特点

企业通配符SSL证书是一种数字证书&#xff0c;其可以用于保护多个企业网站&#xff0c;对网站传输信息进行加密服务。这种证书通常适用于拥有多个子域名或二级域名的企事业单位。今天就随SSL盾小编了解企业通配符SSL证书的相关信息。 1. 保护所有域名和子域名&#xff1a;企业通…

Java 设计模式——状态模式

目录 1.概述2.结构3.案例实现3.1.抽象状态类3.2.具体状态类3.3.上下文类3.4.测试 4.优缺点5.使用场景 1.概述 【例】通过按钮来控制一个电梯的状态&#xff0c;电梯有开门状态&#xff0c;关门状态&#xff0c;停止状态&#xff0c;运行状态。每一种状态改变&#xff0c;都有可…

劲升逻辑与安必快、鹏海运于进博会签署合作协议,助力大湾区外贸高质量发展

新中经贸与投资论坛签约现场 中国上海&#xff0c;2023 年 11 月 6 日——第六届进博会期间&#xff0c;由新加坡工商联合总会主办的新中经贸与投资论坛在上海同期举行。跨境贸易数字化领域的领导者劲升逻辑与安必快科技&#xff08;深圳&#xff09;有限公司&#xff08;简称…

xilinx primitives(原语)

Xilinx的原语分为10类&#xff0c;包括&#xff1a;计算组件&#xff0c;IO端口组件&#xff0c;寄存器/锁存器&#xff0c;时钟组件&#xff0c;处理器组件&#xff0c;移位寄存器&#xff0c;配置和检测组件&#xff0c;RAM/ROM组件&#xff0c;Slice/CLB组件&#xff0c;G-t…

第一章:java类的继承

系列文章目录 文章目录 系列文章目录前言一、继承的基本概念二、继承的细节总结 前言 继承是类的重要特征之一。 一、继承的基本概念 ​​​​​​ 关键字extends&#xff0c;表示Sab类继承了Base类&#xff0c;则Sab为Base的子类&#xff0c;Base为Sab的父类。继承在现实中是…