📚 一、Redis简介与Spring Boot集成
Redis核心数据类型
Redis支持5种主要数据结构:
-
String:字符串,最基本的数据类型
-
Hash:哈希表,适合存储对象
-
List:列表,支持顺序操作
-
Set:无序集合,支持交并差运算
-
ZSet:有序集合,适合排行榜场景
Spring Boot集成配置
依赖配置(pom.xml):
XML
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
配置文件(application.yml):
XML
spring:
redis:
host: localhost
port: 6379
database: 0
timeout: 3000ms
lettuce:
pool:
max-active: 8
max-idle: 8
🔧 二、RedisTemplate配置与初始化
序列化配置类
java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 设置key序列化为String
template.setKeySerializer(new StringRedisSerializer());
// 设置value序列化为JSON
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
注入操作对象
java
@Service
public class RedisService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Autowired
private ValueOperations<String, Object> valueOps; // String操作
@Autowired
private HashOperations<String, String, Object> hashOps; // Hash操作
@Autowired
private ListOperations<String, Object> listOps; // List操作
@Autowired
private SetOperations<String, Object> setOps; // Set操作
@Autowired
private ZSetOperations<String, Object> zSetOps; // ZSet操作
}
📊 三、5种数据类型操作详解
1. String类型 - 基础键值存储
java
// 基本操作
valueOps.set("username", "张三"); // SET
valueOps.get("username"); // GET
valueOps.increment("counter"); // INCR
valueOps.set("token", "abc123", 30, TimeUnit.MINUTES); // 带过期时间
// 进阶操作
valueOps.setIfAbsent("lock", "locked"); // SETNX(分布式锁)
valueOps.getAndSet("key", "newValue"); // GETSET
2. Hash类型 - 对象存储
java
// 存储用户对象
Map<String, Object> user = new HashMap<>();
user.put("name", "张三");
user.put("age", 25);
user.put("email", "zhangsan@example.com");
hashOps.putAll("user:1001", user); // HMSET
// 操作字段
hashOps.get("user:1001", "name"); // HGET
hashOps.hasKey("user:1001", "age"); // HEXISTS
hashOps.keys("user:1001"); // HKEYS
hashOps.increment("user:1001", "age", 1); // HINCRBY
3. List类型 - 队列和栈
java
// 队列操作(左进右出)
listOps.leftPush("tasks", "task1"); // LPUSH
listOps.leftPushAll("tasks", "task2", "task3");
listOps.rightPop("tasks"); // RPOP
// 列表操作
listOps.range("messages", 0, 10); // LRANGE
listOps.index("messages", 0); // LINDEX
listOps.trim("messages", 0, 99); // LTRIM(保留最近100条)
4. Set类型 - 无序集合
java
// 标签系统示例
setOps.add("user:tags:1001", "java", "redis", "spring"); // SADD
setOps.members("user:tags:1001"); // SMEMBERS
// 集合运算
setOps.intersect("user:tags:1001", "user:tags:1002"); // SINTER(交集)
setOps.union("tag:java:users", "tag:redis:users"); // SUNION(并集)
setOps.isMember("user:tags:1001", "java"); // SISMEMBER
5. ZSet类型 - 有序集合(排行榜)
java
// 游戏排行榜
zSetOps.add("leaderboard", "player1", 1000); // ZADD
zSetOps.add("leaderboard", "player2", 2000);
zSetOps.incrementScore("leaderboard", "player1", 500); // ZINCRBY
// 查询操作
zSetOps.reverseRange("leaderboard", 0, 9); // ZREVRANGE(前10名)
zSetOps.rank("leaderboard", "player1"); // ZRANK(排名)
zSetOps.score("leaderboard", "player1"); // ZSCORE(分数)
zSetOps.count("leaderboard", 1000, 3000); // ZCOUNT(分数区间统计)
⚡ 四、高级特性与实战应用
事务支持
java
redisTemplate.execute(new SessionCallback<List<Object>>() {
@Override
public List<Object> execute(RedisOperations operations) throws DataAccessException {
operations.multi(); // 开启事务
operations.opsForValue().set("key1", "value1");
operations.opsForValue().increment("counter");
return operations.exec(); // 执行事务
}
});
管道技术(批量操作)
java
List<Object> results = redisTemplate.executePipelined(new SessionCallback<Object>() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
for (int i = 0; i < 1000; i++) {
operations.opsForValue().set("key:" + i, "value:" + i);
}
return null;
}
});