《RedisTemplate 核心操作全解析》

RedisTemplate 是 Spring Data Redis 提供的核心类,用于操作 Redis 数据库。它封装了各种数据类型的操作,支持字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(ZSet)等结构。


RedisTemplate 常用接口分类

1. 通用操作(Key 相关)

方法 说明
Boolean hasKey(K key) 检查 key 是否存在
Boolean delete(K key) 删除 key
Boolean expire(K key, long timeout, TimeUnit unit) 设置 key 过期时间
Long getExpire(K key) 获取 key 剩余过期时间(秒)
Set<K> keys(K pattern) 按模式匹配 keys(如 user:*)
void rename(K oldKey, K newKey) 重命名 key

示例:

java

复制代码
redisTemplate.hasKey("user:1"); // 检查 key 是否存在
redisTemplate.expire("user:1", 10, TimeUnit.MINUTES); // 设置 10 分钟过期
redisTemplate.delete("user:1"); // 删除 key

2. 字符串(String)操作

方法 说明
ValueOperations<K, V> opsForValue() 获取字符串操作对象
void set(K key, V value) 存储字符串
V get(K key) 获取字符串
Long increment(K key, long delta) 自增(适用于数值)
Boolean setIfAbsent(K key, V value) 仅当 key 不存在时设置(类似 SETNX)
void multiSet(Map<? extends K, ? extends V> map) 批量存储

示例:

java

复制代码
ValueOperations<String, String> ops = redisTemplate.opsForValue();
ops.set("name", "Alice"); // 存储
String name = ops.get("name"); // 获取
ops.increment("counter", 1); // 自增

3. 哈希(Hash)操作

方法 说明
HashOperations<K, HK, HV> opsForHash() 获取哈希操作对象
void put(K key, HK hashKey, HV value) 存储哈希字段
HV get(K key, HK hashKey) 获取哈希字段
Map<HK, HV> entries(K key) 获取整个哈希表
Long delete(K key, Object... hashKeys) 删除哈希字段
Boolean hasKey(K key, Object hashKey) 检查哈希字段是否存在

示例:

java

复制代码
HashOperations<String, String, String> ops = redisTemplate.opsForHash();
ops.put("user:1", "name", "Bob"); // 存储
String name = ops.get("user:1", "name"); // 获取
Map<String, String> user = ops.entries("user:1"); // 获取整个哈希

4. 列表(List)操作

方法 说明
ListOperations<K, V> opsForList() 获取列表操作对象
Long leftPush(K key, V value) 左插入(LPUSH)
Long rightPush(K key, V value) 右插入(RPUSH)
V leftPop(K key) 左弹出(LPOP)
V rightPop(K key) 右弹出(RPOP)
List<V> range(K key, long start, long end) 获取列表范围(LRANGE)

示例:

java

复制代码
ListOperations<String, String> ops = redisTemplate.opsForList();
ops.leftPush("tasks", "task1"); // 左插入
String task = ops.leftPop("tasks"); // 左弹出
List<String> tasks = ops.range("tasks", 0, -1); // 获取全部

5. 集合(Set)操作

方法 说明
SetOperations<K, V> opsForSet() 获取集合操作对象
Long add(K key, V... values) 添加元素(SADD)
Set<V> members(K key) 获取所有元素(SMEMBERS)
Boolean isMember(K key, Object value) 判断元素是否存在(SISMEMBER)
Long remove(K key, Object... values) 删除元素(SREM)

示例:

java

复制代码
SetOperations<String, String> ops = redisTemplate.opsForSet();
ops.add("tags", "java", "redis"); // 添加元素
Set<String> tags = ops.members("tags"); // 获取所有元素
boolean exists = ops.isMember("tags", "java"); // 判断是否存在

6. 有序集合(ZSet)操作

方法 说明
ZSetOperations<K, V> opsForZSet() 获取有序集合操作对象
Boolean add(K key, V value, double score) 添加元素(ZADD)
Set<V> range(K key, long start, long end) 按索引范围获取(ZRANGE)
Set<V> rangeByScore(K key, double min, double max) 按分数范围获取
Long rank(K key, Object value) 获取元素排名(升序)
Long reverseRank(K key, Object value) 获取元素排名(降序)

示例:

java

复制代码
ZSetOperations<String, String> ops = redisTemplate.opsForZSet();
ops.add("leaderboard", "user1", 100); // 添加元素
Set<String> top3 = ops.range("leaderboard", 0, 2); // 获取前 3 名
Long rank = ops.rank("leaderboard", "user1"); // 获取排名

进阶用法

1. 事务支持

java

复制代码
redisTemplate.execute(new SessionCallback<>() {
    @Override
    public Object execute(RedisOperations operations) {
        operations.multi(); // 开启事务
        operations.opsForValue().set("a", "1");
        operations.opsForValue().set("b", "2");
        return operations.exec(); // 提交事务
    }
});

2. 发布/订阅(Pub/Sub)

java

复制代码
redisTemplate.convertAndSend("channel", "Hello Redis!"); // 发布消息

3. Lua 脚本执行

java

复制代码
DefaultRedisScript<Long> script = new DefaultRedisScript<>("return redis.call('get', KEYS[1])", Long.class);
Long result = redisTemplate.execute(script, Collections.singletonList("key"));

总结

数据类型 操作接口 示例
Key redisTemplate.hasKey() 检查 key 是否存在
String opsForValue() set(), get()
Hash opsForHash() put(), get(), entries()
List opsForList() leftPush(), range()
Set opsForSet() add(), members()
ZSet opsForZSet() add(), range()
相关推荐
霸道流氓气质21 分钟前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
captain3761 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
步行cgn2 小时前
Spring MVC + Thymeleaf 模板解析失败:从 500 错误到页面正常显示
java·spring·mvc
学到老活到老3 小时前
第 24 集:配置文件写了 80,Spring Boot 为什么读到 90?
java·后端·spring
Flynn Liang3 小时前
RAG 答非所问/幻觉怎么破?Spring AI QuestionAnswerAdvisor 召回优化实战(TopK/重排/混合检索)
人工智能·算法·spring·rag·幻觉·springai
IT规划师3 小时前
Redis 数据类型全解 - String 不只是 get set:90% 开发者忽略的 8 个高阶用法与内存陷阱(一)
redis·.net core
Flynn Liang4 小时前
内存/Redis/PGVector/Milvus/ES 怎么选?Spring AI VectorStore 抽象与向量库选型对照表
redis·elasticsearch·milvus·rag·springai·pgvector·向量库
二哈赛车手5 小时前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
ZWZhangYu5 小时前
从 Dify 实践理解大模型上下文缓存
java·后端·spring