Redis
Redis 是一个开源的内存数据结构存储,常用于缓存、消息队列、分布式锁等场景。
数据类型
| 类型 | 命令示例 | 用途 |
|---|---|---|
| String | SET/GET | 缓存、计数器 |
| Hash | HSET/HGET | 对象存储 |
| List | LPUSH/RPOP | 消息队列 |
| Set | SADD/SMEMBERS | 标签、好友关系 |
| ZSet | ZADD/ZRANGE | 排行榜 |
常用命令
String
bash
SET key value # 设置值
GET key # 获取值
SETEX key 3600 value # 设置值并指定过期时间(秒)
SETNX key value # 不存在则设置(分布式锁)
INCR counter # 原子递增
DECR counter # 原子递减
MSET k1 v1 k2 v2 # 批量设置
MGET k1 k2 # 批量获取Hash
bash
HSET user:1 name "张三" age 25 # 设置 Hash 字段
HGET user:1 name # 获取单个字段
HGETALL user:1 # 获取所有字段
HMGET user:1 name age # 批量获取字段
HINCRBY user:1 age 1 # 字段递增
HDEL user:1 age # 删除字段
HEXISTS user:1 name # 检查字段是否存在List
bash
LPUSH list a b c # 左侧插入
RPUSH list d e # 右侧插入
LPOP list # 左侧弹出
RPOP list # 右侧弹出
LRANGE list 0 -1 # 获取所有元素
LLEN list # 获取长度
LINDEX list 0 # 按索引获取Set
bash
SADD tags java spring # 添加成员
SMEMBERS tags # 获取所有成员
SISMEMBER tags java # 检查是否存在
SREM tags java # 移除成员
SCARD tags # 获取成员数量
SINTER set1 set2 # 交集
SUNION set1 set2 # 并集
SDIFF set1 set2 # 差集ZSet
bash
ZADD leaderboard 100 "user1" # 添加成员及分数
ZINCRBY leaderboard 10 "user1" # 增加分数
ZRANGE leaderboard 0 9 WITHSCORES # 按分数升序
ZREVRANGE leaderboard 0 9 WITHSCORES # 按分数降序
ZRANK leaderboard "user1" # 获取排名(升序)
ZSCORE leaderboard "user1" # 获取分数Java 客户端
RedisTemplate
java
@Autowired
private RedisTemplate<String, Object> redisTemplate;
// String 操作
redisTemplate.opsForValue().set("key", "value");
String value = (String) redisTemplate.opsForValue().get("key");
// Hash 操作
redisTemplate.opsForHash().put("user:1", "name", "张三");
redisTemplate.opsForHash().get("user:1", "name");
Map<Object, Object> map = redisTemplate.opsForHash().entries("user:1");
// List 操作
redisTemplate.opsForList().leftPush("list", "a");
redisTemplate.opsForList().rightPop("list");
// Set 操作
redisTemplate.opsForSet().add("tags", "java", "spring");
Set<Object> members = redisTemplate.opsForSet().members("tags");
// ZSet 操作
redisTemplate.opsForZSet().add("leaderboard", "user1", 100);
redisTemplate.opsForZSet().reverseRangeWithScores("leaderboard", 0, 9);序列化配置
java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(
RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// JSON 序列化
Jackson2JsonRedisSerializer<Object> serializer =
new Jackson2JsonRedisSerializer<>(Object.class);
template.setValueSerializer(serializer);
template.setHashValueSerializer(serializer);
// String 序列化
StringRedisSerializer stringSerializer =
new StringRedisSerializer();
template.setKeySerializer(stringSerializer);
template.setHashKeySerializer(stringSerializer);
return template;
}
}应用场景
缓存
java
public User getUser(Long id) {
String key = "user:" + id;
User user = (User) redisTemplate.opsForValue().get(key);
if (user == null) {
user = userRepository.findById(id);
redisTemplate.opsForValue().set(key, user, 30, TimeUnit.MINUTES);
}
return user;
}分布式锁
java
public boolean lock(String key, String value, long expireTime) {
return Boolean.TRUE.equals(
redisTemplate.opsForValue().setIfAbsent(key, value,
expireTime, TimeUnit.SECONDS));
}
public void unlock(String key, String value) {
String currentValue = (String) redisTemplate.opsForValue().get(key);
if (value.equals(currentValue)) {
redisTemplate.delete(key);
}
}限流
java
public boolean rateLimit(String key, int maxAttempts, long windowSeconds) {
String countKey = "rate:" + key;
Long count = redisTemplate.opsForValue().increment(countKey);
if (count != null && count == 1) {
redisTemplate.expire(countKey, windowSeconds, TimeUnit.SECONDS);
}
return count != null && count <= maxAttempts;
}总结
- 数据类型:String、Hash、List、Set、ZSet
- 应用场景:缓存、分布式锁、限流、计数器
- Java 客户端:RedisTemplate
- 序列化:Jackson2JsonRedisSerializer
