Redis操作--RedisTemplate(一)介绍

news2024/11/24 6:57:27

一、介绍

1、简介

RedisTemplate 是 Spring Data Redis 提供的一个高级抽象,由 Spring 官方提供的方便操作 Redis 数据库的一个工具类,支持模板设计模式,使得操作 Redis 更加符合 Spring 的编程模型。还支持序列化机制,可以处理 Java 对象的存取。其本质属于 Spring-Data 模块下的 Spring-Data-Redis 部分,它提供了从 Spring 应用程序轻松配置和访问 Redis的功能。

2、原理

Spring-Data-Redis 是通过整合Lettuce和Jedis这俩种Redis客户端产生的,对外则提供了RedisTemplate这样统一的API来供调用者访问。它既支持Luttuce的响应式编程也支持JDK中集合的实现。

3、和Jedis的区别

Jedis 是一个用于直接与 Redis 服务器通信的 Java 客户端库,它提供了 Redis 所有基本功能的直接 API,需要手动管理连接(如创建 Jedis 实例和处理连接关闭等),并且需要在项目中引入 Jedis 的相关 Maven 依赖,Jedis 适合需要精细控制 Redis 操作的场景,直接提供 Redis 命令的操作方式;

RedisTemplate 更加适合与 Spring 框架集成的应用,提供了更高层次的抽象和便利的方法来简化 Redis 操作。

具体选用客户端还是模板,根据项目实际需要即可。

二、使用

1、引入依赖
        <!--Redis依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!--连接池依赖-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.11.1</version>
        </dependency>
2、配置连接

由于 RedisTemplate 是整合的Lettuce和Jedis,因此在配置连接池的时候需要进行选择是使用Lettuce还是Jedis(默认是Lettuce)

#Redis cache setting
spring.data.redis.host=127.0.0.1
spring.data.redis.port=6379
spring.data.redis.password=
#最大连接数
spring.data.redis.lettuce.pool.max-active=8
#等待时长
spring.data.redis.lettuce.pool.max-wait=-1
#最大空闲连接
spring.data.redis.lettuce.pool.max-idle=8
#最小空闲连接
spring.data.redis.lettuce.pool.min-idle=0
spring.data.redis.lettuce.pool.enabled=true
spring.data.redis.lettuce.pool.time-between-eviction-runs=30s
3、使用

通过依赖注入就可以直接使用

    @Autowired
    private RedisTemplate redisTemplate;
    
    @Test
    public void  testString(){
        String key = "name";
        //存
        String value = "这是value123";
        redisTemplate.opsForValue().set(key,value);
        //取
        Object valueObj = redisTemplate.opsForValue().get(key);
        System.out.println("value为:" + valueObj);
    }

执行打印:value为:这是value123 

4、序列化

注意点:上面存入的数据打开Redis图形化工具查看发现是一堆乱码

这是因为Redis的序列化并没有按照我们预期的进行转化,我们需要自己去重写一个序列化,如下将key设置为String类型、value设置为json类型,最后将这个对象交给Spring管理,之后在调用该对象的时候就会自动选择我们配置的这个:

@Configuration
public class RedisConfig {
    
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        //创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //设置连接工厂
        template.setConnectionFactory(connectionFactory);
        //创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();
        //设置key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashValueSerializer(RedisSerializer.string());
        //设置value的序列化
        template.setValueSerializer(jsonSerializer);
        template.setHashValueSerializer(jsonSerializer);
        return template;
    }
}

 对于JSON序列化工具也需要引入依赖:

        <!--jackson依赖-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.17.1</version>
        </dependency>

此时存储正常:

redis的序列化方式有:

@Configuration
@EnableConfigurationProperties(RedisProperties.class)
public class RedisConfig {

    @Resource private LettuceConnectionFactory factory;

    @Bean(name = "redisTemplateForRateLimit")
    public RedisTemplate<String, Object> redisTemplate() {
        Assert.notNull(factory, "can not initialise [RedisConnectionFactory]");
        Jackson2JsonRedisSerializer<Object> jacksonSerializer =
                new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = getObjectMapper();
        jacksonSerializer.setObjectMapper(objectMapper);

        RedisTemplate<String, Object> template = new RedisTemplate<>();
        StringRedisSerializer serializer = new StringRedisSerializer();
        template.setKeySerializer(serializer);
        template.setHashKeySerializer(serializer);

        template.setValueSerializer(jacksonSerializer);
        template.setHashValueSerializer(jacksonSerializer);
        template.setDefaultSerializer(jacksonSerializer);

        template.setConnectionFactory(factory);
        template.afterPropertiesSet();
        return template;
    }
}

 三、API

RedisTemplate 提供了丰富的方法来实现对 Redis 的各种操作,包括但不限于字符串、哈希、列表、集合和有序集合等数据结构的操作。以下是一些常用的 RedisTemplate API:

1、字符串操作
  • opsForValue().set(key, value): 设置字符串值。
  • opsForValue().get(key): 获取字符串值。
  • opsForValue().incr(key): 字符串值自增。
  • opsForValue().decr(key): 字符串值自减。
2、哈希操作

opsForHash().getOperations().put(key, hashKey, value): 向哈希中添加键值对。
opsForHash().getOperations().get(key, hashKey): 获取哈希中的值。
opsForHash().getOperations().entries(key): 获取哈希中的所有键值对。

3、列表操作

opsForList().leftPush(key, value): 从列表左侧添加元素。
opsForList().rightPush(key, value): 从列表右侧添加元素。
opsForList().leftPop(key): 从列表左侧弹出元素。
opsForList().rightPop(key): 从列表右侧弹出元素。

4、集合操作
  • opsForSet().add(key, value): 向集合中添加元素。
  • opsForSet().members(key): 获取集合中的所有元素。
  • opsForSet().remove(key, value): 从集合中移除元素。
5、有序集合操作

opsForZSet().add(key, value, score): 向有序集合中添加元素,并指定分数。
opsForZSet().range(key, start, end): 获取有序集合中指定分数范围内的元素。
opsForZSet().removeRangeByScore(key, minScore, maxScore): 按分数范围移除有序集合中的元素。

6、键操作
  • delete(key): 删除键。
  • hasKey(key): 检查键是否存在。
  • keys(pattern): 根据模式匹配获取所有键。
7、事务
  • multi(): 开启事务。
  • exec(): 提交事务。
8、发布/订阅
  • convertAndSend(channel, message): 发布消息。
  • subscribe(RedisMessageListenerContainer, MessageListener): 订阅消息。
9、连接管理
  • getConnectionFactory(): 获取连接工厂。
  • getExecutor(): 获取执行器。
10、序列化

  • setKeySerializer(Serializer): 设置键的序列化器。
  • setValueSerializer(Serializer): 设置值的序列化器。

更多操作可以查看官方提供的API文档:RedisTemplate (Spring Data Redis 3.3.2 API)

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

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

相关文章

基于SpringBoot的航空公司管理系统设计与实现,源码、部署+讲解

摘要 随着互联网时代的日益发展&#xff0c;互联网技术得到了广泛的应用。互联网正在经历一场由传统线下管理模式转变为以互联网主导的线上管理模式的深刻变革。在线管理技术犹如雨后春笋一般冒芽而出&#xff0c;这为我们的生活带来了许多变动。 在近些年国内航空业的蓬勃发…

LVS理论知识

目录 1.描述以及工作原理 1.什么是LVS 2.LVS调度算法 1.静态调度算法 1.轮询RR 2.加权轮询WRR 3.目标地址hash---DH 4.源地址hash---SH 2.动态调度算法 1.LC最少连接 2.wlc加权最少连接 3.sed最少期望延迟 4.nq不排队调度算法 5.lblc基于本地最少连接 6.lnlcr带…

BioMistral 7B: 生物医学领域的开源多语言AI模型

人工智能咨询培训老师叶梓 转载标明出处 尽管目前有许多开源的针对健康领域的大模型可供使用&#xff0c;但现有模型在数据隐私风险、模型性能以及多语言支持方面的局限性&#xff0c;限制了它们在医疗领域的应用。为了克服这些限制&#xff0c;研究者们提出了BioMistral&#…

吴恩达机器学习 笔记四十二 基于内容过滤的深度学习

在电影评分的案例中&#xff0c;基于内容过滤的方法需要用到两个向量&#xff0c;一个是来自用户的特征向量Vu,另一个是电影特征的向量 Vm。以用户的特征为例&#xff0c;原始的向量Xu作为一个神经网络的输入&#xff0c;经过几层之后输出一个有32个单元的向量Vu&#xff0c;电…

中芯国际:回暖

业绩稳重向好&#xff0c;半导体周期逆转&#xff1f;或许可以去掉问号。 今天我们来聊国产晶圆代工龙头——中芯国际 半导体复苏的风已经吹了几个月&#xff0c;各家业绩预告亮眼&#xff0c;但只有数据真正落地才能下定结论。而半导体看晶圆代工&#xff0c;晶圆代工看中芯国…

14.1 NumPy基础

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

uni-app 吸顶方案总结

效果 页面级 uni.pageScrollTo 官方文档&#xff1a;https://uniapp.dcloud.net.cn/api/ui/scroll.html#pagescrollto 原生头部导航 uni.pageScrollTo({selector: #tabs,duration: 300 });(推荐)需要兼容自定义头部导航 <template><view id"demo1" :styl…

Sakana.ai 迈向完全自动化的开放式科学发现

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

设计模式-标识域(Identity Field)

目的 为了在内存对象和数据库行之间维护标识而在对象内保存的一个数据库标识域。 关系数据库和内存对象的区别 区分行&#xff1a;关系数据库使用键来区分数据行&#xff0c;而内存对象不需要这样一个键 引用方法&#xff1a;对象系统中通过原始内存位置直接区分对象&#x…

【3】字节码文件的组成

一.应用场景与学习路线 二.以正确的姿势打开文件 使用记事本和NotePad打开字节码文件很不方便 三.字节码文件的组成

Spring MVC源码详解

什么是Spring MVC &#xff1f; Spring MVC就是SpringMVC。 Spring就不介绍了&#xff0c;什么是MVC&#xff1f; M&#xff1a;模型&#xff0c;javabeanV&#xff1a;视图&#xff0c;如jspC&#xff1a;控制层&#xff0c;如Controller、Servlet SpringMVC请求处理流程 用…

图像处理(空域变换(上))

数字图像处理 参考视频 Task 1 亮度变换 1. 幂律变换 伽马变换本质上是对图像矩阵中的每个值进行幂运算。 幂函数 s c r γ ( r ∈ [ 0 , 1 ] ) \text{幂函数}scr^γ(r\in[0,1]) 幂函数scrγ(r∈[0,1]) 其中&#xff0c;r为灰度图像的输入值&#xff08;原来的灰度值&…

<数据集>集装箱缺陷识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3793张 标注数量(xml文件个数)&#xff1a;3793 标注数量(txt文件个数)&#xff1a;3793 标注类别数&#xff1a;4 标注类别名称&#xff1a;[DAMAGE - DEFRAME, DENT, DAMAGE - RUST, DAMAGE - HOLE] 序号类别名…

高分六号卫星助力农业监测_卫星介绍_论文分享_数据获取

卫星遥感已经成为农业发展的重要支持工具。《“数据要素X”三年行动计划(2024-2026年)》指出,在现代农业交通运输、应急管理等领域鼓励探索利用遥感数据。为什么高分六号会经常应用于农业检测呢&#xff1f;本文将介绍高分六号卫星的农业检测特性、在农业应用中的优势、具体农业…

Video视频抽帧和WebCodecs API视频抽帧介绍

目录 mp4Box抽帧 ffmpeg抽帧 video元素抽帧 WebCodecs 核心API 视频文件是一个容器&#xff0c;里面有很多不同的轨道信息。如&#xff1a;图像、声音、字幕等。而视频图像信息又是由一系列图片序列帧的集合。如10秒时长的视频&#xff0c;假设每秒30帧。那大概有300条图像…

二叉树——9.找树左下角的值

力扣题目链接 给定一个二叉树&#xff0c;在树的最后一行找到最左边的值。 示例&#xff1a; 输出&#xff1a;7 题干很简单&#xff0c;找到树的最后一行&#xff0c;在该行找到最左边的值&#xff0c;结合完整代码进行分析。 完整代码如下&#xff1a; class Solution:d…

Django后台数据获取展示

​ 续接Django REST Framework&#xff0c;使用Vite构建Vue3的前端项目 1.跨域获取后台接口并展示 安装Axios npm install axios --save 前端查看后端所有定义的接口 // 访问后端定义的可视化Api接口文档 http://ip:8000/docs/ // 定义的学生类信息 http://ip:8000/api/v1…

Springboot发邮件如何配置SMTP服务器信息?

Springboot发邮件安全性考虑&#xff1f;如何用Springboot发信&#xff1f; 在 SpringBoot中配置邮件发送功能相对简单&#xff0c;但需要正确设置 SMTP 服务器信息。AokSend将详细介绍如何在 SpringBoot应用程序中配置 SMTP 服务器信息&#xff0c;以实现邮件发送功能。 Spr…

如何构建一个高效的编程学习笔记系统(万字总结)

你是否曾经在编程学习的海洋中迷失方向&#xff1f;是否感觉自己学了很多&#xff0c;却总是记不住关键知识点&#xff1f;别担心&#xff0c;今天我们将一起探索一种革命性的笔记方法&#xff0c;它将彻底改变你的学习体验&#xff01; 目录 引言&#xff1a;为什么我们需要…

鸿蒙(API 12 Beta3版)【本地媒体会话概述】 音视频播控服务

交互过程 本地媒体会话的数据源均在设备本地&#xff0c;交互过程如图所示。 此过程中涉及两大角色&#xff0c;媒体会话提供方和媒体会话控制方。 说明 媒体会话控制方为系统应用&#xff0c;三方应用可以成为媒体会话提供方。 本地媒体会话中&#xff0c;媒体会话提供方通…