Redis 是一个高性能的键值存储系统,支持多种数据结构。以下是 Redis 支持的 5 种基础数据类型及其在 Spring 中的应用:
1. String(字符串)
特点:
最基本的数据类型,二进制安全
最大能存储 512MB
可用于缓存整数值、字符串或序列化对象
Spring 操作示例:
// 设置值
redisTemplate.opsForValue().set("user:1:name", "张三");
redisTemplate.opsForValue().set("site:visits", "1000");
// 获取值
String userName = redisTemplate.opsForValue().get("user:1:name");
Long visits = Long.parseLong(redisTemplate.opsForValue().get("site:visits"));
// 原子性操作
redisTemplate.opsForValue().increment("site:visits"); // 自增1
redisTemplate.opsForValue().decrement("product:1:stock"); // 自减1
2. Hash(哈希)
特点:
适合存储对象
每个 hash 可以存储 2³² - 1 个键值对
比 String 类型更节省内存(针对对象存储)
Spring 操作示例:
// 存储对象
Map<String, String> userMap = new HashMap<>();
userMap.put("name", "李四");
userMap.put("age", "28");
userMap.put("email", "lisi@example.com");
redisTemplate.opsForHash().putAll("user:2", userMap);
// 获取单个字段
String name = (String) redisTemplate.opsForHash().get("user:2", "name");
// 获取所有字段
Map<Object, Object> entries = redisTemplate.opsForHash().entries("user:2");
// 修改单个字段
redisTemplate.opsForHash().put("user:2", "age", "29");
3. List(列表)
特点:
有序的字符串列表
按照插入顺序排序
适合做消息队列、最新消息排行等
Spring 操作示例:
// 从左侧插入
redisTemplate.opsForList().leftPush("news:latest", "新闻1");
redisTemplate.opsForList().leftPushAll("news:latest", "新闻2", "新闻3");
// 获取范围
List<String> latestNews = redisTemplate.opsForList().range("news:latest", 0, 9);
// 从右侧弹出
String news = redisTemplate.opsForList().rightPop("news:latest");
// 获取列表长度
Long size = redisTemplate.opsForList().size("news:latest");
4. Set(集合)
特点:
无序的字符串集合
元素唯一不重复
支持交集、并集、差集等操作
Spring 操作示例:
// 添加元素
redisTemplate.opsForSet().add("user:1:follows", "user2", "user3", "user4");
// 获取所有成员
Set<String> follows = redisTemplate.opsForSet().members("user:1:follows");
// 判断是否成员
boolean isMember = redisTemplate.opsForSet().isMember("user:1:follows", "user2");
// 集合运算
Set<String> commonFollows = redisTemplate.opsForSet().intersect("user:1:follows", "user:2:follows");
5. ZSet(有序集合)
特点:
有序且不重复的集合
每个元素关联一个double类型的分数(score)
适合做排行榜、带权重的队列
Spring 操作示例:
java
// 添加元素
redisTemplate.opsForZSet().add("leaderboard", "player1", 100);
redisTemplate.opsForZSet().add("leaderboard", "player2", 85);
// 获取排名
Set<String> topPlayers = redisTemplate.opsForZSet().reverseRange("leaderboard", 0, 9);
// 获取分数
Double score = redisTemplate.opsForZSet().score("leaderboard", "player1");
// 增加分数
redisTemplate.opsForZSet().incrementScore("leaderboard", "player1", 10);
Spring 中 Redis 的配置
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.activateDefaultTyping(mapper.getPolymorphicTypeValidator(),
ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper);
template.setValueSerializer(serializer);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
}
实际应用场景
String:缓存单个对象、计数器、分布式锁
Hash:存储对象属性、购物车
List:消息队列、最新列表
Set:标签系统、共同好友
ZSet:排行榜、延迟队列
选择合适的数据类型可以显著提高Redis的性能和内存使用效率。