目录
[1.1 什么是Jedis?](#1.1 什么是Jedis?)
[1.2 Jedis的使用](#1.2 Jedis的使用)
[2.1 SpringDataRedis介绍](#2.1 SpringDataRedis介绍)
[2.2 StringRedisTemplate](#2.2 StringRedisTemplate)
一、Jedis
1.1 什么是Jedis?
Jedis 是一款老牌且极其广受欢迎的 Redis 的 Java 客户端。它最大的特点就是API 设计非常直白,几乎与原生的 Redis 命令一一对应。这种设计让熟悉 Redis 命令的开发者能够零成本上手。

Jedis官网:https://github.com/redis/jedis
1.2 Jedis的使用
步骤如下:
1.引入依赖(Maven)
首先需要在项目中引入 Jedis 的依赖,参考如下表格,根据对应的Java版本选择合适的Jedis版本:

XML
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.3.1</version>
</dependency>
2.基础连接:最简单的连接方式是直接实例化 Jedis 对象,但这每次都会创建和销毁 TCP 连接,性能极差。不推荐在生产环境中使用。
java
// 1. 创建 Jedis 对象,连接本地的 6379 端口
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 2. 如果 Redis 设置了密码,需要进行认证
// jedis.auth("your_password");
// 3. 测试连通性
System.out.println(jedis.ping()); // 输出 PONG
// 4. 关闭连接
jedis.close();
3.JedisPool连接,Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式。
java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static {
//配置连接池
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(8);
jedisPoolConfig.setMaxIdle(8);
jedisPoolConfig.setMinIdle(0);
jedisPoolConfig.setMaxWaitMillis(1000);
//创建连接池
jedisPool = new JedisPool(jedisPoolConfig, "192.168.214.128",
6379, 1000, "123321", 0);
}
public static Jedis getJedis() {
return jedisPool.getResource();
}
}
二、SpringDataRedis
2.1 SpringDataRedis介绍
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

使用步骤:
1.引入依赖
XML
<!-- Spring Data Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Lettuce 连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2.配置文件
XML
spring:
data:
redis:
host: 127.0.0.1
port: 6379
password: yourpassword # 没有则留空
database: 0
lettuce:
pool:
max-active: 8 # 连接池最大连接数
max-idle: 8 # 连接池中的最大空闲连接
min-idle: 0 # 连接池中的最小空闲连接
3.测试,执行完毕上述操作后,RedisTemplate就可以使用@Autowired注解自动注入到IOC容器当中。
java
@SpringBootTest
class SpringdataredisDemoApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void testString() {
redisTemplate.opsForValue().set("name","张三");
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
}
输出结果:

RedisTemplate可以接收任意Object作为值写入Redis,但是默认的 JDK 序列化会导致 Redis 中的 Key 变成类似
\xac\xed\x00\x05t\x00\x04user的乱码。
因此我们可以自定义序列化方法:
java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
redisTemplate.setValueSerializer(RedisSerializer.json());
redisTemplate.setHashValueSerializer(RedisSerializer.json());
return redisTemplate;
}
}
此时再进行存入操作:
java
@SpringBootTest
class SpringdataredisDemoApplicationTests {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Test
void testString() {
redisTemplate.opsForValue().set("name","张三");
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
@Test
void testObject() {
redisTemplate.opsForValue().set("user:100",new User("李四",21));
User user = (User) redisTemplate.opsForValue().get("user:100");
System.out.println("user = " + user);
}
}
存入的数据展示:

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

我们可以通过手动序列化和手动反序列化来实现写入对象和读取字符串转对象。Spring提供了StringRedisTemplate它要求key和value都是String类型。
java
@Autowired
private StringRedisTemplate stringRedisTemplate;
//Json工具
private static final ObjectMapper mapper = new ObjectMapper();
@Test
void testStringTemplate(){
User user = new User("王五",22);
//转为json
String json = mapper.writeValueAsString(user);
//存储到redis
stringRedisTemplate.opsForValue().set("user:100",json);
//获取
String val = stringRedisTemplate.opsForValue().get("user:100");
//转为User对象
User user1 = mapper.readValue(val, User.class);
System.out.println("user1 = " + user1);
}
存入的展示:

