本章内容介绍了Redis的Java客户端,并简单介绍了客户端的选择与Jedis客户端,以及详细分析了解了SpringDataRedis客户端及内部StringRedisTemplate的使用。

目前主流的Redis的Java客户端有三种,分别为Jedis、Lettuce、Redisson。
Jedis和Lettuce:这两个主要是提供了Redis命令对应的API,方便我们操作Redis,而SpringDataRedis又对这两种做了抽象和封装,因此我们后期会直接以SpringDataRedis来学习。
Redisson:是在Redis基础上实现了分布式的可伸缩的java数据结构,例如Map、Queue等,而且支持跨进程的同步机制:Lock、Semaphore等待,比较适合用来实现特殊的功能需求。

考虑到有企业使用Jedis,固简单记载Jedis笔记。官方网址:Jedis官网
(1) 引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>6.0.0</version>
</dependency>(2) 创建Jedis对象,建立连接
private Jedis jedis;
@BeforeEach
void setUp() {
// 1.建立连接
jedis = new Jedis("192.168.150.101", 6379);
jedis = JedisConnectionFactory.getJedis();
// 2.设置密码
jedis.auth("123321");
// 3.选择库
jedis.select(0);
}(3) 使用Jedis,方法名与Redis命令一致
@Test
void testString() {
// 存入数据
String result = jedis.set("name", "虎哥");
System.out.println("result = " + result);
// 获取数据
String name = jedis.get("name");
System.out.println("name = " + 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);
}(4) 释放资源
@AfterEach
void tearDown() {
if (jedis != null) {
jedis.close();
}
}Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此推荐使用Jedis连接池代替Jedis的直连方式。
使用方式: 新建一个com.blog.util,用于存放我们编写的工具类,
public class JedisConnectionFactory {
private static JedisPool jedisPool;
static {
// 配置连接池
JedisPoolConfig poolConfig = new JedisPoolConfig();
// 最大连接
poolConfig.setMaxTotal(8);
// 最大空闲连接
poolConfig.setMaxIdle(8);
// 最小空闲连接
poolConfig.setMinIdle(0);
// 设置在最长等待时间
poolConfig.setMaxWaitMillis(1000);
// 创建连接池对象,参数:连接池配置、服务端ip、服务端端口、超时时间、密码
jedisPool = new JedisPool(poolConfig, "192.168.150.101", 6379, 1000, "123321");
}
//获取Jedis对象
public static Jedis getJedis(){
return jedisPool.getResource();
}
}@SpringBootTest
class RedisTestApplicationTests {
private Jedis jedis = JedisConnectionFactory.getJedis();
@Test
void testString(){
jedis.set("name","Kyle");
String name = jedis.get("name");
System.out.println("name = " + name);
}
@Test
void testHash(){
jedis.hset("reggie:user:1","name","Jack");
jedis.hset("reggie:user:2","name","Rose");
jedis.hset("reggie:user:3","name","Kyle");
jedis.hset("reggie:user:1","age","21");
jedis.hset("reggie:user:2","age","18");
jedis.hset("reggie:user:3","age","18");
Map<String, String> map = jedis.hgetAll("reggie:user:1");
System.out.println(map);
}
@AfterEach
void tearDown(){
if (jedis != null){
jedis.close();
}
}
}但后面我们使用SpringDataRedis的时候,可以直接在yml配置文件里配置这些内容
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis 官方网址:[官方网址]
功能:
1.提供了对不同Redis客户端的整合(Lettuce和Jedis) 2.提供了RedisTemplate统一API来操作Redis 3.支持Redis的发布订阅模型 4.支持Redis哨兵和Redis集群 5.支持基于Lettuce的响应式编程 6.支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化 7.支持基于Redis的JDKCollection实现 8.SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
API | 返回值类型 | 说明 |
|---|---|---|
redisTemplate.opsForValue() | ValueOperations | 操作String类型数据 |
redisTemplate.opsForHash() | HashOperations | 操作Hash类型数据 |
redisTemplate.opsForList() | ListOperations | 操作List类型数据 |
redisTemplate.opsForSet() | SetOperations | 操作Set类型数据 |
redisTemplate.opsForZSet() | ZSetOperations | 操作SortedSet类型数据 |
redisTemplate | - | 通用的命令 |
SpringBoot已经提供了对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>spring:
redis:
host: IP地址
port: 端口号
password: 密码
lettuce:
pool:
max-active: 8 # 最大连接数
max-idle: 8 # 最大空闲连接
min-idle: 0 # 最小空闲连接
max-wait: 100ms # 连接等待时间@Autowired
private RedisTemplate redisTemplate;@Test
void stringTest(){
redisTemplate.opsForValue().set("name","Coolipa");
String name = (String) redisTemplate.opsForValue().get("name");
System.out.println(name);
}前言:
RedisTemplate可以接收任意类型的对象,并默认采用JDK序列化,转成字节形式进行储存,如\xAC\xED\x00\x05t\x00\x06\xE5\x8C\x97\xE4\xBA\xAC。
但也因为使用的是JDK序列化,导致可读性差、内存占用大的缺点。

因此,我们可以统一使用String序列化器,要求只能存储String类型的Key和Value。当需要存储Java对象时,手动完成对象的序列化和反序列化。这样不仅可以节省额外的内存开销,可读性也更高。
拓:为什么不适用JSON序列化器来处理value? 使用JSON序列化器虽然可以将Jaava对象自动序列化为JSON字符串。但会记录序列化对应的class名称,如
"@class": "com.sky.pojo.user",这样带来了额外的内存开销。
源码:
SpringDataRedis就提供了RedisTemplate的子类:StringRedisTemplate,它的key和value的序列化方式默认就是String方式。源码如下
public class StringRedisTemplate extends RedisTemplate<String, String> {
public StringRedisTemplate() {
this.setKeySerializer(RedisSerializer.string());
this.setValueSerializer(RedisSerializer.string());
this.setHashKeySerializer(RedisSerializer.string());
this.setHashValueSerializer(RedisSerializer.string());
}使用方法:
@Test
void stringTest() throws JsonProcessingException {
//创建对象
User user = new User("张三", 18);
//手动序列化
String json = mapper.writeValueAsString(user);
//写入数据
stringRedisTemplate.opsForValue().set("userdata", json);
//获取数据
String userdata = stringRedisTemplate.opsForValue().get("userdata");
//手动反序列化
User readValue = mapper.readValue(userdata, User.class);
System.out.println(readValue);
}本文为Redis学习笔记,持续更新中…
如果我的内容对你有帮助,希望可以收获你的点赞、评论、收藏。