【Redis学习笔记03】Java客户端

1. 初识Jedis

Jedis的官网地址:https://github.com/redis/jedis

1.1 快速入门

使用步骤
注意:如果是云服务器用户使用redis需要先配置防火墙!

  1. 引入maven依赖

    <dependencies><!-- 引入Jedis依赖 --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.0.0</version></dependency><!-- 引入单元测试 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.10.1</version><scope>test</scope></dependency>
    </dependencies>
    
  2. 建立连接

    @BeforeEach
    void setUp() {jedis = new Jedis("114.55.236.21:22", 6379);jedis.auth("123456");jedis.select(0);
    }
    
  3. 测试String类的方法

    @Test
    void testString() {// 1. 尝试set方法jedis.set("name", "wjj");// 2. 尝试get方法String name = jedis.get("name");System.out.println(name);
    }
    
  4. 释放连接

    @AfterEach
    void tearDown() {if (jedis != null) {jedis.close();}
    }
    

运行结果
image.png
image.png

2. 使用Jedis连接池

由于Jedis是线程不安全的,并且频繁创建销毁线程具有很大开销,因此我推荐使用连接池的方式使用Jedis
使用步骤

  1. 使用连接池创建连接工厂类

    /*** 基于连接池实现连接工厂类*/
    public class JedisConnectionFactory {private static final JedisPool jedisPool;static {// 1. 创建连接池配置JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(8); // 最大连接数config.setMaxIdle(8); // 最大空闲连接数config.setMinIdle(0); // 最小空闲连接数config.setMaxWaitMillis(200); // 最长等待时间// 2. 创建JedisPool连接池jedisPool = new JedisPool(config, "114.55.236.21", 6379, 1000, "123456");}public static Jedis getConnection() {return jedisPool.getResource();}
    }
    
  2. 编写测试类测试Hash类型方法

    public class TestJedisPool {private Jedis jedis;@BeforeEachvoid setUp() {jedis = JedisConnectionFactory.getConnection();}@Testvoid testHash() {// 1. 使用hset方法jedis.hset("user:1", "name", "rice");jedis.hset("user:1", "age", "22");// 2. 使用hgetAll方法Map<String, String> map = jedis.hgetAll("user:1");System.out.println(map);}@AfterEachvoid tearDown() {if (jedis != null) {jedis.close();}}
    }

运行结果
image.png
image.png

2. 使用SpringBoot整合Redis

现在基于SpringBoot整合Redis已经成为企业的标配,其中SpringDataRedis就是专门用来操作Redis的集成模块,其具有以下特点:

  • 提供了对不同客户端的整合,比如Jedis和Lettuce
  • 提供了RedisTemplate统一API来操作Redis
  • 支持Redis的发布订阅模型
  • 支持Redis的哨兵和集群
  • 支持Lettuce的响应式编程
  • 支持基于JDK、JSON、String等对象的序列化和反序列化
  • 支持基于Redis的JDKCollection实现

2.1 SpringDataRedis快速入门

使用步骤:

  1. 引入maven依赖

    <!-- 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. application.yml中配置相关参数

    # 配置redis
    spring:data:redis:host: 114.55.236.21port: 6379password: 123456lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: 200
    

    由于Spring官方默认使用lettuce作为客户端,因此如果想要使用Jedis的配置,还需要引入Jedis的maven依赖

  3. 在测试类中自动装配RedisTemplate对象

    @Autowired
    private RedisTemplate redisTemplate;
    
  4. 创建测试类测试redisTemplate的使用

    @SpringBootTest
    class SpringDataRedisDemoApplicationTests {@Resourcepublic RedisTemplate redisTemplate;@Testpublic void testString() {System.out.println(redisTemplate);// 1. 存入String类型数据redisTemplate.opsForValue().set("id", "1");// 2. 取出String类型数据Object id = redisTemplate.opsForValue().get("id");System.out.println(id);}}
    

运行结果
image.png
image.png
但是我们发现其中插入了一个\xac\xed\x00\x05t\x00\x02id这样不知名的key,但是貌似是我们在代码中插入的key值id,但是怎么会以这样的方式呈现呢?
image.png
我们追溯源码可以发现RedisTemplate中使用默认的序列化器就是JDK序列化器,其接收Object类型参数并转换成字节数组存入Redis中,但是我们发现具有以下问题:

  1. 可读性差
  2. 内存占用较大

因此我们更加建议使用String类型序列化器作为keySerializer,而使用JSON序列化器作为valueSerializer

2.2 使用自定义序列化器

使用步骤

  1. 创建Redis配置类RedisConfig.java

    @Configuration
    public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();// 设置连接工厂redisTemplate.setConnectionFactory(connectionFactory);// 设置序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// key和hashKey使用StringSerializerredisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());// value和hashValue使用GenericJackson2JsonRedisSerializerredisTemplate.setValueSerializer(jsonRedisSerializer);redisTemplate.setHashValueSerializer(jsonRedisSerializer);return redisTemplate;}
    }
    
  2. 编写测试类TestJsonSerializer.java

    @SpringBootTest
    public class TestJsonSerializer {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Testpublic void testJsonSerializer() {// 存放idredisTemplate.opsForValue().set("id", "2");// 取出idObject id = redisTemplate.opsForValue().get("id");System.out.println(id);}
    }
    

如果出现如下异常(莫慌,这是正常的!):
image.png
只要引入如下依赖即可:

<!-- 引入jackson-databind依赖 -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.1</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.14.1</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.14.1</version>
</dependency>

运行结果
image.png
image.png
此时可以发现id正常显示!
但是如果我们尝试将value设置为Java的对象,就会出现一定问题:
使用步骤

  1. 创建pojo包下的实体类User.java

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class User {private Integer id;private String name;private Integer age;
    }
    
  2. 在测试类中新增测试方法

    @Test
    public void testJsonObjectSerializer() {// 创建User类对象User user = new User(1, "zhangsan", 22);// 存放User对象redisTemplate.opsForValue().set("user:1", user);// 取出User对象User getUser = (User) redisTemplate.opsForValue().get("user:1");System.out.println(getUser);
    }
    

上述方法尝试将一个User类对象作为value,由于之前我们自定义了value的序列化器为JSON序列化器,因此其内部会自动进行序列化和反序列化
运行结果
image.png
image.png
我们需要重点关注其中的@class的字段内容,不难发现,RedisTemplate自动进行序列化和反序列化的依据就是利用Java的反射机制,因此需要保存类信息,但是这也引入了一个严重的问题:

  • 如果有上千万的数据量,每条信息都需要保存对应的类信息,会极大浪费内存空间!

因此我们还是建议使用手动序列化的方式进行存取!

2.3 手动序列化

使用步骤

  1. 引入JSON工具依赖

    <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.35</version>
    </dependency>
    
  2. 编写测试类手动序列化

    @Test
    public void testMyJSON() {// 1. 创建User对象User user = new User(2, "lisi", 22);// 2. 手动序列化为JSON格式数据String jsonString = JSONObject.toJSONString(user);redisTemplate.opsForValue().set("user:2", jsonString);// 3. 取出数据并手动序列化为User对象String userJSONString = (String) redisTemplate.opsForValue().get("user:2");User toUser = JSONObject.parseObject(userJSONString, User.class);System.out.println(toUser);
    }
    

运行结果
image.png
image.png
此时我们就实现了手动序列化的方式存储Java对象,一切大功告成!

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

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

相关文章

【Crypto | CTF】BugKu 简单的RSA

天命&#xff1a;这题也不算简单了&#xff0c;要反编译&#xff0c;要灵活一点 首先收到pyc文件&#xff0c;拿去反编译出来&#xff0c;可以用在线反编译&#xff0c;也可以用工具反编译 在线&#xff1a;python反编译 - 在线工具 工具&#xff1a;https://download.csdn.n…

[设计模式Java实现附plantuml源码~行为型]算法的封装与切换——策略模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

消息中间件相关介绍

一、消息中间件相关知识 1、概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件&#xff0c;如老牌的ActiveMQ、RabbitMQ&am…

【iOS ARKit】ARWorldMap

ARWorldMap 用于存储 ARSession 检测扫描到的空间信息数据&#xff0c;包括地标&#xff08;Landmark&#xff09;、特征点&#xff08;Feature Point&#xff09;、平面&#xff08;Plane&#xff09;等&#xff0c;以及使用者的操作信息&#xff0c;如使用者添加的 ARAnchor …

数据采集设备:安装过程的要点与注意事项

在当今的数据驱动世界&#xff0c;数据采集设备在各行各业中发挥着至关重要的作用。从工业生产到环境监测&#xff0c;再到医疗诊断&#xff0c;数据采集设备为我们提供了大量有价值的信息。然而&#xff0c;要想充分发挥这些设备的潜力&#xff0c;首先需要确保它们被正确地安…

黑马程序员——接口测试——day03

目录&#xff1a; Potman断言 Postman断言简介Postman常用断言 断言响应状态码断言包含某字符串断言JSON数据Postman断言工作原理Postman关联 简介实现步骤核心代码创建环境案例1案例2Postman参数化 简介数据文件简介编写数据文件 CSV文件JSON文件导入数据文件到postman读取数…

啊丢的刷题记录手册(洛谷题单排序篇)

1.洛谷题P1923 求第k小的数 题目描述 输入 n&#xff08;1≤n<5000000 且 n 为奇数&#xff09;个数字ai​&#xff08;1≤ai​<109&#xff09;&#xff0c;输出这些数字的第 k 小的数。最小的数是第 0 小。 请尽量不要使用 nth_element 来写本题&#xff0c;因为本题…

换档控制支架的尺寸优化

前言 本示例使用优化模块&#xff0c;通过在保持原始重量的同时改变壳体厚度&#xff0c;使冲压钣金支架中的应变能之和最小化&#xff08;使刚度最大化&#xff09;。 本页讨论 前言应用描述Abaqus建模方法和仿真技术文件参考 应用描述 本示例说明了汽车变速箱连杆中使用的…

亿道丨三防平板pad丨三防平板是指哪三防丨三防工业级平板电脑

三防工业级平板电脑成为许多行业中的重要工具。本文将介绍三防工业级平板电脑的特点以及其在各个领域中的广泛应用。 三防工业级平板电脑的特点 三防工业级平板电脑是指具备防水、防尘和防震功能的平板电脑。这些特点使得它们能够在恶劣环境中工作&#xff0c;如沙尘飞扬的工地…

sockaddr结构体、sockaddr_in结构体和gethostbyname函数

sockaddr结构体 sockaddr结构体是在网络编程中经常使用的一个数据结构&#xff0c;用来表示套接字地址。它是一个通用的地址结构&#xff0c;可以用于不同的协议&#xff08;如IPv4、IPv6、UNIX等&#xff09;。 在C语言中&#xff0c;sockaddr结构体定义如下&#xff1a; s…

交换两个整数

交换两个整数 题目描述&#xff1a;解法思路&#xff1a;解法代码&#xff1a;运行结果&#xff1a; 题目描述&#xff1a; 写⼀个函数Swap&#xff0c;可以交换两个整数的内容。注意必须实现成函数完成。 输入2个整数&#xff0c;调用自定义函数Swap&#xff0c;完成2个整数的…

【HarmonyOS】鸿蒙开发之Stage模型-基本概念——第4.1章

Stage模型-基本概念 名词解释 AbilityStage:应用组件的“舞台“ UIAbility:包含UI界面的应用组件&#xff0c;是系统调度的基本单元 WindowStage:组件内窗口的“舞台“ Window&#xff1a;用来绘制UI页面的窗口 HAP:Harmony Ability Package(鸿蒙能力类型的包) HSP:Harmony Sh…

C++17之折叠表达式

相关文章系列 深入理解可变参数(va_list、std::initializer_list和可变参数模版) 目录 1.介绍 2.应用 2.1.使用折叠表达式 2.2.支持的运算符 2.3.使用折叠处理类型 3.总结 1.介绍 折叠表达式是C17新引进的语法特性。使用折叠表达式可以简化对C11中引入的参数包的处理&…

合泰杯开发板HT66F2390入门教程(点亮LED灯)——获得成就:点灯大师

前言 前不久报名了合泰杯竞赛项目&#xff0c;然后手上也是有一个HT66F2390的开发板&#xff0c;我就打算先从点灯开始&#xff0c;学习一个新的芯片第一步都是先成为点灯大师。 一开始&#xff0c;我在网上搜寻了许多的代码示例&#xff0c;希望能够顺利实现LED的控制。然而&…

LeetCode第七题: 整数反转

题目描述 给你一个 32 位的有符号整数 x​ &#xff0c;返回将 x​ 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1]​ &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例 …

铭瑄科技——为星闪技术发展与应用带来新推力

随着智能化生活逐渐普及&#xff0c;无线通信不仅是不仅是信息时代的重要基础设施&#xff0c;而且是推动社会向智能化发展的核心力量之一&#xff0c;其中短距无线通信更是推动未来智能化发展的关键。 为积极推动未来硬件智能化、产业智能化发展&#xff0c;铭瑄正式宣布成为星…

黑马头条-day10

文章目录 app端文章搜索1、文章搜索1.1 ElasticSearch环境搭建1.2 索引库创建①需求分析②ES导入数据场景分析③创建索引和映射 1.3 索引数据同步①app文章历史数据导入ES②文章实时数据导入ES 1.4 文章搜索多条件复合查询①关键词搜索②搜索接口定义 2、搜索历史记录2.1 需求说…

积分商城管理系统的设计与实现

积分商城管理系统的设计与实现 获取源码——》公主号&#xff1a;计算机专业毕设大全

javascript给对象添加迭代器

迭代器是啥就自行百度了 为啥for…of可以遍历数组&#xff0c;为啥不能遍历对象&#xff0c;就是for…of会调用迭代器&#xff0c;而数组是内置了迭代器了&#xff0c;而对象没有内置&#xff0c;所以直接使用for…of遍历对象会报错&#xff0c;因此只用在对象的原型上面自定义…

YOLO算法改进Backbone系列之:EfficientViT

EfficientViT: Memory Effificient Vision Transformer with Cascaded Group Attention 摘要&#xff1a;视觉transformer由于其高模型能力而取得了巨大的成功。然而&#xff0c;它们卓越的性能伴随着沉重的计算成本&#xff0c;这使得它们不适合实时应用。在这篇论文中&#x…