Redis的接入和使用
Redis
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置服务器
spring:
data:
redis:
host: r-xxxx.redis.rds.aliyuncs.com #Redis的Host
port: 6379 # Redis服务器连接端口
password: xxxx # Redis服务器连接密码(默认为空)
代码解析
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {NfTurboApplication.class})
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testRedisConnect() {
redisTemplate.opsForValue().set("test", "test");
Assert.assertTrue(redisTemplate.opsForValue().get("test").equals("test"));
if (redisTemplate.opsForValue().get("test").equals("test")) {
System.out.println("redis connect success");
}
}
}
使用@Autowired
引入RedisTemplate
来使用Redis,RedisTemplate
是 Spring Data Redis 提供的一个用于操作 Redis 数据库的核心类,它封装了 Redis 客户端的操作细节,为开发者提供了一套简单、统一且面向对象的 API,方便在 Spring 应用中使用 Redis。
操作字符串(String)
@Service
public class RedisStringService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public void setValue(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
public Object getValue(String key) {
return redisTemplate.opsForValue().get(key);
}
}
操作哈希值
@Service
public class RedisHashService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
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);
}
}
操作列表(List)
@Service
public class RedisListService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public void leftPush(String key, Object value) {
redisTemplate.opsForList().leftPush(key, value);
}
public List<Object> range(String key, long start, long end) {
return redisTemplate.opsForList().range(key, start, end);
}
}
Redis数据的序列化问题
序列化问题
RedisTemplate
默认使用 JDK 序列化器,这会导致存储在 Redis 中的数据以二进制形式存在,不易阅读和调试。因此,通常会根据实际需求选择合适的序列化器。
String 序列化
将对象转换为字符串进行存储,通常用于存储简单的字符串数据。在 Spring Data Redis 中,可以使用 StringRedisSerializer
。
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, String> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 设置键和值的序列化器为 String 序列化器
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
template.setValueSerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(stringRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
- 优点:简单高效,序列化和反序列化的性能非常高;存储的字符串数据易于阅读和调试。
- 缺点:只能处理字符串类型的数据,对于复杂对象需要手动进行转换。
JDK 序列化
JDK 自带的序列化机制,通过实现 java.io.Serializable
接口,将对象转换为字节流。
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 设置键的序列化器
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
// 设置值的序列化器为 JDK 序列化器
JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
template.setValueSerializer(jdkSerializationRedisSerializer);
template.setHashValueSerializer(jdkSerializationRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
- 优点:使用简单,无需额外依赖,只要对象实现
Serializable
接口即可。 - 缺点:序列化后的字节数据较大,会占用较多的 Redis 内存空间;序列化和反序列化的性能相对较低;存储的字节数据不易阅读和调试。
JSON 序列化
将对象转换为 JSON 字符串,常用的 JSON 序列化库有 Jackson、Gson 等。在 Spring Data Redis 中,可以使用 GenericJackson2JsonRedisSerializer
进行 JSON 序列化。
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 设置键的序列化器
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
// 设置值的序列化器为 JSON 序列化器
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
template.setValueSerializer(jsonRedisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
- 优点:序列化后的 JSON 数据可读性强,便于调试和查看;序列化和反序列化的性能较好;可以跨语言使用。
- 缺点:JSON 格式会增加一些额外的字符,如引号、逗号等,导致数据量相对较大;对于复杂对象的序列化可能会存在一些问题,如丢失对象的类型信息。
序列化器的选择
- 简单字符串数据:如果存储的数据只是简单的字符串,建议使用
StringRedisSerializer
,性能高且易于处理。 - 复杂对象数据:如果需要存储 Java 对象等复杂数据,建议使用
GenericJackson2JsonRedisSerializer
,它可以将对象序列化为 JSON 格式,可读性好且性能不错。 - 对性能要求极高且对象结构简单:如果对性能要求极高,且对象结构简单,可以考虑使用 JDK 序列化,但要注意其占用空间较大的问题。