在Java开发中,Redis是一种广泛使用的快速、键值存储数据库,用于缓存、消息队列等。Java开发者通常会选择Jedis、Lettuce或Redisson作为Redis客户端。本文将详细探讨这三种客户端的特性、核心原理,并展示如何在Spring Boot项目中使用它们。
Jedis通过直接与Redis服务器建立Socket连接,并发送标准的Redis命令来实现其功能。它使用阻塞I/O,每个Jedis实例对应一个物理连接。
Lettuce使用Netty框架实现非阻塞I/O,可以在多个线程间共享单个连接实例。它通过发布/订阅模式来支持异步和事件驱动的编程。
Redisson在Lettuce的基础上进一步抽象,提供了丰富的分布式Java数据结构,如RemoteService和分布式锁等。它使用Netty进行网络通信,并实现了高级的序列化和反序列化机制。
依赖配置:
xml<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
连接配置:在application.properties
中配置Redis服务器的地址和端口。
yamlspring:
data:
# redis配置
redis:
# Redis数据库索引(默认为0)
database: 0
# Redis服务器地址
host: 127.0.0.0
# Redis服务器连接端口
port: 26379
# Redis服务器连接密码(默认为空)
password: wzw2391
# 查询超时时间
timeout: 10s
# 连接超时时间
connect-timeout: 10s
jedis:
pool:
# 连接池最大连接数
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 0
序列化配置:
java@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// Json序列化配置
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(objectMapper, Object.class);
// 设置value的序列化规则和 key的序列化规则
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
使用示例
javaimport org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.data.redis.core.RedisTemplate;
@Service
public class RedisService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
// String
public void setStringValue(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}
public String getStringValue(String key) {
return (String) redisTemplate.opsForValue().get(key);
}
// Hash
public void setHashValue(String key, String hashKey, Object value) {
redisTemplate.opsForHash().put(key, hashKey, value);
}
public Object getHashValue(String key, String hashKey) {
return redisTemplate.opsForHash().get(key, hashKey);
}
public Map<Object, Object> getHashAll(String key) {
return redisTemplate.opsForHash().entries(key);
}
}
xml<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
yamlspring:
data:
# redis配置
redis:
# Redis数据库索引(默认为0)
database: 0
# Redis服务器地址
host: 127.0.0.0
# Redis服务器连接端口
port: 26379
# Redis服务器连接密码(默认为空)
password: wzw2391
# 查询超时时间
timeout: 10s
# 连接超时时间
connect-timeout: 10s
lettuce:
pool:
# 连接池最大连接数
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 0
java@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
// Json序列化配置
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(objectMapper, Object.class);
// 设置value的序列化规则和 key的序列化规则
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
xml <dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
java @Bean
public RedissonClient redisson(RedisProperties redisProperties) {
// 配置Redisson
Config config = new Config();
SingleServerConfig singleServerConfig = config
.useSingleServer()
.setDatabase(redisProperties.getDatabase())
.setAddress("redis://" + redisProperties.getHost() + ":" + redisProperties.getPort());
if (StrUtil.isNotBlank(redisProperties.getPassword())) {
singleServerConfig.setPassword(redisProperties.getPassword());
}
// 使用json序列化方式
Codec codec = new JsonJacksonCodec();
config.setCodec(codec);
return Redisson.create(config);
}
javaimport org.redisson.api.RMap;
import org.redisson.api.RList;
import org.redisson.api.RTopic;
import org.redisson.api.listener.MessageListener;
RMap<String, String> map = redisson.getMap("myMap");
map.put("key", "value");
String value = map.get("key");
RList<String> list = redisson.getList("myList");
list.add("value1");
list.add("value2");
RTopic topic = redisson.getTopic("myTopic");
topic.addListener(String.class, new MessageListener<String>() {
@Override
public void onMessage(CharSequence channel, String msg) {
System.out.println("received message: " + msg);
}
});
// 发送消息
topic.publish("Hello, Redisson!");
javaimport org.redisson.api.RLock;
// ...
RLock lock = redisson.getLock("myLock");
lock.lock();
try {
// 执行临界区代码
} finally {
lock.unlock();
}
选择哪种客户端取决于您的具体需求:Jedis适合轻量级和简单场景;Lettuce适合高并发和复杂场景;Redisson适合需要丰富分布式特性的场景。在Spring Boot中,这些客户端的集成和使用都非常简单高效。希望本文能帮助您选择合适的Redis客户端,并在您的Java应用中高效地使用Redis。