Skip to content

Redis

Redis 是一个开源的内存数据结构存储,常用于缓存、消息队列、分布式锁等场景。

数据类型

类型命令示例用途
StringSET/GET缓存、计数器
HashHSET/HGET对象存储
ListLPUSH/RPOP消息队列
SetSADD/SMEMBERS标签、好友关系
ZSetZADD/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;
}

总结

  1. 数据类型:String、Hash、List、Set、ZSet
  2. 应用场景:缓存、分布式锁、限流、计数器
  3. Java 客户端:RedisTemplate
  4. 序列化:Jackson2JsonRedisSerializer

基于 VitePress 构建