redis 的java客户端 基础(一)

目录

一、redis的客户端语言支持

 二、Jedis快速入门

2.1 Jedis连接池

2.1.1 创建Jedis的连接池

 三、SpringDataRedis

 3.1 快速入门SpringDataRedis


一、redis的客户端语言支持

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

redis 的java客户端 基础(一)_第1张图片

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

redis 的java客户端 基础(一)_第2张图片

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

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

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

 二、Jedis快速入门

创建有个工程,引入依赖



    redis.clients
    jedis
    3.7.0



    org.junit.jupiter
    junit-jupiter
    5.7.0
    test

编写测试类: 

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 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();
    }

}

redis 的java客户端 基础(一)_第3张图片

 三、SpringDataRedis

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

redis 的java客户端 基础(一)_第4张图片

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

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

  • 支持Redis的发布订阅模型

  • 支持Redis哨兵和Redis集群

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

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

  • 支持基于Redis的JDKCollection实现

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

redis 的java客户端 基础(一)_第5张图片

 3.1 快速入门SpringDataRedis

redis 的java客户端 基础(一)_第6张图片

 
        
            org.springframework.boot
            spring-boot-starter-data-redis
        
        
        
            org.apache.commons
            commons-pool2
        
        
        
            com.fasterxml.jackson.core
            jackson-databind
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        

配置文件

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);
    }
}

 运行成功

redis 的java客户端 基础(一)_第7张图片

 查看客户端数据

redis 的java客户端 基础(一)_第8张图片

 redis 的java客户端 基础(一)_第9张图片

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

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

redis 的java客户端 基础(一)_第10张图片 

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

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

redis 的java客户端 基础(一)_第11张图片 

 这种用法比较普遍,因此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 entries = stringRedisTemplate.opsForHash().entries("user:400");
        System.out.println("entries = " + entries);
    }

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

你可能感兴趣的:(redis,java,redis,开发语言)