【数据库】Redis—Java 客户端

一、常见的几种 Java 客户端

  • Jedis:Redis 命令作为方法的名称,便于学习,简单实用,但其实例是线程不安全的,多线程下需要基于连接池来使用。
  • lettce:基于 Netty 实现,支持同步、异步响应式编程方式,并且线程是安全的,支持 Redis 的多种模式。
  • Redisson:是一个基于 Redis 实现的分布式、可伸缩的 Java 数据结构集合。

        我们在之后会学习 Jedis,以及 Spring Jedis lettce 整合后的 Spring Data Redis


二、Jedis 

        ① 第一步,我们要先导入 Jedis 的对应依赖:

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

       ② 第二步,我们要创建 Jedis 的实例并设置对应参数:

//1.建立连接
jedis = new Jedis("127.0.0.1", 6379);
//2.设置密码
jedis.auth("123456");
//3.选择库
jedis.select(0);

        ③ 注意,在最后需要将连接关闭

//关闭连接
if (jedis != null) {jedis.close();
}

        建立连接后,我们就可以根据我们之前在 Redis 中用到的方法名来快速上手,如操作 String 类型的键值对:

        如上操作,直接调用 set get 方法即可。

        还如操作 hash 类型时:

        也是只用调用对应名称的方法即。

● Jedis 连接池

        前面说过,Jedis 是线程不安全的,所以我们需要建立连接池来确保线程的安全性。我们可以通过建立一个工具类来初始化连接池:

public class JedisConnectionFactory {//连接池对象private static final JedisPool jedisPool;static {//配置连接池JedisPoolConfig poolConfig = new JedisPoolConfig();poolConfig.setMaxTotal(8);//最大连接数poolConfig.setMaxIdle(8);//最大空闲连接poolConfig.setMinIdle(0);//最小空闲连接poolConfig.setMaxWaitMillis(1000);//等待时长//创建连接池对象jedisPool = new JedisPool(poolConfig,"127.0.0.1", 6379, 1000, "123456");}public static Jedis getJedis(){return jedisPool.getResource();}
}

        此处我们使用静态代码块进行初始化,是因为静态代码块会在类执行时加载,并且只会执行一次,确保了线程安全,同时减少了资源的复用

        之后我们在使用时,只需调用该工具类中的 getJedis( ) 方法即可获取到连接池。

//1.建立连接
jedis = JedisConnectionFactory.getJedis();
//2.设置密码
jedis.auth("123456");
//3.选择库
jedis.select(0);

        其次,在我们最后关闭连接时,其 close( ) 方法底层会进行判断,若是连接池会将连接池进行归还,而并非销毁


三、SpringDataRedis

        SpringData Spring 中数据操作的模块,包含对各种数据库的集成,其中对 Redis 额集成模块就是 SpringDataRedis。其封装了各种对 Redis 的操作,并且对不同数据类型的操作封装到了不同的类型。

        ① 第一步,引入依赖。springboot 已默认整合了 SpringDataRedis 。

<!-- 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>
</dependency>

        ② 配置 SpringDataRedis 的配置文件 application.yaml

spring:data:redis:host: 127.0.0.1port: 6379password: 123456jedis:pool:max-active: 8max-idle: 8min-idle: 0max-wait: 100ms

        其中可以自己选择使用 jedis 或是 lettuce,但因其默认使用 lettuce 所以不用导 lettuce 的依赖,而 jedis 需要手动导入依赖。jedis 的连接池也只在配置后才会生效。

        ③ 注入 RedisTemplate

@Autowired
private RedisTemplate redisTemplate;

        注入后调用其中方法可以看到将不同数据类型的操作进行了分离。

        测试后可以正常输出获取的值,运行成功。

        而其会将数据存为如下格式,这是因为其会将传入的内容作为对象进行序列化处理。

        在底层存在 key、value、hashKey、hashValue 四种类型的序列化器。

        且默认使用 jdk 的序列化器,导致出现了这种可读性差占用空间大的问题。

        所以我们需要改变这种序列化方式,修改 RedisTemplate 即可:

        引入 jackson 的依赖:

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

        注册一个配置类并声明一个 Bean 如下进行配置:

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){//1.创建RedisTemplate对象RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();//2.设置连接工厂redisTemplate.setConnectionFactory(redisConnectionFactory);//3.创建Java序列化工具GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();//4.设置key的序列化器redisTemplate.setKeySerializer(genericJackson2JsonRedisSerializer);redisTemplate.setHashKeySerializer(genericJackson2JsonRedisSerializer);//5.设置value的序列化器redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);//6.返回对象return redisTemplate;}
}

        将自动注入的 RedisTemplate 加上泛型后即可

       再次运行后可以看到已经恢复了正常。

        但在我们写入的是一个对象时,会将其自动序列化为一个 json 格式。但其将 User 类的字节码同样写入了进去,这样会占用额外的内存,浪费空间

        想要解决这个问题,我们只能统一的使用 String 序列化器,缺点是只能存储 String 类型的 key value,想要存储对象只能手动的完成对象的序列化反序列化

        但 Spring 默认提供了一个 StringRedisTemplate  类,它的 key value 的序列化方式默认就是 String 方式,所以我们可以直接使用它而不用再手动编写。

@Autowired
private StringRedisTemplate redisTemplate;

        再次传入对象时,可以看到以及不会再出现问题。


【完】

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

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

相关文章

重拾设计模式--观察者模式

文章目录 观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式UML图作用&#xff1a;实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题&#xff08;Subject&#xff09;&#xff1a;具体主题&#xff08;Concrete Subject&#xf…

贪心算法 part01

class Solution { public:int maxSubArray(vector<int>& nums) {int result INT32_MIN;int count 0;for (int i 0; i < nums.size(); i) {count nums[i];if (count > result) { // 取区间累计的最大值&#xff08;相当于不断确定最大子序终止位置&#xff…

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用NI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集NI-FGSM介绍背景算法流程 NI-FGSM代码实现NI-FGSM算法实现攻击效果 代码汇总nifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行…

SAP抓取外部https报错SSL handshake处理方法

一、问题描述 SAP执行报表抓取https第三方数据,数据获取失败。 报错消息: SSL handshake with XXX.COM:449 failed: SSSLERR_SSL_READ (-58)#SAPCRYPTO:SSL_read() failed##SapSSLSessionStartNB()==SSSLERR_SSL_READ# SSL:SSL_read() failed (536875120/0x20001070)# …

AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python

支持向量机是AI开发中最常见的一种算法。之前我们已经一起初步了解了它的概念和应用&#xff0c;今天我们用它来进行一次文本情感分析训练。 一、概念温习 支持向量机&#xff08;SVM&#xff09;是一种监督学习算法&#xff0c;广泛用于分类和回归问题。 它的核心思想是通过…

信奥赛四种算法描述

#include <iostream> #include <iomanip> using namespace std;// 使用unsigned long long类型来尽量容纳较大的结果&#xff0c;不过实际上这个数值极其巨大&#xff0c;可能最终仍会溢出 // 更好的方式可以考虑使用高精度计算库&#xff08;如GMP等&#xff09;来…

Ajax中的axios

既然提到Ajax&#xff0c;那就先来说一说什么是Ajax吧 关于Ajax Ajax的定义 Asynchronous JavaScript And XML&#xff1a;异步的JavaScript和XML。 反正就是一句话总结&#xff1a; 使用XML HttpRequest 对象与服务器进行通讯。 AJAX 是一种在无需重新加载整个网页的情况下&…

vscode 使用说明

文章目录 1、文档2、技巧显示与搜索宏定义和包含头文件 3、插件4、智能编写5、VSCode 与 C&#xff08;1&#xff09;安装&#xff08;2&#xff09;调试&#xff08;a&#xff09;使用 CMake 进行跨平台编译与调试&#xff08;b&#xff09;launch.json&#xff08;c&#xff…

多功能护照阅读器港澳通行证阅读机RS232串口主动输出协议,支持和单片机/Linux对接使用

此护照阅读器支持护照、电子芯片护照、港澳通行证、台湾通行证&#xff0c;和串口的被动的方式不一样。此护照阅读器通电后&#xff0c;自动读卡&#xff0c;串口输出&#xff0c;软件只需要去串口监听数据即可&#xff0c;例如用串口助手就可以收到读卡信息。 非常适用于单片…

petalinux-adi ---移植adi内核(一)

1. 设备树生成 将 前 面 生 成 的 设 备 树 文 件 ( 笔 者 这 里 生 成 的 设 备 树 文 件 在Petalinux 工 程 的components/plnx_workspace/device-tree/device-tree/ 目 录 下 ) pcw.dtsi 、 pl.dtsi 、system-top.dts 以 及 zynq-7000.dtsi 四 个 文 件 直 接 拷 贝 到 内 …

基于MindSpore NLP的PEFT微调

创建notebook 登录控制台 创建notebook 如果出现提示按如下操作 回到列表页面创建notebook参数如下&#xff1a; 配置mindnlp环境 打开GitHub - mindspore-lab/mindnlp: Easy-to-use and high-performance NLP and LLM framework based on MindSpore, compatible with model…

centos-stream9系统安装docker

如果之前安装过docker需要删除之前的。 sudo dnf -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安装yum-utils工具&#xff1a; dnf -y install yum-utils dnf-plugin…

Redis存在安全漏洞

Redis是美国Redis公司的一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值&#xff08;Key-Value&#xff09;存储数据库&#xff0c;并提供多种语言的API。 Redis存在安全漏洞。攻击者利用该漏洞使用特制的Lua脚本触发堆栈缓冲区溢出漏洞&#xff0c;从…

黑马Java面试教程_P8_并发编程

系列博客目录 文章目录 系列博客目录前言1.线程的基础知识1.1 线程和进程的区别&#xff1f;难2频3面试文稿 1.2 并行和并发有什么区别&#xff1f; 难1频1面试文稿 1.3 创建线程的四种方式 难2频4面试文稿 1.4 runnable 和 callable 有什么区别 难2频3面试文稿 1.5 线程的 run…

ubuntu22.04 nginx配置下载目录,亲测成功

安装nginx ubuntu最简单&#xff0c;apt安装即可 apt install nginx 配置文件 文件都在目录下 /etc/nginx/添加内容 修改/ etc/nginx/sites-available/default &#xff0c; 注意这里不是nginx.conf&#xff0c;直接修改nginx.conf不奏效 location /downloads { …

【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类

文章目录 一、this扩展方法1、扩展方法的基本语法2、使用扩展方法3、扩展方法的注意事项5、扩展方法的限制6、总结 二、运算符重载1、C# 运算符重载2、运算符重载的基本语法3. 示例&#xff1a;重载加法运算符 ()4、使用重载的运算符5、支持重载的运算符6、不能重载的运算符7、…

android EditText密码自动填充适配

android上的密码&#xff08;其实不仅仅是密码&#xff0c;可以是用户名也可以是邮箱&#xff09;自动填充&#xff0c;是需要考虑适配的。 官方文档&#xff1a;https://developer.android.com/identity/autofill/autofill-optimize?hlzh-cn 什么是自动填充 手机厂商一般会…

stm32制作CAN适配器5--WinUsb上位机编写

上次我们要stm32制作了一个基于winusb有canfd适配器&#xff0c;今天我们来制作一个上位机程序来进行报文收发。 上位机还是用以前写好的&#xff0c;只是更改下dll文件。 项目链接器&#xff0c;输入&#xff0c;附加依赖项中增加winusb.lib winusb初始化&#xff1a;#incl…

数据库管理系统——数据库设计

摘要&#xff1a;本博客讲解了数据库管理系统中的数据库设计相关内容&#xff0c;包括概念结构设计&#xff1a;E-R模型&#xff0c;逻辑结构设计&#xff1a;E-R模型到关系设计等内容。 目录 一、数据库设计和数据模型 1.1.数据库设计概述 1. 2.数据库结构概述 1.3.数据库…

Pytorch | 从零构建AlexNet对CIFAR10进行分类

Pytorch | 从零构建AlexNet对CIFAR10进行分类 CIFAR10数据集AlexNet网络结构技术创新点性能表现影响和意义 AlexNet结构代码详解结构代码代码详解特征提取层 self.features分类部分self.classifier前向传播forward 训练过程和测试结果代码汇总alexnet.pytrain.pytest.py CIFAR1…