【Redis】使用 Java 客户端连接 Redis

news2024/10/6 14:29:20

一、三种客户端比较

Jedis : 学习成本低,以 Redis 命令作为方法名称,但是其线程不安全

lettuce:基于 Netty 实现,支持同步、异步、响应式编程(SpringBoot),并且线程安全。支持 Redis 的哨兵模式、集群模式和管道模式。

Redisson: 基于 Redis 实现的分布式、可伸缩的 Java 数据结构集合。

二、Jedis 基础使用

  1. 引入依赖
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>4.3.1</version>
        </dependency>
  1. 使用单元测试进行测试
package com.example.redis;

import lombok.Data;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;


@SpringBootTest
class RedisApplicationTests {

    private Jedis jedis;
    @BeforeEach
    void setUp(){
        jedis = new Jedis("192.168.33.10", 6379); // new 一个 jedis 对象
        jedis.select(0);
    }
    @Test
    void contextLoads() {
        jedis.set("testJedis", "存入成功");
        String haha = jedis.get("testJedis");
        System.out.printf(haha);
    }

}

三、SpringDataRedis

1. SpringDataRedis 基础概况

在这里插入图片描述
在这里插入图片描述
2. 使用步骤

1)导入依赖

        <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)编写配置文件

spring:
  redis:
    host: 192.168.33.10 # 你的 redis 地址
    #数据库索引
    database: 0
    port: 6379
    #password:
    #连接超时时间(ms)
    timeout: 5000
    # 自定义redis默认过期时间(单位:时)
    expire-time: 24
    jedis:
      pool:
        # 连接池最大连接数(使用负值表示没有限制)
        max-active: -1
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1

3) 测试连接

package com.example.redis;

import lombok.Data;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import redis.clients.jedis.Jedis;


@SpringBootTest
class RedisApplicationTests {

    @Autowired //自动注入即可
    private RedisTemplate redisTemplate;

    @Test
    void contextLoads() {
        redisTemplate.opsForValue().set("testRedisTemplate", "测试成功");
        redisTemplate.opsForValue().get("testRedisTemplate");
    }

}

4) 对象类型序列化存储

———— 方式一:

redisTemplate 的 key 和 value 都是对象类型。key 和 value 会先被序列化,然后存储 ,若是自己不定义序列化方式,会用默认的 jdk 的序列化器 。这种方式序列化出来的 key 和 value 往往是读不友好的,因此我们要自定义序列化方式。

在具体实现时,我们将 key 固定为 String 类型 ( key 一般情况都是 String 类型),将 Value 固定为 Object 类型,key 使用 RedisSerializer.string() 方式序列化,value 使用 GenericJackson2JsonRedisSerializer 序列化器序列化。

  • 为容器中注入一配置类设置 RedisTemplate序列化方式:
package com.example.redis.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        // 创建 RedisTemplate 对象
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // 设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 创建 JSON 序列化工具
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // 设置 key 的序列化 (用 String 类型的序列化)
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        // 设置 value 的序列化 (用 jack 类型的序列化)
        redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
        redisTemplate.setHashKeySerializer(genericJackson2JsonRedisSerializer);

        return redisTemplate;
    }
}

  • 存储读取对象测试:
// City 对象
package com.example.redis.bean;

import lombok.Data;

import java.io.Serializable;

@Data
public class City implements Serializable {
    private int id;
    private String name;
    private String countryCode;
    private String district;
    private String population;
}

	// 测试类
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    void contextLoads() {
        City city = new City();
        city.setId(1);
        city.setName("沈阳");
        city.setPopulation("10000");
        city.setDistrict("haha");
        city.setCountryCode("中国");

        redisTemplate.opsForValue().set("city:1", city);

        City c = (City) redisTemplate.opsForValue().get("city:1");
        System.out.printf("*********************************************" + c + "************************************");
    }

结果截图:

在这里插入图片描述

———— 方式二:

GenericJackson2JsonRedisSerializer 的问题

GenericJackson2JsonRedisSerializer 存储对象时夹带了私货 , @class 占用了额外内存空间,但是但是不加 @class 就不能自动反序列化,因此我们提出方式二。

解决 GenericJackson2JsonRedisSerializer 空间占用问题:

在这里插入图片描述

存储对象时对对象进行 手动序列化 和 反序列化,具体实现时,使用SpringMVC 提供的 ObjectMapper 类的 writeValueAsString 和 readValue 方法对对象进行序列化和反序列化。

示例代码如下:

import com.example.redis.bean.City;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;

@SpringBootTest
class RedisStringApplicationTests {
    
    @Autowired
    private StringRedisTemplate redisTemplate;

    // SpringMVC 中手动序列化的工具
    private static final ObjectMapper mapper = new ObjectMapper();
    @Test
    void contextLoads() throws JsonProcessingException {
        // 创建对象
        City city = new City();
        city.setId(1);
        city.setName("沈阳");
        city.setPopulation("10000");
        city.setDistrict("haha");
        city.setCountryCode("中国");
        // 手动序列化
        String json = mapper.writeValueAsString(city);
        // 写入数据
        redisTemplate.opsForValue().set("city:2", json);
        // 获取数据
        String getCityJson = redisTemplate.opsForValue().get("city:2");
        // 手动反序列化为对象
        City c = mapper.readValue(getCityJson, City.class);
        System.out.println("****************************" + c + "************************");
    }
}

结果截图

通过这种方式存储的对象数据就清清爽爽了

在这里插入图片描述

5) Hash 数据结构操作测试

@SpringBootTest
class RedisHashApplicationTests {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Test
    void contextLoads() {
        // 存数据
        stringRedisTemplate.opsForHash().put("city:3", "id", "3");
        stringRedisTemplate.opsForHash().put("city:3", "name", "北京");

        // 取数据
        Map<Object, Object> entries =  stringRedisTemplate.opsForHash().entries("city:3");

        System.out.printf("*********************************************" + entries);
    }
}

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

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

相关文章

【附源码】计算机毕业设计JAVA幼儿健康管理系统

【附源码】计算机毕业设计JAVA幼儿健康管理系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA my…

Nacos入门

文章目录一、安装nacos二、nacos项目环境配置一、安装nacos 压缩包下载地址&#xff1a; https://github.com/alibaba/nacos/releases 压缩包解压&#xff1a; nacos 中修改端口(8848 端口被占用需要修改)&#xff1a; 进入 conf 进入 application.properties 端口位置 启…

【springboot进阶】摆脱 if/else 的高级应用 - 策略模式

目录 一、策略模式的介绍 二、策略模式的使用场景 三、策略模式的应用 1、入参和出参类 2、策略接口 3、策略具体实现 4、策略测试 三、一些使用技巧 四、总结 对于一个逻辑相对复杂的功能应用中&#xff0c;难免需要做很多的逻辑判断&#xff0c;需要写一堆的 if/els…

Flink常用Sink(elasticsearch(es)Sink、RedisSink、KafkaSink、MysqlSink、FileSink)

flink输出到es、redis、mysql、kafka、file 文章目录配置pom文件公共实体类KafkaSInkElasticsearchSink(EsSink)RedisSinkMysqlSink(JdbcSink)FileSink自己先准备一下相关环境 配置pom文件 <properties><maven.compiler.source>8</maven.compiler.source>&l…

【概率论与数理统计】第四章知识点复习与习题

思维导图 基础知识 数学期望 定义 数学期望其实很好理解&#xff0c;就是均值&#xff0c;当然这里并不是直接计算样本的均值&#xff0c;而是考虑到样本对应的概率。我们分离散和连续两类来讨论数学期望。 离散型 对随机变量X的分布律为 若级数 绝对收敛&#xff0c;则称该…

BaGet搭建Nuget私仓(window10docker)

文章目录一、搭建背景二、框架简介三、私仓搭建1、环境2、win10上部署2.1安装SDK2.2下载和解压BaGet包2.3运行项目2.4类库项目2.5将包发布到私有Nuget中2.6使用BaGetFirstLib2.7使用密码增加安全性3、Docker上部署3.1创建相关文件3.2拉取镜像3.3运行3.4访问四、结束一、搭建背景…

微服务入门

文章目录一、微服务大概认识二、单体架构架构和分布式架构三、微服务架构特征四、微服务技术对比五、SpringCloud 与 SpringBoot版本兼容关系如下&#xff1a;一、微服务大概认识 二、单体架构架构和分布式架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&…

“加密上海·喜玛拉雅Web3.0数字艺术大展”落幕,AIGC和数字艺术衍生品是最大赢家?...

图片来源&#xff1a;由无界版图 AI 绘画工具生成11月11日&#xff0c;为期一个月的第一届“加密上海喜玛拉雅3eb3.0数字艺术大展”在喜玛拉雅美术馆拉开帷幕。这无疑是当下中国最盛大、最集中的一次数字艺术展览。艺术展吸引了像Soul 、小红书、网易星球、bilibili、酷天下、无…

mysql实战操作总结

1、问题描述 关于mysql操作&#xff0c;记录下&#xff1b; 2、问题说明 1.停止正在执行的sql 数据量太大&#xff0c;数据库没反应&#xff0c;用的navicat&#xff0c;就在查询页面&#xff0c;执行&#xff1a; show processlist;---会显示对应的查询sql找到最前面是id…

vue js实现文件上传压缩优化处理

vue js实现文件上传压缩优化处理 两种方法 &#xff1a; 第1种是借助canvas的封装的文件压缩上传第2种&#xff08;扩展方法&#xff09;使用compressorjs第三方插件实现 目录 vue js实现文件上传压缩优化处理 借助canvas的封装的文件压缩上传 1.新建imgUpload.js 2.全局引…

高清免费壁纸网站推荐

本期内容&#xff0c;为大家整理了6个相当不错的免费壁纸网站&#xff0c;访问量极大、活跃度极高。 无需登录、注册&#xff0c;打开右键就可以下载&#xff0c;而且壁纸图片的尺寸大小&#xff0c;可以选择&#xff0c;从手机、平板、再到电脑壁纸&#xff0c;全部都是高清。…

Windows/Ubuntu安装frida和objection

​Windows/Ubuntu安装frida和objection 1.Windows环境使用管理员权限安装frida,Ubuntu使用普通或Root权限安装均可 https://github.com/frida/frida (1).安装frida(Python2.7.8及以上版本) pip install numpy matplotlib -i https://mirrors.aliyun.com/pypi/simplepip insta…

imx6ull pro BSP 工具链

BSP&#xff0c;Board Support Package&#xff0c;指板级支持包&#xff0c;是构建嵌入式操作系统所 需的引导程序(Bootload)、内核(Kernel)、根文件系统(Rootfs)和工具链 (Toolchain)。 每种开发板的 BSP 都不一样&#xff0c;并且这些源码都非常庞大。我们把这些源码都 放在…

BI-SQL丨JOB

JOB 在SQL Server中&#xff0c;JOB属于常用功能&#xff0c;我们经常需要通过JOB来执行一些定时的作业任务&#xff0c;例如数据备份、存储过程、SSIS任务、SSAS刷新等等。 通常情况下&#xff0c;我们都是在SSMS中对JOB进行创建、删除、维护等任务的。 前置条件 使用JOB功…

基于Mxnet实现实例分割-MaskRCNN【附部分源码】

文章目录前言一、什么是实例分割二、数据集的准备1.数据集标注2.VOC数据集转COCO数据集三、基于Mxnet搭建MaskRCNN1.引入库2.CPU/GPU配置3.获取训练的dataset1.coco数据集2.自定义数据集4.获取类别标签5.模型构建6.数据迭代器7.模型训练1.优化器设置2.loss计算3.acc计算4.循环训…

堆 堆排序 TopK问题

堆一&#xff0c;堆的相关函数接口实现1&#xff0c;堆的初始化2&#xff0c;堆的销毁3&#xff0c;插入4&#xff0c;向上调整5&#xff0c;删除6&#xff0c;向下调整7&#xff0c;建堆8&#xff0c;取堆顶9&#xff0c;判空10&#xff0c;堆的大小二&#xff0c;向上建堆与向…

用DIV+CSS技术设计的鲜花网站(web前端网页制作课作业)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

(人工智能的数学基础)第一章特征向量与矩阵分析——第一节:向量、向量空间和线性相关性

文章目录一&#xff1a;标量和向量&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;坐标系中的向量表示二&#xff1a;向量运算&#xff08;1&#xff09;加减与数乘&#xff08;2&#xff09;向量内积A&#xff1a;为什么需要向量内积B&#xff1a;向量内积C&…

Linux之分区【详细总结】

目录分区介绍分区查看指令lsblk ![请添加图片描述](https://img-blog.csdnimg.cn/d7ea5468d719433ea6ee4ab0eb145770.png)lsblk -f挂载案例分五部分组成 虚拟机添加硬盘 分区 格式化 挂载 设置自动挂载虚拟机增加硬盘查看整个系统磁盘情况查询查看整个目录磁盘占用情况磁盘情况…

初识 MySQL HeatWave

MySQL 作为全球最欢迎的数据库&#xff0c;已在交易场景叱咤风云多年。在 2020 年底&#xff0c;OCI&#xff08;Oracle Cloud Infrastructure&#xff09;推出了一个黑科技插件&#xff0c;它弥补了 MySQL 在分析场景的短板&#xff0c;Oracle 官方称它比 Aurora 快 1400 倍&a…