SpringDataRedis 操作 redis

📅 发布时间:2026/9/3 7:37:52
SpringDataRedis 操作 redis Spring Data Redis 完全按照 Redis 的数据类型做了模块化封装和原生命令一一对应。下面我按「通用Key操作 5大核心数据类型」分类整理每个方法都标注等价的 Redis 原生命令和可直接运行的代码示例方便你对照记忆。一、通用 Key 操作所有数据类型通用这部分是所有数据类型共用的基础操作直接通过redisTemplate调用不需要先获取 ops 操作器。Java 方法功能说明等价 Redis 原生命令代码示例hasKey(key)判断 key 是否存在EXISTS keyredisTemplate.hasKey(demo:name)delete(key)删除指定 keyDEL keyredisTemplate.delete(demo:name)expire(key, 时间, 单位)给 key 设置过期时间EXPIRE key 秒数redisTemplate.expire(demo:name, 60, TimeUnit.SECONDS)getExpire(key)获取 key 剩余过期时间秒TTL keyredisTemplate.getExpire(demo:name)persist(key)移除 key 的过期时间永久保存PERSIST keyredisTemplate.persist(demo:name)rename(oldKey, newKey)修改 key 名称RENAME oldKey newKeyredisTemplate.rename(demo:name, demo:username)type(key)返回 key 存储的数据类型TYPE keyredisTemplate.type(demo:name)二、字符串类型 String →opsForValue()对应 Redis 最基础的 String 类型支持普通字符串、数字、序列化对象存储是开发中最常用的类型。操作入口redisTemplate.opsForValue()Java 方法功能说明等价 Redis 原生命令代码示例set(key, value)普通存入键值对SET key valueops.set(demo:name, 张三)set(key, value, 时间, 单位)存入并设置过期时间SET key value EX 秒数/SETEXops.set(demo:name, 张三, 60, TimeUnit.SECONDS)setIfAbsent(key, value)key 不存在时才存入分布式锁核心SETNX key valueops.setIfAbsent(lock:order, 1, 30, TimeUnit.SECONDS)setIfPresent(key, value)key 存在时才存入SET key value XXops.setIfPresent(demo:name, 李四)get(key)获取 key 对应的值【key 不存在 → 返回 null】GET keyops.get(demo:name)getAndSet(key, value)获取旧值并设置新值GETSET key valueops.getAndSet(demo:name, 王五)increment(key, 步长)数值原子递增用于计数INCRBY key 步长ops.increment(demo:viewCount, 1)decrement(key, 步长)数值原子递减DECRBY key 步长ops.decrement(demo:stock, 1)multiSet(Map)批量设置多个键值对MSETops.multiSet(Map.of(k1,v1,k2,v2))multiGet(Collection)批量获取多个 key 的值MGETops.multiGet(List.of(k1, k2))小提示increment是原子操作非常适合做点赞数、浏览量、库存扣减等计数场景。三、哈希类型 Hash →opsForHash()对应 Redis Hash 类型类似 Java 的 Map适合存储对象的字段属性不用序列化整个对象可单独修改单个字段。操作入口redisTemplate.opsForHash()Java 方法功能说明等价 Redis 原生命令代码示例put(key, field, value)存入单个字段HSET key field valueops.put(demo:user, name, 张三)putAll(key, Map)批量存入多个字段HMSET key field1 value1...ops.putAll(demo:user, Map.of(age,20,gender,男))get(key, field)获取单个字段的值HGET key fieldops.get(demo:user, name)entries(key)获取所有字段和值HGETALL keyops.entries(demo:user)keys(key)获取所有字段名HKEYS keyops.keys(demo:user)values(key)获取所有字段值HVALS keyops.values(demo:user)delete(key, fields...)删除指定字段HDEL key field1 field2ops.delete(demo:user, age, gender)hasKey(key, field)判断字段是否存在HEXISTS key fieldops.hasKey(demo:user, name)increment(key, field, 步长)指定字段数值递增HINCRBY key field 步长ops.increment(demo:user, score, 5)size(key)获取字段数量HLEN keyops.size(demo:user)四、列表类型 List →opsForList()对应 Redis List 类型有序、可重复支持两端插入弹出适合实现简单队列、栈、最新列表等场景。操作入口redisTemplate.opsForList()Java 方法功能说明等价 Redis 原生命令代码示例leftPush(key, value)从列表左侧头部插入元素LPUSH key valueops.leftPush(demo:msgList, 消息1)rightPush(key, value)从列表右侧尾部插入元素RPUSH key valueops.rightPush(demo:msgList, 消息2)leftPop(key)从左侧弹出一个元素LPOP keyops.leftPop(demo:msgList)rightPop(key)从右侧弹出一个元素RPOP keyops.rightPop(demo:msgList)range(key, start, end)按索引范围获取元素0到-1是全部LRANGE key start endops.range(demo:msgList, 0, -1)size(key)获取列表长度LLEN keyops.size(demo:msgList)index(key, index)获取指定索引位置的元素LINDEX key indexops.index(demo:msgList, 0)remove(key, count, value)删除指定个数的匹配元素LREM key count valueops.remove(demo:msgList, 1, 消息1)trim(key, start, end)截取列表保留指定范围LTRIM key start endops.trim(demo:msgList, 0, 9)常用场景左进右出 队列先进先出左进左出 栈先进后出trim常用来保留最新的N条记录。五、集合类型 Set →opsForSet()对应 Redis Set 类型无序、不可重复支持交集、并集、差集运算适合去重、标签、共同好友等场景。操作入口redisTemplate.opsForSet()Java 方法功能说明等价 Redis 原生命令代码示例add(key, values...)添加一个或多个元素SADD key v1 v2ops.add(demo:tags, Java, Spring, Redis)remove(key, values...)删除一个或多个元素SREM key v1 v2ops.remove(demo:tags, Redis)isMember(key, value)判断元素是否在集合中SISMEMBER key valueops.isMember(demo:tags, Java)members(key)获取集合中所有元素SMEMBERS keyops.members(demo:tags)size(key)获取集合元素个数SCARD keyops.size(demo:tags)intersect(key1, key2)两个集合的交集SINTER key1 key2ops.intersect(user1:tags, user2:tags)union(key1, key2)两个集合的并集SUNION key1 key2ops.union(user1:tags, user2:tags)difference(key1, key2)两个集合的差集SDIFF key1 key2ops.difference(user1:tags, user2:tags)randomMember(key)随机获取一个元素SRANDMEMBER keyops.randomMember(demo:tags)六、有序集合类型 ZSet →opsForZSet()对应 Redis ZSet 类型不可重复、每个元素带一个分数score按分数自动排序是实现排行榜、热度排名的首选。操作入口redisTemplate.opsForZSet()Java 方法功能说明等价 Redis 原生命令代码示例add(key, value, score)添加元素分数ZADD key score valueops.add(demo:rank, 张三, 95)remove(key, values...)删除元素ZREM key v1 v2ops.remove(demo:rank, 张三)range(key, start, end)按索引升序获取元素ZRANGE key start endops.range(demo:rank, 0, -1)reverseRange(key, start, end)按索引降序获取元素ZREVRANGE key start endops.reverseRange(demo:rank, 0, 9)rangeByScore(key, min, max)按分数范围升序获取ZRANGEBYSCORE key min maxops.rangeByScore(demo:rank, 60, 100)rank(key, value)获取元素升序排名从0开始ZRANK key valueops.rank(demo:rank, 张三)reverseRank(key, value)获取元素降序排名ZREVRANK key valueops.reverseRank(demo:rank, 张三)incrementScore(key, value, delta)增加元素的分数ZINCRBY key delta valueops.incrementScore(demo:rank, 张三, 5)size(key)获取集合元素个数ZCARD keyops.size(demo:rank)开发必知注意点序列化问题你代码中用的RedisTemplateString, Object默认是 JDK 序列化存入 Redis 后是二进制乱码可读性很差。实际开发中建议配置 Jackson JSON 序列化器把对象存成 JSON 格式兼顾可读性和自动转换。StringRedisTemplate如果只操作字符串优先用StringRedisTemplate它默认就是字符串序列化不需要额外配置是业务开发中更常用的版本。命名规范推荐用业务模块:功能:id的冒号分隔命名比如user:info:1001在 Redis 可视化工具中会自动分层显示结构更清晰。