redis 的java客户端 基础(一)

news2025/7/27 18:48:41

目录

一、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!

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

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

相关文章

[oeasy]python0020换行字符_feed_line_lf_反斜杠n_B语言_安徒生童话

换行字符 回忆上次内容 struct包可以让我们使用封包格式 把数字封包到字节里 pack函数负责封包unpack函数负责解封 我们通过封到不同的字节状态 遍历了一次ascii码还是有那片黑色的区域 好像是一片黑暗森林&#xff01;那里面到底有些什么秘密&#xff1f;&#x1f914; 我们这…

2022大厂面试秘籍Java岗:中间件+算法+HTTP+线程+虚拟机+分布式

前言 很多朋友对面试不够了解&#xff0c;不知道如何准备&#xff0c;对面试环节的设置以及目的不够了解&#xff0c;因此成功率不高。通常情况下校招生面试的成功率低于1%&#xff0c;而社招的面试成功率也低于5%&#xff0c;所以对于候选人一定要知道设立面试的初衷以及每个…

CSS 选择器

目录 1、导语 2、css基本选择器 1&#xff09;、标签选择器 2&#xff09;类选择器 3&#xff09;ID选择器 4&#xff09;通配符选择器 3、css组合选择器 1&#xff09;标记类别选择器&#xff08;交集选择器&#xff09; 2&#xff09;后代选择器 3&#xff09;子选择器 4…

[足式机器人]Part3机构运动微分几何学分析与综合Ch02-2 平面机构离散运动鞍点综合——【读书笔记】

本文仅供学习使用 本文参考&#xff1a; 《机构运动微分几何学分析与综合》-王德伦、汪伟 《微分几何》吴大任 Ch02-2 平面机构离散运动鞍点综合2.3 鞍点圆2.3.1 鞍圆与二副连架杆R-R2.3.2 鞍圆误差2.3.3 四位置鞍圆2.3.4 五位置鞍圆2.3.5 多位置鞍圆2.3 鞍点圆 平面连杆机构中…

浅谈JVM(面试常考题)

文章目录JVM简介JVM 执行流程JVM运行时数据区(内存布局)程序计数器(线程私有)Java虚拟机栈(线程私有)堆(线程共享)方法区(线程共享)小结JVM类加载类加载的具体过程LoadingLinkingVerificationPreparationResolutionInitialization类加载的执行顺序双亲委派模型JVM中的垃圾回收机…

最新手工整理31省市自治区180+指标面板数据-各省份邮电和运输指标汇总(2002-2020)

1、数据来源&#xff1a;国家统计局 2、时间跨度&#xff1a;2002-2020 3、时间频率&#xff1a;年度 4、区域范围&#xff1a;31个省市⾃治区 5、邮电指标&#xff1a; 包裹数(万件)报刊期发数(万份)汇票业务(万笔)集邮业务量(万枚)固定本地电话通话时长(万分钟)固定长途…

流媒体技术基础-流媒体编码与协议

一、流媒体传输协议 1.实时传输协议RTP 针对多媒体数据流的一种传输协议&#xff0c;建立在UDP协议上&#xff0c;属于传输层协议。 定义互联网上传递音频和视频的标准数据包格式。RTP协议常用于流媒体系统&#xff08;配合RTCP协议&#xff09;、视频会议和视频电话系统&…

2022 APMCM亚太数学建模竞赛 C题 全球是否变暖 问题二python代码实现(更新完毕)

更新信息 2022-11-24 10:00 更新问题1和问题2 思路 2022-11-24 23:20 更新问题一代码 2022-11-25 11:00 更新问题二代码 相关链接 【2022 APMCM亚太数学建模竞赛 C题 全球是否变暖 问题一python代码实现】 【2022 APMCM亚太数学建模竞赛 C题 全球是否变暖 问题二python代…

爱尔兰博士后招聘|利默里克大学-广告学

[国外博士后招聘-知识人网]爱尔兰利默里克大学广告学博士后 爱尔兰利默里克大学是爱尔兰独立后第一所由政府资助而建的综合型独立大学。爱尔兰利默里克大学是爱尔兰七所国立大学之一&#xff0c;1972年开始招生&#xff0c;1989年被政府准予授予学位。利莫瑞克大学下设六个学院…

【学习笔记25】JavaScript字符串的基本认识

JavaScript字符串的基本认识一、严格模式二、字符串1、字面量2、构造函数3、包装类型三、字符集&#xff08;了解&#xff09;1、ASCII&#xff1a;128个2、GBK国标码&#xff1a;前128位ASCII&#xff0c;从129开始为汉字3、unicode(万国码)四、字符串的length与下标一、严格模…

【数论】质数

文章目录一、试除法判定质数二、试除法分解质因数三、筛法求素数1. 朴素筛法2. 埃氏筛法3. 线性筛法质数&#xff1a;大于1&#xff0c;且只包含1和本身两个因数的整数 一、试除法判定质数 如果是合数&#xff0c;那么因数一定是成对出现的&#xff0c;比如12&#xff0c;有2…

【Axure教程】能增删改数据的动态饼图

可视化视图是系统分析中非常重要的一个环节&#xff0c;今天作者就教大家在Axure中如何用中继器表格结合echarts图片&#xff0c;制作出一个能够动态增删改数据饼图的原型模板。需要制作的效果如下图所示&#xff1a; 自动生成饼图&#xff1a;通过修改中继器表格中的数据&…

教程三 在Go中使用Energy创建跨平台应用 - 状态控制

本文介绍在Energy中如何像浏览器一样控制状态, 页面的加载、前进、后退、刷新、暂停刷新 前提-需要安装好开发环境参考:教程一环境安装 创建应用 开发环境中 MacOSX平台必须在"GlobalCEFInit"之前设置CEF设置使用CEF 和 CEF框架目录&#xff0c;生成开发执行应用程…

【kafka】十、kafka消费者offset维护

消费者offset维护 offset维护 由于consumer在消费过程中可能会出现断电宕机等故障&#xff0c;consumer恢复后&#xff0c;需要从故障前的位置继续消费&#xff0c;所以consumer需要实时记录自己消费到了哪个offset&#xff0c;以便恢复后继续消费。 消费者是按照消费者组来保…

第八章 动态规划 3 AcWing 1554. 找更多硬币

第八章 动态规划 3 AcWing 1554. 找更多硬币 原题链接 AcWing 1554. 找更多硬币 算法标签 DP 背包问题 思路 经典01背包问题 闫氏DP分析法 状态表示 状态初始化 状态计算 状态转移方程式 要求字典序最小&#xff0c;因此先存硬币面额到数组再降序排列&#xff0c;保…

App逆向之frida-dexdump脱壳分析某肿瘤sign

声明&#xff1a;本文仅限学习交流使用&#xff0c;禁止用于非法用途、商业活动等。否则后果自负。如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01;本教程也没有专门针对某个网站而编写&#xff0c;单纯的技术研究 一、firda 的安装 国内下载很慢&#xff1a;pip…

docker容器网络

第七章容器网络 Docker网络 veth pair&#xff1a;成对出现的一种虚拟网络设备&#xff0c;数据从一端进&#xff0c;从另一端出。用于解决网络命名空间之间隔离。 docker0&#xff1a;网桥是一个二层网络设备&#xff0c;通过网桥可以将Linux支持的不同端口连接起来&…

Git常见命令与使用,从0到1学会使用Git

&#x1f468;‍&#x1f4bb;个人主页&#xff1a; 才疏学浅的木子 &#x1f647;‍♂️ 本人也在学习阶段如若发现问题&#xff0c;请告知非常感谢 &#x1f647;‍♂️ &#x1f4d2; 本文来自专栏&#xff1a; 常见软件安装与运用 ❤️ 支持我&#xff1a;&#x1f44d;点赞…

linux NPS 服务端安装 +linux 客户端安装

本文参考博客&#xff1a; https://blog.csdn.net/m0_57776598/article/details/123674866 一、下载安装包 1、官方下载 官方下载地址&#xff1a;https://github.com/ehang-io/nps/releases 注意不要下错了&#xff0c;当前我下的版本为 v0.26.10 2、网盘下载 网盘下载&…

Python编程 字典的常用操作

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.字典 1.访问字典(掌握) 2.字典的增加与修改(掌握) 3.系列删除(掌握) …