redis 的java客户端 基础(一)

2023-11-10

目录

一、redis的客户端语言支持

 二、Jedis快速入门

2.1 Jedis连接池

2.1.1 创建Jedis的连接池

 三、SpringDataRedis

 3.1 快速入门SpringDataRedis


一、redis的客户端语言支持

在Redis官网中提供了各种语言的客户端,地址:https://redis.io/resources/clients/

 其中Java客户端也包含很多:

标记为❤的就是推荐使用的java客户端,包括:

  • Jedis和Lettuce:这两个主要是提供了Redis命令对应的API,方便我们操作Redis,而SpringDataRedis又对这两种做了抽象和封装,因此我们后期会直接以SpringDataRedis来学习。

  • Redisson:是在Redis基础上实现了分布式的可伸缩的java数据结构,例如Map.Queue等,而且支持跨进程的同步机制:Lock.Semaphore等待,比较适合用来实现特殊的功能需求。

 二、Jedis快速入门

创建有个工程,引入依赖

<!--jedis-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.7.0</version>
</dependency>
<!--单元测试-->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.7.0</version>
    <scope>test</scope>
</dependency>

编写测试类: 

public class JedisTest {
    private Jedis jedis;

    @BeforeEach
    void  setUp(){
        //1、建立连接
        jedis= new Jedis("192.168.178.130",6379);
        //2、设置密码
        jedis.auth("123456");
        //3、选择库
        jedis.select(2);
    }

     @Test
      public void test(){
        //存入数据   ctrl+alt+v快速补全
          String result = jedis.set("name", "diaolovetest");
         System.out.println("result = " + result);
          String name = jedis.get("name");
          System.out.println(name);
      }

    @Test
    void testHash() {
        // 插入hash数据
        jedis.hset("user:1", "name", "Jack");
        jedis.hset("user:1", "age", "21");

        // 获取
        Map<String, String> map = jedis.hgetAll("user:1");
        System.out.println(map);
    }

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

2.1 Jedis连接池

Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式

有关池化思想,并不仅仅是这里会使用,很多地方都有,比如说我们的数据库连接池,比如我们tomcat中的线程池,这些都是池化思想的体现。

2.1.1 创建Jedis的连接池

  • 使用工厂设计模式,去降低代的耦合,比如Spring中的Bean的创建,就用到了工厂设计模式

  • 2)静态代码块:随着类的加载而加载,确保只能执行一次,我们在加载当前工厂类的时候,就可以执行static的操作完成对 连接池的初始化

  • 3)最后提供返回连接池中连接的方法.

package com.diao.util;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @Description: jedis连接池$
 * @Author: dyq
 * @Date: 2022年11月24日23:35:43$
 */
public class JedisConnectionFacotry {
    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,
                "192.168.178.130",6379,1000,"123456");
    }

    public static Jedis getJedis(){
        return jedisPool.getResource();
    }

}

 三、SpringDataRedis

 SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:Spring Data Redis

  • 提供了对不同Redis客户端的整合(Lettuce和Jedis)

  • 提供了RedisTemplate统一API来操作Redis

  • 支持Redis的发布订阅模型

  • 支持Redis哨兵和Redis集群

  • 支持基于Lettuce的响应式编程

  • 支持基于JDK.JSON.字符串.Spring对象的数据序列化及反序列化

  • 支持基于Redis的JDKCollection实现

SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

 3.1 快速入门SpringDataRedis

 <!--redis依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--common-pool-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
        <!--Jackson依赖-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

配置文件

spring:
  redis:
    host: 192.168.178.130
    port: 6379
    password: 123456
    lettuce:
      pool:
        max-active: 8  #最大连接
        max-idle: 8   #最大空闲连接
        min-idle: 0   #最小空闲连接
        max-wait: 100ms #连接等待时间

编写测试类RedisDemoApplicationTests

package com.example.redis_demo;

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;

@SpringBootTest
class RedisDemoApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

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

 运行成功

 查看客户端数据

 

 什么是反序列化?反序列化的过程,原理_kali_Ma的博客-CSDN博客_反序列化

尽管JSON的序列化方式可以满足我们的需求,但依然存在一些问题,如图

 

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

为了减少内存的消耗,我们可以采用手动序列化的方式,换句话说,就是不借助默认的序列化器,而是我们自己来控制序列化的动作,同时,我们只采用String的序列化器,这样,在存储value时,我们就不需要在内存中就不用多存储数据,从而节约我们的内存空间

 

 这种用法比较普遍,因此SpringDataRedis就提供了RedisTemplate的子类StringRedisTemplate,它的key和value的序列化方式默认就是String方式。

最后小总结:

RedisTemplate的两种序列化实践方案:

  • 方案一:

    • 自定义RedisTemplate

    • 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

  • 方案二:

    • 使用StringRedisTemplate

    • 写入Redis时,手动把对象序列化为JSON

    • 读取Redis时,手动把读取到的JSON反序列化为对象

Hash结构的序列化操作

   @Test
    public void  testHash(){
        stringRedisTemplate.opsForHash().put("user:400", "name", "牛哥");
        stringRedisTemplate.opsForHash().put("user:400", "age", "22");

        Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:400");
        System.out.println("entries = " + entries);
    }

声明: 个人学习记录,不做商业用途,来源于B站黑马程序员redis!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis 的java客户端 基础(一) 的相关文章

  • 使用 Guice 注入类集合

    我正在尝试用 Google Guice 2 0 注入东西 我有以下结构 FooAction implements Action BarAction implements Action 然后我有一个带有以下构造函数的 ActionLibrar
  • 如何将变量的全部内容发送/导出到文本文件/xml 文件/剪贴板?

    我想将实例的内容 最好以树形形式 发送给某人 打印屏幕是不行的 因为类太复杂了 您需要将输出转回实例吗 在这种情况下 其他答案都是正确的 如果您只想手动检查实例的内容 理想情况下您的类都将实现toString 你可以将其重定向到一个文件 如
  • 如何从 Play WSClient 的字符串创建 WSResponse 对象

    文档 https www playframework com documentation 2 4 x JavaTestingWebServiceClients Mock the web service建议使用模拟Web服务测试基于WSCli
  • Java 读取大文本文件时出现 OutOfMemoryError

    我是 Java 新手 正在读取非常大的文件 需要一些帮助来理解问题并解决它 我们有一些遗留代码 必须对其进行优化才能正常运行 文件大小仅在 10mb 到 10gb 之间变化 只有当文件开始大小超过 800mb 时才会出现启动问题 Input
  • 在命令行java中突出显示文本[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一项任务是重新创建 unix cal 程序 除了一部分之外 相当简单 今天 它突出显示了该数字 我不知道该怎么做 关于如何在 Ja
  • 迁移到Java 9或更高版本时是否需要切换到模块?

    我们目前正在从 Java 8 迁移到 Java 11 但是 升级我们的服务并没有我们预期的那么痛苦 我们基本上只需要更改我们的版本号build gradle文件和服务都顺利启动并运行 我们升级了库以及使用这些库的 微 服务 到目前为止没有问
  • 尝试获取屏幕上绘制的每个随机圆圈的 x、y 坐标

    您好 我正在制作一款游戏 该游戏将在屏幕上创建随机圆圈 随机创建的圆圈的值为红色或绿色 我的问题是 我希望不仅能够确定用户何时单击其中一个圆圈 而且还能够确定他们最终单击的圆圈 红色或绿色 下面是我的代码 我的主要问题是试图找到将要绘制的圆
  • 如何将现有的 SQLite3 数据库导入 Room?

    好吧 我在桌面上使用 SQLite3 创建了一个只需要读取的某些信息的数据库 我正在制作的应用程序不需要在此表中插入或删除信息 我在 Room 数据库层上做了相当多的谷歌搜索 所有文档都需要在构建应用程序时在 Room 中创建一个新的数据库
  • Kafka Java Consumer 已关闭

    我刚刚开始使用卡夫卡 我面临着消费者的一个小问题 我用Java写了一个消费者 我收到此异常 IllegalStateException 此消费者已关闭 我在以下行中遇到异常 ConsumerRecords
  • 使用 JAX-WS 的 WebLogic 中没有模式导入的单个 WSDL

    如何使用 JAX WS 配置由 WebLogic 10 3 6 生成的 Web 服务 以将对象架构包含在单个 WSDL 文件声明 而不是导入声明 中 示例代码 界面 import javax ejb Local Local public i
  • Web API 缓存 - 如何使用分布式缓存实现失效

    我有一个 API 目前不使用任何缓存 我确实有一个正在使用的中间件 它可以生成缓存标头 Cache Control Expires ETag Last Modified 使用https github com KevinDockx HttpC
  • 查找数组中的组合

    我在java中有一个像这样的二维数组 transmission communication tv television approach memorycode methodact 我需要获得所有组合 例如 transmission appr
  • 是否有最新的 Facebook Java SDK? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 好像没找到最近更新的 如果没有 是否有一个好的 Java 库来执行与 Facebook 的 API 交
  • 合并两个地图的最佳实践是什么

    如何将新地图添加到现有地图 地图具有相同的类型Map
  • 如何在 Bean Validation 1.0 中构造 ConstraintViolationException?

    我对 javax validation API 感到困惑 我正在编写一个简单的测试来理解它 Sample sample new Sample Set
  • 改变 Java 中凯撒移位的方向

    用户可以通过选择 1 向左或 2 向右移动字母来选择向左或向右移动 左边工作正常 右边不行 现在它显示了完全相同的循环 但我已经改变了所有 and 以不同的方式进行标记 最终我总是得到奇怪的字符 如何让程序将字符向相反方向移动 如果用户输入
  • Jetty Plugin 9启动不喜欢icu4j-2.6.1.jar

    我对 mortbay 的 Maven jetty 插件 6 有相同的配置
  • Java 中处理异步响应的设计模式

    我读过类似问答的答案 如何在 JAVA 中创建异步 HTTP 请求 https stackoverflow com questions 3142915 how do you create an asynchronous http reque
  • Java 中的微分方程

    我正在尝试用java创建一个简单的SIR流行病模型模拟程序 基本上 SIR 由三个微分方程组定义 S t l t S t I t l t S t g t I t R t g t I t S 易感人群 I 感染人群 R 康复人群 l t c
  • 使用 AmazonSNSClient 发送短信时的授权

    aws 官方文档如何发送短信 http docs aws amazon com sns latest dg sms publish to phone html使用 java 中的 aws SDK 非常简单 但是 当发送如底部示例所示的消息时

随机推荐

  • vba17-25

    十七 变量默认值 简写变量 常量 1声明变量的同时赋值 数值 0 字符串 空字符串 布尔 False 变体 Empty 空 2 布尔值 false 0 True 1 所有非0的数字转换成布尔类型都是True 3变量定义简写 dim i in
  • 区块链基本特性

    区块链具有去中心化 不可篡改 不可逆 匿名等特性 去中心化 因为整个网络没有中心统治者 系统依靠的是网络上多个参与者的公平约束 所以任意每几个节点的权利和义务都是均等的 而且每一个节点都会储存这个区块链上所有数据 即使该节点被损坏或遭受攻击
  • 使用SWIG编写python的扩展

    环境 python3 8 5 64位 Visual Studio 2017 SWIG 4 0 2 一 安装SWIG https www swig org download html 下载windows 预编译好的文件 解压后把swig ex
  • 建立时间、保持时间、时钟输出延时、时钟偏斜、slack(公式整理)

    文章目录 一道华为笔试题 1 tclk最小周期tclk min 2 时钟建立时间Tsu 3 时钟保持时间Thold 4 时钟输出延时Tco 5 slack 6 时钟偏斜 答案 Reference 一道华为笔试题 1 tclk最小周期tclk
  • 数组的常用方法concat,join,slice和splice的区别,map,foreach,reduce

    1 concat 和join concat 是连对两个或两个数组的方法 直接可以将数组以参数的形式放入 join 是将数组中的所有元素放入一个字符串中 通俗点讲就是可以将数组转换成字符串 2 slice和splice的区别 相同点就是都是对
  • Maven Intellij 配置下载镜像

    在使用maven管理包的时候 总会出现包下载很慢的情况 所以这里我们使用阿里云的仓库来代替maven自己的仓库 来提高下载的速度 Maven 重新指定源 修改maven conf setting XML里面关于mirror的设置 具体内容如
  • 嵌入式Linux小项目之X210上QT5.6.2移植和开发环境搭建

    目录 一 QT背景知识介绍 1 常见GUI系统 2 QT的发展例程 3 QT如何跨平台 4 QT相关的其他一些名字 5 QT的网络资源 二 QT的官网资源开发环境搭建 1 QT官网资源 2 QT开发环境搭建 3 QT的linuxfb介绍 三
  • 在windows下搭建、配置nginx流媒体服务器,并进行rtmp流的推流、拉流测试

    在博主之前的博文 Ubuntu下安装 编译 运行nginx和nginx rtmp module 中讲述了在linux Ubuntu 下搭建nginx流媒体服务器的方法 下面讲述在windows下搭建nginx流媒体服务器的方法 使其支持rt
  • Opencv-python3,处理rtsp流视频-----踩坑总结+VideoCapture.get()详解:

    最近项目在用opencv处理rtsp流相机 中间也踩了很多坑 这里写篇博客帮助那些可能会遇到相似问题的同胞 注 我这里同时用到了四个相机 1 电脑同时连接多个相机后 之后去打开rtsp相机时 初次打开特别耗时 甚至打开失败 在Win10上需
  • 开源技术选型目录(不断整理)

    http www infoq com cn 参见 开源技术选型手册 第1章 闲话开源社区篇 1 1开源软件定义 自由的重新发布 开源软件 源代码 在提供软件的同时也要提供程序源代码 也必须允许其他人对代码进行编辑或修改 如果发行没有待源代码
  • jdbc连接常用url格式

    jdbc mysql localhost 3306 db name serverTimezone Asia Shanghai characterEncoding utf8 useUnicode true 配置文件中是如上写法 写在字符串里的
  • NLP学习(六)hanlp命名实体识别-Python3实现

    环境配置 1 jdk安装配置环境变量 2 jpype安装 pip3 install jpype1 3 hanlp相关资源下载 百度云https pan baidu com s 1sw4fDjiLO0PhvYxJ2YMOOw 提取码4lm4
  • pycharm安装paddle并训练第一个模型

    最近用pycharm安装paddle来训练第一个模型 猫狗分类 条件 需要python解释器3 7 第一步 下载paddle库 这样既可安装好了paddlepaddle 如果以后想继续使用安装好的paddle 可以选中全局的包进行引用 不必
  • Fiddler抓不到包原因排查

    今天使用fiddler的时候抓不到包 网上查找了一下 原因有以下几个 1 代理未设置成功 最先应该检查浏览器代理的设置是否是正确的 2 误设置成了不抓包 检查 fiddler 菜单项中 Capture Traffic 选项和 fiddler
  • OpenFeign使用

    OpenFeign使用 在微服务的架构中 传统的http客户端如Httpclient Okhttp HttpURLConnection RestTemplate WebClient 显然不适合 毕竟需要动态的获取服务地址 和进行负载均衡调用
  • Qt服务器接受多个客户端

    1 指定父对象 监听套接字 indexSocket 0 监听套接字 指定父对象 让其自动回收空间 tcpServer new QTcpServer this const QString IP 192 168 9 11 QHostAddres
  • Hyper-V无法使用鼠标的解决办法

    使用Hyper V建立一个新的虚拟机后 从Hyper V的控制台进入系统 会发现无法使用鼠标 解决办法如下 点击控制台的操作 gt 插入集成服务安装盘 此时会自动开始安装 安装完成后会需要重启虚拟机 重启后生效 若点击 插入集成服务安装盘
  • 基于 Flink、ClickHouse 的舆情分析系统:系统详细设计说明书

    文章目录 1 引言 1 1 编写目的 1 2 背景 1 3 参考资料 1 4 术语定义及说明 2 设计概述 2 1 任务和目标 2 1 1 需求概述 2 1 2 运行环境概述 2 1 3 条件与限制 2 1 4 详细设计方法和工具 3 系统
  • 实验10 防火墙安全应用试验

    实验10 防火墙安全应用试验 实验目的 实验环境与设备 过程如下 实验目的 理解防火墙的基本概念和基本工作原理 掌握瑞星个人防火墙的使用和设置方法 掌握金山毒霸个人防火墙的使用和设置方法 实验环境与设备 要求 win7操作系统 SQL Se
  • redis 的java客户端 基础(一)

    目录 一 redis的客户端语言支持 二 Jedis快速入门 2 1 Jedis连接池 2 1 1 创建Jedis的连接池 三 SpringDataRedis 3 1 快速入门SpringDataRedis 一 redis的客户端语言支持