Jredis和SpringDataRedis学习笔记

发布于:2025-02-22 ⋅ 阅读:(20) ⋅ 点赞:(0)

jredis基础操作

jredis连接池

其中有个静态方法getJedis能够将练级池中的连接拿取出来并返回

通过setMaxWaitMitllis设置一个响应时间,如果连接池里面没有连接,那么请求连接方在等待超过响应时间时就会报错

springDataRedis

通过这样一个代码将redisTemplate进行装载并且进行注入依赖,并完成对redis的连接

package com.example.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 Demo1ApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void contextLoads() {
        redisTemplate.opsForValue().set("name", "顶针");

        Object name = redisTemplate.opsForValue().get("name");
        System.out.println(name);
    }

}

序列化

有一点我们需要注意

当我们使用Java代码写入数据的时候

其默认会使用jdk序列化

我们通过源码进行解读,当我们点进去redisTemplate的源码时

我们发现有四个序列化,其分别是对key value进行序列化和对hash里面的key和value进行的序列化

而当我们没有定义这四个序列化的值的时候

我们就会执行下面这一段代码的序列化,这一段代码的序列化采用的是jdk的序列化

我们再次跟进set方法观察set的源码

当我们点进去的时候我们会在rawValue里将对应的value转换为字节数组

当我们接着跟进rawValue()的构造方法,我们会发现里面有我们之前提到过的valueSerializer四个序列化之中的一个序列化,其中他会尝试获取value的序列化值,当我们点进去serialize方法里面

我们会发现serialize使用的是jdk的序列化工具,当我们再次点进去convert的方法里面时

再次点击进入serializeToByteArray方法里面

会发现这样一个方法

当我们再次点击进去,我们就会发现我们使用了objectOutPutStream()这个方法以及接下来的一系列方法都是将Java对象转换为字节并写入redis中,这样的jdk序列化是非常不好的

那么我们有没有一种更好用的序列化呢?

我们观察序列化方法,里面有一个StringRedisSerializer方法是专门用于字符串进行序列化的

当我们的key和hashkey都是字符串的时候可以使用它进行序列化

使用实例

当我们向redis中写入一个对象时,我们通过我们设置的redistemplate将对应的value值转换为了json格式的对象

并且我们存入redis时会有一个@Class的对象标记,这样我们就可以在读取的时候,通过读取字节码来进行反序列化从而将一个json串变成一个对象

但是要注意,将user的字节码写入redis会出现额外的内存开销

所以为了节省空间,我们只能够将value值以字符串的形式存入内存中,然后再手动的进行序列化和反序列化

StringRedisTemplate

大致使用如下

主要要点是因为stringRedisTemplate这个类的key和value都是需要传入一个字符串对象的

假若我们想要传入一个类需要用json序列化的工具将其转换为字符串

常见的有ObjectMapper这种工具,这个来自于springmvc里面的工具

当读取redis里面的数据的时候,也是需要进行反序列化,从redis里面拿取的数据依旧是字符串,同样需要objectMapper进行json串的逆序列化转换为一个对象

使用方法如下所示

hash值的存取