【Redis】Spring使用Redis
Spring使用Redis
·
一、创建项目引入依赖
在创建项目的时候,将NoSQL下的redis勾选即可。

在配置文件中配置 redis 服务地址:
这里是因为我配置了隧道的。
spring:
data:
redis:
host: 127.0.0.1
port: 6379
二、创建controller
StringRedisTemplate 是 Spring Data Redis 提供的一个 专门用于操作字符串类型数据 的 Redis 模板类。它是 RedisTemplate 的一个特化版本,默认使用 String 序列化器 来处理 key 和 value。
package com.example.springredisdemo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
}
三、使用String
Spring将Redis中的数据类型封装了一个对应的类,要想使用就要创建对应对象。
| 代码片段 | 对应 Redis 结构 | 一句话功能说明 |
|---|---|---|
opsForValue() → ValueOperations<String,String> |
字符串(String) | 最常用,存取普通字符串、数字、布尔、JSON 等。 |
opsForCluster() → ClusterOperations<String,String> |
集群运维 | 拿到集群拓扑、节点信息、重新分片等高级操作,日常业务基本用不到。 |
opsForGeo() → GeoOperations<String,String> |
地理坐标(Geo) | 存经纬度、算两地距离、附近的人/店等 LBS 场景。 |
opsForHash() → HashOperations<String,HK,HV> |
哈希表(Hash) | 存对象字段,等同 HSET/HGET,适合存储 Map<String,String>。 |
opsForList() → ListOperations<String,String> |
列表(List) | 左/右推弹、阻塞队列、消息流;LPUSH/RPOP/BPOP 等。 |
opsForHyperLogLog() → HyperLogLogOperations<String,String> |
HyperLogLog | 极小空间做 去重计数(UV、DAU),误差 0.81%。 |
opsForSet() → SetOperations<String,String> |
集合(Set) | 无序唯一元素,支持交并差集,点赞、抽奖、共同好友。 |
opsForStream() → StreamOperations<String,HK,HV> |
流(Stream) | Redis 5.0 的 消息队列,消费者组、ACK、ID 范围查询。 |
opsForZSet() → ZSetOperations<String,String> |
有序集合(Sorted Set) | 带分数排序,排行榜、延迟队列、滑动窗口限流。 |

我们使用每个类的对应方法来操作Redis。
| Java 方法(返回值) | Redis 命令 | 功能一句话 |
|---|---|---|
String get(K key) |
GET key | 读取字符串,不存在返回 null。 |
void set(K key, V value) |
SET key value | 无条件设值,覆盖旧值。 |
Boolean setIfAbsent(K key, V value) |
SET key value NX | 仅当 key 不存在 时才设值,常用于分布式锁。 |
Boolean setIfPresent(K key, V value) |
SET key value XX | 仅当 key 已存在 时才更新。 |
void set(K key, V value, long timeout, TimeUnit unit) |
SET key value EX seconds | 设值并指定过期时间。 |
Boolean setIfAbsent(K key, V value, long timeout, TimeUnit unit) |
SET key value NX EX seconds | 原子地“不存在则设值 + 过期”,锁标准用法。 |
String getAndSet(K key, V newValue) |
GETSET key newValue | 返回旧值并设置新值。 |
List<String> multiGet(Collection<K> keys) |
MGET key1 key2 … | 批量读取,顺序与 keys 一致。 |
void multiSet(Map<? extends K, ? extends V> map) |
MSET k1 v1 k2 v2 … | 一次性批量设多个值,原子。 |
Boolean multiSetIfAbsent(Map<? extends K, ? extends V> map) |
MSETNX k1 v1 k2 v2 … | 仅当所有 key 都不存在 时才批量设值。 |
Long increment(K key) |
INCR key | 值 +1,返回新值。 |
Long increment(K key, long delta) |
INCRBY key delta | 指定步长整数加法。 |
Double increment(K key, double delta) |
INCRBYFLOAT key delta | 浮点加法。 |
Long decrement(K key) |
DECR key | 值 -1。 |
Long decrement(K key, long delta) |
DECRBY key delta | 指定步长整数减法。 |
Integer append(K key, String value) |
APPEND key value | 在尾部追加,返回最终字节长度。 |
Long size(K key) |
STRLEN key | 返回字符串字节长度。 |
String get(K key, long start, long end) |
GETRANGE key start end | 取子串(闭区间,负下标代表末尾)。 |
void set(K key, V value, long offset) |
SETRANGE key offset value | 从偏移量开始覆盖原字符串。 |
Boolean setBit(K key, long offset, boolean value) |
SETBIT key offset 0/1 | 设置/清除某一位。 |
Boolean getBit(K key, long offset) |
GETBIT key offset | 获取某一位的值。 |
示例代码:
@RequestMapping("/testString")
private void testString() {
stringRedisTemplate.opsForValue().set("key1","111");
String value = stringRedisTemplate.opsForValue().get("key1");
System.out.println(value);
stringRedisTemplate.delete("key1");
}
结果:
四、使用List
| 方法(含返回值) | Redis 命令 | 功能 |
|---|---|---|
Long leftPush(String key, String value) |
LPUSH key value | 左头插 1 个元素,返回最新长度。 |
Long leftPushAll(String key, String... values) |
LPUSH key v1 v2 … | 批量左头插。 |
Long leftPushAll(String key, Collection<String> values) |
LPUSH key v1 v2 … | Collection 重载。 |
Long leftPushIfPresent(String key, String value) |
LPUSHX key value | key 存在才左头插。 |
Long rightPush(String key, String value) |
RPUSH key value | 右尾插 1 个元素。 |
Long rightPushAll(String key, String... values) |
RPUSH key v1 v2 … | 批量右尾插。 |
Long rightPushAll(String key, Collection<String> values) |
RPUSH key v1 v2 … | Collection 重载。 |
Long rightPushIfPresent(String key, String value) |
RPUSHX key value | key 存在才右尾插。 |
String leftPop(String key) |
LPOP key | 左头弹 1 个元素,空返回 null。 |
String rightPop(String key) |
RPOP key | 右尾弹 1 个元素。 |
String leftPop(String key, long timeout, TimeUnit unit) |
BLPOP key timeout | 阻塞左头弹,超时返回 null。 |
String rightPop(String key, long timeout, TimeUnit unit) |
BRPOP key timeout | 阻塞右尾弹。 |
String rightPopAndLeftPush(String sourceKey, String destinationKey) |
RPOPLPUSH src dest | 原子地:源列表右尾弹 → 目标列表左头插。 |
String rightPopAndLeftPush(String sourceKey, String destinationKey, long timeout, TimeUnit unit) |
BRPOPLPUSH src dest timeout | 带阻塞版上面方法。 |
Long size(String key) |
LLEN key | 列表长度。 |
List<String> range(String key, long start, long end) |
LRANGE key start end | 取闭区间 [start,end] 元素,负下标倒数。 |
void trim(String key, long start, long end) |
LTRIM key start end | 只保留区间元素,其余删除,定长队列常用。 |
void set(String key, long index, String value) |
LSET key index value | 按下标覆盖元素。 |
String index(String key, long index) |
LINDEX key index | 按下标读取单个元素。 |
Long remove(String key, long count, String value) |
LREM key count value | 删除与 value 相等的元素;count>0 从左删 count 个,<0 从右删,=0 删全部。 |
示例代码:
@RequestMapping("/testList")
private void testList() {
stringRedisTemplate.opsForList().leftPush("key","111");
stringRedisTemplate.opsForList().leftPushAll("key","222","333","444");
List<String> key = stringRedisTemplate.opsForList().range("key", 0, -1);
System.out.println(key);
stringRedisTemplate.delete("key");
}
结果:
五、使⽤ Hash
| 方法(含返回值) | Redis 命令 | 功能 |
|---|---|---|
Boolean hasKey(String key, Object hashKey) |
HEXISTS key field | 判断 hash 字段是否存在。 |
Long size(String key) |
HLEN key | 获取 hash 字段个数。 |
void put(String key, String hashKey, String value) |
HSET key field value | 设置单个字段值。 |
Boolean putIfAbsent(String key, String hashKey, String value) |
HSETNX key field value | 仅当字段不存在时才设置。 |
void putAll(String key, Map<? extends String, ? extends String> map) |
HMSET key field1 value1 … | 批量设置字段。 |
String get(String key, Object hashKey) |
HGET key field | 获取单个字段值。 |
List<String> multiGet(String key, Collection<String> hashKeys) |
HMGET key field1 field2 … | 批量获取字段值,缺失字段对应 null。 |
Map<String, String> entries(String key) |
HGETALL key | 获取整个 hash 所有字段和值。 |
Set<String> keys(String key) |
HKEYS key | 获取所有字段名。 |
List<String> values(String key) |
HVALS key | 获取所有字段值。 |
Long delete(String key, Object... hashKeys) |
HDEL key field1 field2 … | 删除指定字段,返回删除个数。 |
Long increment(String key, String hashKey, long delta) |
HINCRBY key field delta | 字段值 + 整数 delta。 |
Double increment(String key, String hashKey, double delta) |
HINCRBYFLOAT key field delta | 字段值 + 浮点 delta。 |
Cursor<Map.Entry<String, String>> scan(String key, ScanOptions options) |
HSCAN key cursor [MATCH pattern] [COUNT count] | 增量迭代 hash 字段,防阻塞大数据集。 |
示例代码:
@RequestMapping("/testHashmap")
private void testHashmap() {
stringRedisTemplate.opsForHash().put("key","f1","111");
Map<String,String> map = new HashMap<>();
map.put("f2","222");
map.put("f3","333");
map.put("f4","444");
stringRedisTemplate.opsForHash().putAll("key",map);
System.out.println("f2 " + stringRedisTemplate.opsForHash().get("key", "f2"));
List<Object> key = stringRedisTemplate.opsForHash().values("key");
System.out.println(key);
Map<Object, Object> key = stringRedisTemplate.opsForHash().entries("key");
System.out.println(key);
stringRedisTemplate.delete("key");
}
结果:
六、使⽤ Set
| 方法(含返回值) | Redis 命令 | 功能 |
|---|---|---|
Long add(String key, String... values) |
SADD key member1 member2 … | 添加元素,返回新增个数。 |
Long remove(String key, Object... values) |
SREM key member1 member2 … | 删除元素,返回删除个数。 |
String pop(String key) |
SPOP key | 随机弹出一个元素。 |
List<String> pop(String key, long count) |
SPOP key count | 随机弹出 count 个元素(Redis 3.2+)。 |
Boolean isMember(String key, Object value) |
SISMEMBER key member | 判断元素是否存在。 |
Set<String> members(String key) |
SMEMBERS key | 获取所有元素。 |
Long size(String key) |
SCARD key | 获取元素个数。 |
Boolean move(String key, String value, String destKey) |
SMOVE src dest member | 原子地:把元素从源集合移到目标集合。 |
String randomMember(String key) |
SRANDMEMBER key | 随机返回一个元素(不删除)。 |
List<String> randomMembers(String key, long count) |
SRANDMEMBER key count | 随机返回 count 个元素(允许重复)。 |
Set<String> distinctRandomMembers(String key, long count) |
SRANDMEMBER key count | 随机返回 count 个不重复元素。 |
Set<String> intersect(String key, String otherKey) |
SINTER key1 key2 | 求交集并返回结果集。 |
Set<String> intersect(String key, Collection<String> otherKeys) |
SINTER key1 key2 … | 多集合交集。 |
Long intersectAndStore(String key, String otherKey, String destKey) |
SINTERSTORE dest key1 key2 | 求交集并把结果存入 destKey,返回结果集大小。 |
Long intersectAndStore(String key, Collection<String> otherKeys, String destKey) |
SINTERSTORE dest key1 key2 … | 多集合交集并落库。 |
Set<String> union(String key, String otherKey) |
SUNION key1 key2 | 求并集。 |
Set<String> union(String key, Collection<String> otherKeys) |
SUNION key1 key2 … | 多集合并集。 |
Long unionAndStore(String key, String otherKey, String destKey) |
SUNIONSTORE dest key1 key2 | 并集结果存入 destKey。 |
Long unionAndStore(String key, Collection<String> otherKeys, String destKey) |
SUNIONSTORE dest key1 key2 … | 多集合并集落库。 |
Set<String> difference(String key, String otherKey) |
SDIFF key1 key2 | 求差集(key 相对于 otherKey)。 |
Set<String> difference(String key, Collection<String> otherKeys) |
SDIFF key1 key2 … | 多集合差集。 |
Long differenceAndStore(String key, String otherKey, String destKey) |
SDIFFSTORE dest key1 key2 | 差集结果存入 destKey。 |
Long differenceAndStore(String key, Collection<String> otherKeys, String destKey) |
SDIFFSTORE dest key1 key2 … | 多集合差集落库。 |
Cursor<String> scan(String key, ScanOptions options) |
SSCAN key cursor [MATCH pattern] [COUNT count] | 增量迭代集合元素,防阻塞大数据集。 |
示例代码:
@RequestMapping("/testSet")
private void testSet() {
stringRedisTemplate.opsForSet().add("key","111","222","333");
Set<String> key = stringRedisTemplate.opsForSet().members("key");
System.out.println(key);
boolean ok = stringRedisTemplate.opsForSet().isMember("key", "222");
System.out.println(ok);
stringRedisTemplate.opsForSet().remove("key", "222");
key = stringRedisTemplate.opsForSet().members("key");
System.out.println(key);
stringRedisTemplate.delete("key");
}
结果:
七、使⽤ ZSet
| 方法(含返回值) | Redis 命令 | 功能 |
|---|---|---|
Boolean add(String key, String value, double score) |
ZADD key score member | 添加一个元素并指定分数,存在即更新分数。 |
Long add(String key, Set<TypedTuple<String>> tuples) |
ZADD key score1 member1 … | 批量添加/更新。 |
Long remove(String key, Object... values) |
ZREM key member1 member2 … | 删除元素,返回删除个数。 |
Double incrementScore(String key, String value, double delta) |
ZINCRBY key delta member | 对指定元素分数做原子加。 |
Long rank(String key, Object value) |
ZRANK key member | 取元素正序排名(从 0 开始,分数最小为 0)。 |
Long reverseRank(String key, Object value) |
ZREVRANK key member | 取元素倒序排名(分数最大为 0)。 |
Double score(String key, Object value) |
ZSCORE key member | 获取元素分数。 |
Long size(String key) |
ZCARD key | 集合元素个数。 |
Long count(String key, double min, double max) |
ZCOUNT key min max | 统计分数区间 [min,max] 内元素个数。 |
Long lexCount(String key, Range range) |
ZLEXCOUNT key [min [max | 按字典序区间计数(所有元素分数必须相同)。 |
Set<String> range(String key, long start, long end) |
ZRANGE key start end | 按正序返回排名区间 [start,end] 元素。 |
Set<TypedTuple<String>> rangeWithScores(String key, long start, long end) |
ZRANGE key start end WITHSCORES | 正序返回元素+分数。 |
Set<String> reverseRange(String key, long start, long end) |
ZREVRANGE key start end | 按倒序返回排名区间元素。 |
Set<TypedTuple<String>> reverseRangeWithScores(String key, long start, long end) |
ZREVRANGE key start end WITHSCORES | 倒序返回元素+分数。 |
Set<String> rangeByScore(String key, double min, double max) |
ZRANGEBYSCORE key min max | 按分数区间正序返回元素。 |
Set<TypedTuple<String>> rangeByScoreWithScores(String key, double min, double max) |
ZRANGEBYSCORE key min max WITHSCORES | 分数区间+返回分数。 |
Set<String> rangeByScore(String key, double min, double max, long offset, long count) |
ZRANGEBYSCORE key min max LIMIT offset count | 分数区间分页。 |
Set<TypedTuple<String>> rangeByScoreWithScores(key, min, max, offset, count) |
ZRANGEBYSCORE … WITHSCORES LIMIT … | 分数区间分页带分数。 |
Set<String> reverseRangeByScore(String key, double min, double max) |
ZREVRANGEBYSCORE key max min | 按分数区间倒序返回元素。 |
Set<TypedTuple<String>> reverseRangeByScoreWithScores(...) |
ZREVRANGEBYSCORE … WITHSCORES | 倒序分数区间带分数。 |
Set<String> reverseRangeByScore(key, min, max, offset, count) |
ZREVRANGEBYSCORE … LIMIT … | 倒序分数区间分页。 |
Set<TypedTuple<String>> reverseRangeByScoreWithScores(...) |
ZREVRANGEBYSCORE … WITHSCORES LIMIT … | 倒序分页带分数。 |
Long rangeAndStore(String srcKey, String destKey, long start, long end) |
ZRANGESTORE dest src start end | 正序排名区间结果存入新集合(Redis 6.2+)。 |
Long reverseRangeAndStore(String srcKey, String destKey, long start, long end) |
ZREVRANGESTORE dest src start end | 倒序排名区间结果存入新集合。 |
Long rangeByScoreAndStore(String srcKey, String destKey, double min, double max) |
ZRANGESTORE dest src min max BYSCORE | 分数区间结果存入新集合。 |
Long reverseRangeByScoreAndStore(String srcKey, String destKey, double min, double max) |
ZREVRANGESTORE dest src max min BYSCORE | 倒序分数区间结果存入新集合。 |
Long removeRange(String key, long start, long end) |
ZREMRANGEBYRANK key start end | 按排名区间删除元素。 |
Long removeRangeByScore(String key, double min, double max) |
ZREMRANGEBYSCORE key min max | 按分数区间删除元素。 |
Long unionAndStore(String key, String otherKey, String destKey) |
ZUNIONSTORE dest numkeys key1 key2 | 并集结果存入 destKey,默认 SUM 聚合。 |
Long unionAndStore(String key, Collection<String> otherKeys, String destKey) |
ZUNIONSTORE dest numkeys key1 … | 多集合并集落库。 |
Long unionAndStore(String key, Collection<String> otherKeys, String destKey, Aggregate aggregate) |
ZUNIONSTORE dest numkeys key1 … AGGREGATE SUM/MIN/MAX | 并集+指定聚合方式。 |
Long unionAndStore(String key, Collection<String> otherKeys, String destKey, Aggregate aggregate, Weights weights) |
ZUNIONSTORE dest numkeys key1 … WEIGHTS w1 w2 AGGREGATE … | 并集+带权重+聚合。 |
Long intersectAndStore(String key, String otherKey, String destKey) |
ZINTERSTORE dest numkeys key1 key2 | 交集结果存入 destKey。 |
Long intersectAndStore(String key, Collection<String> otherKeys, String destKey) |
ZINTERSTORE dest numkeys key1 … | 多集合交集落库。 |
Long intersectAndStore(String key, Collection<String> otherKeys, String destKey, Aggregate aggregate) |
ZINTERSTORE dest numkeys key1 … AGGREGATE … | 交集+聚合方式。 |
Long intersectAndStore(String key, Collection<String> otherKeys, String destKey, Aggregate aggregate, Weights weights) |
ZINTERSTORE dest numkeys key1 … WEIGHTS w1 w2 AGGREGATE … | 交集+带权重+聚合。 |
Cursor<TypedTuple<String>> scan(String key, ScanOptions options) |
ZSCAN key cursor [MATCH pattern] [COUNT count] | 增量迭代元素+分数,防阻塞大数据集。 |
示例代码:
@RequestMapping("/testZSet")
private void testZSet() {
stringRedisTemplate.opsForZSet().add("key","f1",1.0);
stringRedisTemplate.opsForZSet().add("key","f2",20.0);
stringRedisTemplate.opsForZSet().add("key","f3",30.0);
Set<String> values = stringRedisTemplate.opsForZSet().range("key", 0, -1);
System.out.println(values);
long n = stringRedisTemplate.opsForZSet().count("key", 0, 25);
System.out.println(n);
stringRedisTemplate.delete("key");
}
结果:
更多推荐


所有评论(0)