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串的逆序列化转换为一个对象
使用方法如下所示