目录
一、redis的客户端语言支持
二、Jedis快速入门
2.1 Jedis连接池
2.1.1 创建Jedis的连接池
三、SpringDataRedis
3.1 快速入门SpringDataRedis
在Redis官网中提供了各种语言的客户端,地址:https://redis.io/resources/clients/
其中Java客户端也包含很多:
标记为❤的就是推荐使用的java客户端,包括:
Jedis和Lettuce:这两个主要是提供了Redis命令对应的API,方便我们操作Redis,而SpringDataRedis又对这两种做了抽象和封装,因此我们后期会直接以SpringDataRedis来学习。
Redisson:是在Redis基础上实现了分布式的可伸缩的java数据结构,例如Map.Queue等,而且支持跨进程的同步机制:Lock.Semaphore等待,比较适合用来实现特殊的功能需求。
创建有个工程,引入依赖
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();
}
}
}
Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式
有关池化思想,并不仅仅是这里会使用,很多地方都有,比如说我们的数据库连接池,比如我们tomcat中的线程池,这些都是池化思想的体现。
使用工厂设计模式,去降低代的耦合,比如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();
}
}
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封装到了不同的类型中:
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);
}
}
运行成功
查看客户端数据
什么是反序列化?反序列化的过程,原理_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
声明: 个人学习记录,不做商业用途,来源于B站黑马程序员redis!