【开发篇】七、RedisTemplate与StringRedisTemplate + Jedis与Lettcus

文章目录

  • 1、RedisTemplate详解
  • 2、常用方法
  • 3、关于IDEA的报黄
  • 4、RedisTemplate和StringRedisTemplate的区别
  • 5、如何通用RedisTemplate和StringRedisTemplate
  • 6、Jedis
  • 7、Jedis的连接池
  • 8、封装Jedis工具类
  • 8、RedisTemplate底层实现技术切换

在这里插入图片描述

1、RedisTemplate详解

RedisTemplate是Spring Data Redis提供的一个用于与Redis交互的高级工具类。它封装了与Redis服务器通信的底层细节,并提供了许多方便的方法来操作Redis的各种数据结构。

  • RedisTemplate基于Jedis或Lettuce等连接池技术,实现了与Redis服务器的连接和资源管理
  • 类中定义了一系列方法,可处理Redis的各种数据结构和执行各种Redis命令
  • RedisTemplate内部使用序列化器将Java对象转换为字节数组,并将其存储到Redis中。同时,还负责将从Redis中获取的字节数组转换回Java对象
//关于K,V
@Autowired
RedisTemplate<K,V> redisTemplate;

当使用RedisTemplate操作Redis时,K的类型通常是String类型,即键的数据类型为字符串。而V的类型可以是任意类型,取决于你存储的实际数据。RedisTemplate支持多种数据结构,例如字符串、哈希、列表、集合、有序集合等,因此V的类型可以是String、Hash、List、Set、ZSet等,RedisTemplate提供操作各种数据存储类型的接口API,不同类型调用不同方法:

在这里插入图片描述

2、常用方法

存取不同类型的value数据,调用方法获取不同类型的操作对象:

#1opsForValue()

返回一个用于操作String类型的ValueOperations对象,可以对Redis中的字符串键值对进行操作

#2opsForHash()

返回一个用于操作Hash类型的HashOperations对象,可以对Redis中的哈希数据结构进行操作

#3opsForList()

返回一个用于操作List类型的ListOperations对象,可以对Redis中的列表数据结构进行操作

#4opsForSet()

返回一个用于操作Set类型的SetOperations对象,可以对Redis中的集合数据结构进行操作

#5opsForZSet()

返回一个用于操作Sorted Set类型的ZSetOperations对象,可以对Redis中的有序集合数据结构进行操作


#6execute(RedisCallback)

用于执行自定义的Redis操作,可以通过实现RedisCallback接口来自定义要执行的操作

当你调用RedisTemplate的opsForValue()方法时,返回的实例可以用于操作字符串值;调用opsForHash()方法时,可以操作哈希类型的值;调用opsForList()方法时,可以操作列表类型的值;

总之就是,要操作什么类型的Redis数据,就调opsForxxx()方法获取什么类型的Operations对象,完了用这个对象调用set、get、hget等方法就行。

3、关于IDEA的报黄

在这里插入图片描述

4、RedisTemplate和StringRedisTemplate的区别

二者都是Spring封装好的操作操作Redis的工具对象,从源码来看为:

public class StringRedisTemplate extends RedisTemplate<String,String> {//.....
}

即:

  • 两者的关系是StringRedisTemplate继承RedisTemplate

  • RedisTemplate以对象作为key和value,内部对数据进行序列化

  • StringRedisTemplate以字符串作为key和value,与Redis客户端操作等效

  • 存取数据时,序列化的方式不同,互相查不到对方写进来的数据,导致了二者只能各自管各自的数据,给人一种它们数据不互通的感觉,但其实是同一个redis库

  • SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略

详细说就是:

  • RedisTemplate使用的是JdkSerializationRedisSerializer存入数据,会将数据先序列化成字节数组,然后在存入Redis数据库
  • 如果数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那选择RedisTemplate最优

所以,我们看到redisTemplate对象存进去的数据在客户端长这样:
在这里插入图片描述

此时就有个问题,我们用RedisTemplate从Redis里get查数据时,也是默认将数据当作字节数组来转成对象或可读字符串。那如果redis里存的key本身就是可读的字符串,再当字节数组来转换就会获取不到数据,由此,StringRedisTemplate出现

StringRedisTemplate使用的是StringRedisSerializer,当你的redis数据库里面本来存的是字符串数据,或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可。

当redis中存入的数据是可读形式而非字节数组时,使用redisTemplate取值的时候会无法获取导出数据,获得的值为null,此时就可以使用 StringRedisTemplate 试试,同理,使用RedisTemplate来set进去的数据,用StringRedisTemplate也无法获取。

5、如何通用RedisTemplate和StringRedisTemplate

二者存取的差异在于key和value的序列化处理类,想实现混用redisTemplate和stringRedisTemplate,就得指定统一的key和Value的序列化处理类,如,让RedisTemplate序列化时,使用StringRedisTemplate的StringRedisSerializer。

//示例,这块在旧项目里应该是祖传的,新项目的话借鉴下若依框架吧
@Configuration
public class RedisConfig{@Beanpublic RedisTemplate<Object, Object> redisSessionTemplate(RedisConnectionFactory factory) {RedisTemplate<Object, Object> template = new RedisTemplate<>();// 配置连接工厂template.setConnectionFactory(factory);//JdkSerializationRedisSerializer jdkRedisSerializer = new JdkSerializationRedisSerializer();RedisSerializer<String> keySerializer = new StringRedisSerializer();RedisSerializer<Object> valueSerializer = new JdkSerializationRedisSerializer(this.getClass().getClassLoader());// 值采用json序列化template.setValueSerializer(valueSerializer);//使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(keySerializer);// 设置hash key 和value序列化模式template.setHashKeySerializer(keySerializer);template.setHashValueSerializer(valueSerializer);template.afterPropertiesSet();return template;}
}

6、Jedis

  • Jedis就是Redis官方推荐的Java连接开发工具。

  • 在Java中,Redis对应于Jedis就相当于关系数据库对应于JDBC!!!

使用实例,首先引入依赖:

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency>

对于不用认证的redis,直接new一个Jedis对象,调用与指令名相同的API来完成数据操作即可:

// 第一个参数是Redis的IP地址,第二个参数是Redis的端口号
Jedis jedis = new Jedis("localhost", 6379);
// 写
jedis.set("msg", "Hello World!");
//查
String msg = jedis.get("msg");	
// 打印Hello World
System.out.println(msg);	
// 关闭Redis连接
jedis.close();

有认证的则:

Jedis jedis = new Jedis("localhost", 6379);jedis.auth("password");//auth方法重载
jedis.auth("username","password");

或者借助JedisShardInfo对象:

JedisShardInfo info = new JedisShardInfo("localhost",6379);info.setPassword("admin123");Jedis jedis  = new Jedis(info);jedis.get("xxx")

7、Jedis的连接池

Jedis提供了连接池机制,需要操作Redis数据时,向Jedis连接池获取Redis的连接对象即可(类比JDBC的Connection对象),Jedis的连接池类为redis.clients.jedis.JedisPool。

// 初始化连接池类(使用默认连接池参数)
//JedisPool构造方法重载,你再传用户名密码也行
JedisPool jp = new JedisPool("localhost", 6379);// 获取一个Jedis连接
Jedis jedis = jp.getResource();

也可使用配置类JedisPoolConfig来指定连接池的其他参数:

JedisPoolConfig jpc = new JedisPoolConfig();// 设置连接池的最大连接数
jpc.setMaxTotal(30);  // 设置连接池允许的最大空闲连接数
jpc.setMaxIdle(8);    // 初始化连接池类,传入使用自定义连接池配置类
JedisPool jp = new JedisPool(jpc, "localhost", 6379);// 从连接池获取一个Jedis连接
Jedis jedis = jp.getResource();

8、封装Jedis工具类

封装个工具类,方便后续使用,jedis.properties内容:

jedis.host=localhost
jedis.port=6379
jedis.username=admin
jedis.password=admin123
jedis.maxTotal=30
jedis.maxIdle=10

借助静态代码块,调用封装的静态方法获取连接对象时,执行静态代码块,完成连接池初始化。(复习:静态代码块在类加载时执行,且执行一次,而调用静态资源是类加载的触发时机之一)

public class JedisUtils {private static JedisPool pool;static {// 加载Jedis连接池配置参数InputStream inputStream = JedisUtils.class.getResourceAsStream("jedis.properties");Properties prop = new Properties();try {prop.load(inputStream);} catch (IOException e) {e.printStackTrace();}String host = prop.getProperty("jedis.host");int port = Integer.parseInt(prop.getProperty("jedis.port"));int maxTotal = Integer.parseInt(prop.getProperty("jedis.maxTotal"));int maxIdle = Integer.parseInt(prop.getProperty("jedis.maxIdle"));String username = prop.getProperty("jedis.username");String password = prop.getProperty("jedis.password");// 设置Jedis连接池参数JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(maxTotal);config.setMaxIdle(maxIdle);// 初始化Jedis连接池pool = new JedisPool(config, host, port,username,password);}// 从Jedis连接池获取连接public static Jedis getJedis() {return pool.getResource();}
}

8、RedisTemplate底层实现技术切换

RedisTemplate基于Jedis或Lettuce等连接池技术,实现了与Redis服务器的连接和资源管理。且SpringBoot下默认是使用Lettuce,这一点从starter中可以看到:

在这里插入图片描述

想实现底层技术的切换,即从默认的lettuce(翻译:生菜)切换成Jedis,只需引入依赖后指定配置中的client-type即可:

<dependency><groupId>redis.clients</groupId>    <artifactId>jedis</artifactId>
</dependency>

改配置,准确说是在原来的基础说改下client-type:

spring:  redis:    host: localhost     port: 6379    client-type: jedis

其余独有属性可单独配置,Jedis和Lettuce的常用配置如连接池最大连接数:

spring:  redis:    host: localhost     port: 6379    client-type: jedisjedis:pool:max-active: 16# 顺便展示下Lettuce的,写一起了lettuce:pool:max-active: 16

关于Lettuce和Jedis的区别:

  • jedis连接Redis服务器是直连模式,当多线程模式下使用jedis会存在线程安全问题,解决方案可以通过配置连接池使每个连接专用,这样整体性能就大受影响
  • lettcus基于Netty框架进行与Redis服务器连接,底层设计中采用StatefulRedisConnection。 StatefulRedisConnection自身是线程安全的,可以保障并发访问安全问题,所以一个连接可以被多线程复用,当然lettcus也支持多连接实例一起工作

线程安全的这一点区别,大概就是Lettuce被选中做starter的默认实现的原因吧。

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

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

相关文章

spark Structured报错解决

报错&#xff0c;不想看原因的直接去解决方案试试 Exception in thread "main" java.lang.IllegalArgumentException: Pathname /C:/Users/Administrator/AppData/Local/Temp/1/temporary-611514af-8dc5-4b20-9237-e5f2d21fdf88/metadata from hdfs://master:8020/C…

C语言的stdio.h的介绍

C语言的stdio.h的介绍 C语言的stdio.h的介绍 C语言的stdio.h的介绍C语言stdio.h的介绍 C语言stdio.h的介绍 这个含义是导入标准输入输出库 包含头文件.h&#xff0c;std标准库&#xff0c;io是input output输入输出库 <>代表系统库&#xff0c;自定义的话用""…

Ingress Controller

什么是 Ingress Controller &#xff1f; 在云原生生态中&#xff0c;通常来讲&#xff0c;入口控制器( Ingress Controller )是 Kubernetes 中的一个关键组件&#xff0c;用于管理入口资源对象。 Ingress 资源对象用于定义来自外网的 HTTP 和 HTTPS 规则&#xff0c;以控制进…

解决typescript报错:不能将类型xxx分配给类型xxx

现象&#xff1a; 这种情况是因为组件传参时&#xff1a; 等号左右两边的数据类型不能严格匹配一致造成的 等号左边data, 查看一下被传参的子组件ProductList的内部data属性: 可以看到data的类型是 &#xff1a; Product[] 而右边的shoppingCartItems来自于&#xff1a; redu…

作为一名独立开发者,如何获取客户?

很多程序员想成为一名独立开发者&#xff0c;从事自由职业&#xff0c;最大的困难在于如何赚钱&#xff0c;进一步来说&#xff0c;就是如何找到自己的客户&#xff0c;有很多开发者拥有丰富的经验&#xff0c;优秀的能力&#xff0c;但无法吸引客户。这篇文章的灵感正是为此而…

精通git,没用过git cherry-pick?

前言 git cherry-pick是git中非常有用的一个命令&#xff0c;cherry是樱桃的意思&#xff0c;cherry-pick就是挑樱桃&#xff0c;从一堆樱桃中挑选自己喜欢的樱桃&#xff0c;在git中就是多次commit中挑选一个或者几个commit出来&#xff0c;也可以理解为把特定的commit复制到…

Spring整合第三方框架-MyBatis原始操作代码

建议自己写一下 实体类&#xff0c;用于封装数据库数据 package com.example.pojo;import java.util.Date;public class Emp {private Integer id;private String username;private String password;private String name;private Integer gender;private String image;privat…

网络安全内网渗透之DNS隧道实验--dnscat2直连模式

目录 一、DNS隧道攻击原理 二、DNS隧道工具 &#xff08;一&#xff09;安装dnscat2服务端 &#xff08;二&#xff09;启动服务器端 &#xff08;三&#xff09;在目标机器上安装客户端 &#xff08;四&#xff09;反弹shell 一、DNS隧道攻击原理 在进行DNS查询时&#x…

Redis可视化工具-Another Redis Desktop Manager 安装

Another Redis DeskTop Manager 是 Redis 可视化管理工具&#xff0c;体积小&#xff0c;完全免费。最重要的是稳定&#xff0c;而且操作简单、方便。 目录 一、下载安装 下载 安装 二、简单使用 连接 新增key 三、springboot整合redis 前期准备 一、下载安装 下载 下载…

ARM IIC总线实现温湿传感器

IIC.h #ifndef __IIC_H__ #define __IIC_H__ #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h"/* 通过程序模拟实现I2C总线的时序和协议* GPIOF ---> AHB4* I2C1_SCL ---> PF14* I2C1_SDA ---> PF15** */#define SET_SDA_OUT do{G…

数据库选型参考

文章目录 前言嵌入式数据库数据库服务器PostgreSQL和MySQL的对比 NoSQL国产数据库阿里PolarDB腾讯TDSQL阿里OceanBase和PolarDB的区别 华为GaussDb 前言 DB-Engines Ranking 会根据受欢迎程度对数据库管理系统进行排名&#xff0c;排名每月更新一次。 分为关系型数据库、Key-V…

SpringMVC 学习(七)JSON

9. JSON 9.1 简介 JSON&#xff08;JavaScript Object Notation&#xff0c;JS 对象标记&#xff09;是一种轻量级数据交换格式&#xff0c;采用独立于编程语言的文本格式储存和表示数据&#xff0c;易于机器解析和生成&#xff0c;提升网络传输效率。 任何 JavaScript 支持…

9.26 牛客Java题库day 3

1.类变量&#xff08;static&#xff09;在不设置初始值时,会进行默认值赋值&#xff0c;而局部方法中声明的变量则必须进行初始化&#xff0c;它不会进行默认值赋值 2.了解forward,redirect: URL:统一资源定位符&#xff0c;又是也被俗称为网页地址 http://www.runoob.com/…

描述性统计分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件可在个人主页—…

电压放大器在无损探伤中的应用研究

电压放大器是一种常见的电子设备&#xff0c;其主要作用是将低电平信号转换为高电平信号。在无损探伤中&#xff0c;电压放大器被广泛应用于信号增益和分析&#xff0c;以便更好地检测表面或内部缺陷。下面安泰电子Aigtek将详细介绍电压放大器在无损探伤中的应用研究。 电压放大…

ForkJoin详解

1.分支合并 (大数据量的去使用) package com.kuang.forkjoin;import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.function.LongBinaryOperator; import java.util.stre…

MSF的安装与使用教程,超详细,附安装包和密钥

MSF简介 Metasploit&#xff08;MSF&#xff09;是一个免费的、可下载的框架 它本身附带数百个已知软件漏洞&#xff0c;是一款专业级漏洞攻击工具。 当H.D. Moore在2003年发布Metasploit时&#xff0c;计算机安全状况也被永久性地改变了&#xff0c;仿佛一夜之间&#xff0…

【CentOS7】安装docker

【CentOS7】安装docker 1.Docker 要求 CentOS 系统的内核版本高于 3.10 &#xff0c;通过命令查看你当前的内核版本 。2.使用 root 权限登录 Centos&#xff0c;将 yum 包更新到最新。&#xff08;确保联网&#xff09;3. 如果安装过旧版本的话&#xff0c;卸载旧版本4. 设置yu…

springboot实战(八)之整合redis

目录 序言&#xff1a; 环境&#xff1a; 依赖&#xff1a; 配置&#xff1a; 测试&#xff1a; redis序列化配置&#xff1a; 连接池&#xff1a; 序言&#xff1a; Redis是我们Java开发中&#xff0c;使用频次非常高的一个nosql数据库&#xff0c;数据以key-value键…

云原生之使用Docker部署RSS阅读器Huntly

云原生之使用Docker部署RSS阅读器Huntly 一、Huntly介绍1.1 Huntly简介1.2 Huntly功能2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Huntly镜像五、部署Huntly5.1 创建挂载目录5.2 创建Hun…