一、创建项目引入依赖

在创建项目的时候,将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");

    }

结果:

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐