【Redis】2、Redis 的 Java 客户端(Jedis 和 SpringDataRedis)

news2024/11/15 14:08:11

目录

  • 零、Redis 的 Java 客户端有哪些?
  • 二、Jedis 客户端
    • (1) 引依赖
    • (2) 连接 Redis 服务并测试
    • (3) Redis 连接池
  • 三、SpringDataRedis 介绍
  • 四、SpringBoot 中集成 SpringDataRedis
    • (1) 引入依赖
    • (2) 配置文件中书写相关配置
    • (3) RedisTemplate 的默认序列化方式
    • (4) 自定义 RedisTemplate 的序列化方式
    • (5) 使用 RedisTemplate 操作 Redis 数据库
    • (6) StringRedisTemplate

零、Redis 的 Java 客户端有哪些?

在这里插入图片描述

二、Jedis 客户端

Jedis 的使用:https://redis.io/docs/clients/java/

(1) 引依赖

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

(2) 连接 Redis 服务并测试

public class testJedis {

    private Jedis jedis;
    private static final String HOST = "192.168.88.130";
    private static final String PWD = "root";
    private static final int PORT = 6379;

    @Before
    public void setUp() {
        // 建立连接
        jedis = new Jedis(HOST, PORT);
        // 设置密码
        jedis.auth(PWD);
        // 选择库
        jedis.select(0);
    }

    @Test
    public void testString() {
        String result = jedis.set("name", "张国庆");
        System.out.println("result = " + result);

        String name = jedis.get("name");
        System.out.println("name = " + name);
    }

    /**
     * 释放资源
     */
    @After
    public void tearDown() {
        if (jedis != null) jedis.close();
    }

}

(3) Redis 连接池

🌼 Jedis 实例是线程不安全的
🌼 多线程环境 下需要基于连接池来使用
🌼 这里使用的连接池技术是 Jedis 提供的

/**
 * 返回 Redis 连接的工厂类
 */
@SuppressWarnings("all")
public class JedisConnectionFactory {

    private static final int PORT = 6379;
    private static final String HOST = "192.168.88.130";
    private static final String PWD = "root";

    // 连接池
    private static final JedisPool JEDIS_POOL;

    /**
     * 配置连接池
     */
    static {
        // 连接池的配置
        JedisPoolConfig config = new JedisPoolConfig();
        // 最大连接
        config.setMaxTotal(8);
        // 最大空闲连接
        config.setMaxIdle(8);
        // 最小空闲连接
        config.setMinIdle(0);
        // 最长等待时间(单位:ms)
        config.setMaxWaitMillis(666);

        JEDIS_POOL = new JedisPool(config, HOST, PORT, 1000, PWD);
    }

    public static Jedis getJedisConnection() {
        return JEDIS_POOL.getResource();
    }

}

🍀 JedisPool:Redis 连接池
🍀 JedisPoolConfig:Redis 连接池的配置

三、SpringDataRedis 介绍

🍃 SpringDataSpring 中数据操作的模块,包含对各种数据库的集成,其中对 Redis 的集成模块叫做 SpringDataRedis

在这里插入图片描述

🍃 官网地址:https://spring.io/projects/spring-data-redis

SpringDataRedis 有以下特点:
😀 提供了对不同 Redis 客户端的整合(LettuceJedis
😀 提供了 RedisTemplate 统一 API 来操作 Redis
😀 支持 Redis 的发布订阅模型
😀 支持 Redis 哨兵和 Redis 集群
😀 支持基于 Lettuce 的响应式编程
😀 支持基于 JDK、JSON、字符串、Spring 对象的数据序列化及反序列化
😀 支持基于 Redis 的 JDKCollection 实现


🌿 SpringDataRedis 中提供了 RedisTemplate 工具类,其中封装了各种对 Redis 的操作
🌿 RedisTemplate 将不同数据类型(String、List、Set、SortedSet、Hash)的操作封装到了不同的类型中:
在这里插入图片描述

四、SpringBoot 中集成 SpringDataRedis

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

(2) 配置文件中书写相关配置

# Redis 相关配置
spring:
  redis:
    host: 192.168.88.130
    port: 6379
    password: root
    lettuce:
      pool:
        max-active: 8 # 最大连接
        max-idle: 8 # 最大空闲连接
        min-idle: 0 # 最小空闲连接
        max-wait: 100 # 连接等待时间

(3) RedisTemplate 的默认序列化方式

  • RedisTemplate 可以接收任意 Object 作为值写入 Redis,只不过写入前会把 Object 序列化为字节形式,默认是采用 JDK 序列化,得到的结果如下所示:
    在这里插入图片描述

  • 可读性差

  • 内存占用较大

(4) 自定义 RedisTemplate 的序列化方式

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        // 创建 Template
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // 设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 设置序列化工具
        GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();
        // key 和 hashKey 使用 String 序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        // value 和 hashValue 使用 JSON 序列化
        redisTemplate.setValueSerializer(jsonSerializer);
        redisTemplate.setHashValueSerializer(jsonSerializer);
        return redisTemplate;
    }
}

JSON 处理需要此依赖,假如引入了 SpringMVC 就不需要手动引入此依赖了,因为 SpringMVC 自带了此依赖

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

(5) 使用 RedisTemplate 操作 Redis 数据库

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
    private Long id;
    private String name;
    private short age;
    private Date birthday;
}
@SpringBootTest
@SpringBootTest
class ApplicationTest {
    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    void testString() {
        // 写入一条 String 数据
        redisTemplate.opsForValue().set("love", "爱");
        // 获取 String 数据
        Object love = redisTemplate.opsForValue().get("love");
        System.out.println("love = " + love);
    }

    @Test
    void testSaveObject() {
        Person p1 = new Person(1L, "陈铭酒", 25, new Date());
        Person p2 = new Person(2L, "厉尘澜", 22, new Date());

        redisTemplate.opsForValue().set("crm:person:1", p1);
        redisTemplate.opsForValue().set("crm:person:2", p2);

        System.out.println(redisTemplate.opsForValue().get("crm:person:1"));
        System.out.println(redisTemplate.opsForValue().get("crm:person:2"));
    }

}

在这里插入图片描述

为了在反序列化时知道对象的类型,JSON 序列化器会将类的class 类型写入 json 结果中并存入 Redis,会带来额外的内存开销(Redis 中会存入无关的内容)


为了节省内存空间,我们并不会使用 JSON 序列化器来处理value,而是统一使用 String 序列化器,要求只能存储 String 类型的 key 和 value。当需要存储 Java 对象时,手动完成对象的序列化和反序列化。

在这里插入图片描述

(6) StringRedisTemplate

  • Spring 默认提供了一个 StringRedisTemplate
  • 它的 key 和 value 的序列化方式默认就是 String
@SpringBootTest
class ApplicationTestStringRedisTemplate {
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void testString() {
        // 写入一条 String 数据
        stringRedisTemplate.opsForValue().set("cmj", "陈铭酒");
        // 获取 String 数据
        Object cmj = stringRedisTemplate.opsForValue().get("cmj");
        System.out.println("cmj = " + cmj);
    }

    @Resource
    private ObjectMapper objectMapper;

    @Test
    void testSaveObject() throws JsonProcessingException {
        Person p = new Person(3L, "刘德华", 33, new Date());

        // 把 p 对象手动序列化为 JSON 字符串
        String pStr = objectMapper.writeValueAsString(p);

        // 存入 Redis
        stringRedisTemplate.opsForValue().set("crm:person:3", pStr);

        // 从 Redis 中取出
        String pStrFrom = stringRedisTemplate.opsForValue().get("crm:person:3");
        // 把 JSON 字符串手动序列化为 Person 对象
        Person person = objectMapper.readValue(pStrFrom, Person.class);
        System.out.println("person = " + person);

    }

}

在这里插入图片描述

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

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

相关文章

高校学生考勤系统

摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括高校学生考勤系统的网络应用&#xff0c;在外国高校学生考勤系统已经是很普遍的方式&#xff0c;不过国内的高校学生考勤可能还处于起步阶段。高校学生考勤系统具有管理…

Linux网络-数据链路层,MAC帧解析,ARP协议

目录 数据链路层VS网络层 以太网概念 以太网的帧格式&#xff08;报文格式&#xff09;&#xff08;也可以称之为MAC帧&#xff09; MAC地址的概念 MAC帧格式 局域网通信原理 MTU MTU说明 MTU对IP协议的影响 MTU对UDP协议的影响 MTU对TCP协议的影响 ARP协议 ARP协…

【算法题解】41. 二叉树的中序遍历

这是一道 简单 题 https://leetcode.cn/problems/binary-tree-inorder-traversal/ 题目 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#…

[易语言][部署]使用易语言部署paddleocr的onnx模型api接口推理直接调用

易语言如何部署paddleocr模型&#xff0c;如今paddleocr模型广泛被使用各种编程&#xff0c;为了能在易语言上使用因此开发一个通用接口&#xff0c;开发基本思路如下&#xff1a; 可见我们并没有使用什么通信协议或者命令行之类的方法&#xff0c;这种直接封装接口比其他方法更…

TCP 学习笔记

Win R 打开控制台输入CMD 打开小黑窗&#xff0c; 输入ipconfig 查询本机地址 “外网IP是全世界唯一的IP地址,仅分配给一个网络设备。而内网IP是由路由器分配给每一部内部使用的IP地址,而内网的所有用户都是通过同一个外网IP地址进行上网的,而内网的IP地址每个人的都不一样…

(四)WPF - 布局

一、布局过程 WPF 布局包括两个阶段&#xff1a;一个测量阶段和排列阶段 在测量阶段&#xff0c;容器遍历所有子元素&#xff0c;并询问子元素它们所期望的尺寸。在排列阶段&#xff0c;容器在合适的位置放置子元素。&#xff08;每个元素都被其父元素告知它自己的尺寸是多少…

【软件设计师暴击考点】下午题高频考点暴击系列

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

电脑选购必备的六大技巧

目录 1、CPU方面 2、显卡方面 3、电脑主板方面 4、内存和硬盘方面 5、电脑机箱和电源方面 6、装机过程要全程参与 今天小编给大家分享电脑选购组装必备的六大技巧&#xff0c;希望对大家实际选购、组装电脑提供一些帮助&#xff01; 买电脑要注意哪些问题 1、CPU方面 C…

Qt Model-View架构领悟

1.架构的选择 1.1是否需要委托 模型视图架构图如下所示&#xff0c;模型视图架构源于MVC模式&#xff1a;模型&#xff08;Model&#xff09;是应用对象&#xff0c;表示数据&#xff1b;视图&#xff08;View&#xff09;是模型的用户界面&#xff0c;用以显示数据&#xff…

springboot基础(78):Freemarker模板生成word文档

文章目录 前言如何使用Freemakrer生成word文档1. 制作模板2. 编写工具类 遇到的问题下载失败如何只生成文件不下载 前言 利用Freemarker模板生成word文档。示例&#xff0c;将左侧的模板生成为右侧的文档并下载。 如何使用Freemakrer生成word文档 1. 制作模板 1.编辑一份a…

实现注册与登录(企业级)

目录 实现注册超级管理员功能&#xff08;持久层&#xff09; 一、判定系统是否已经绑定超级管理员 二、编写保存用户记录的代码 三、编写查询用户ID的代码 实现注册超级管理员功能&#xff08;业务层&#xff09; 一、获取OpenId 二、编写注册新用户的业务代码 掌握 R…

tuple 和数组区别

元组&#xff08;tuple&#xff09;和数组&#xff08;array&#xff09;都是 Python 中用于存储多个值的数据结构&#xff0c;但它们在实现和使用上有一些区别。 元组是不可变的&#xff0c;而数组是可变的。即元组一旦创建&#xff0c;其内容就不能被修改&#xff0c;而数组…

高数笔记1(第一章函数 极限 连续 第一节函数第二节极限-极限的概念与性质)

目录 第一章 函数 极限 连续第一节 函数第二节 极限一、极限的概念与性质数列的极限例1例2 函数的极限极限的性质&#xff08;保号性重点 有界性&#xff09;例12例13例14 函数极限与数列极限的关系例15 第一章 函数 极限 连续 第一节 函数 判断有界要用函数的绝对值&#xff…

Toolformer:可以教会自己使用工具的语言模型

Toolformer&#xff1a;可以教会自己使用工具的语言模型 摘要Introduction现有大模型的局限处理办法本文的idea Approach样例化API调用执行API调用筛选API调用模型微调 实验局限 论文地址点这里 摘要 语言模型&#xff08;LMs&#xff09;呈现了令人深刻的仅使用少量的范例或…

2022(一等奖)D1649基于多源卫星遥感的干旱区农作物耗水精细模拟

作品介绍 1 研究背景及目标 1.1 研究区概况 本次研究的研究区位于甘肃省张掖市内。张掖市位于甘肃省西部&#xff0c;河西走廊中段&#xff0c;属干旱和半干旱两种气候类型&#xff0c;其特点是夏季短而酷热&#xff0c;冬季长而严寒&#xff0c;干旱少雨&#xff0c;且降水分…

MySQL-SQL存储过程/触发器详解(下)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

ubuntu20.4服务器搭建ftp并连接(阿里云服务器)

首先在控制台添加ftp防火墙规则&#xff1a; 然后进入服务器安装ftp&#xff08;安装vsftpd&#xff09;: sudo apt update sudo apt install vsftpd使用以下命令检查其状态&#xff1a; sudo service vsftpd status如果FTP服务器未运行&#xff0c;请使用以下命令启动它&am…

强化学习:时序差分算法 TD-learning

例子引入 首先&#xff0c;我们考虑简单的平均估计计算&#xff1a; w E [ X ] wE[X] wE[X]&#xff0c;根据 RM算法 计算过程如下&#xff1a; 接着上面的例子&#xff0c;我们现在考虑一个较为复杂的问题&#xff0c;估计函数 v ( X ) v(X) v(X) 的平均值&#xff0c;根据 …

3.数据模型

文章目录 前言1.对象&#xff08;Object&#xff09;1.1 标准对象1.2 自定义对象1.2.1 创建一个property&#xff08;房产&#xff09;自定义对象1.2.2创建一个Favorite&#xff08;收藏夹&#xff09;自定义对象1.2.3 创建对象的注意事项 1.3 字段1.3.1 为property object创建…

迅镭激光参展CESC2023中国(江苏)国际储能大会,共话储能产业发展趋势!

2023年6月14日 中国(江苏)国际储能大会 暨智慧储能技术及应用展览会 在南京国际博览中心隆重开幕 迅镭激光携多款新能源解决方案 精彩亮相A区5C21展位 聚焦新能源电池绿色智能制造 共话储能行业创新发展之路 本次展会为期三天(6月14-16日) 诚邀广大行业同仁莅临参观交流! 本届大…