• SpringBoot使用RedisTemplate


    目录

    1.Redis五种基础数据结构

    2.SpringBoot连接Redis

    1 引入依赖

    2 配置redis连接

    3 编写测试类

    3.详解 RedisTemplate 的 API

    1 常用数据操作

    2.几种数据结构操作的具体用法


    1.Redis五种基础数据结构

    参考链接:Redis入门 - 数据类型:5种基础数据类型详解 | Java 全栈知识体系,摘抄如下,更详细见原文

    Redis基础文章非常多,关于基础数据结构类型,我推荐你先看下官方网站内容 (opens new window),然后再看下面的小结

    首先对redis来说,所有的key(键)都是字符串。我们在谈基础数据结构时,讨论的是存储值的数据类型,主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash。

    结构类型

    结构存储的值

    结构的读写能力

    String字符串

    可以是字符串、整数或浮点数

    对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作;

    List列表

    一个链表,链表上的每个节点都包含一个字符串

    对链表的两端进行push和pop操作,读取单个或多个元素;根据值查找或删除元素;

    Set集合

    包含字符串的无序集合

    字符串的集合,包含基础的方法有看是否存在添加、获取、删除;还包含计算交集、并集、差集等

    Hash散列

    包含键值对的无序散列表

    包含方法有添加、获取、删除单个元素

    Zset有序集合

    和散列一样,用于存储键值对

    字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素

    以下参考公众号——Kirito的技术分享《Spring Data Redis(一)–解析RedisTemplate》,更详细见原文

    2.SpringBoot连接Redis

    1 引入依赖

    org.springframework.boot spring-boot-starter-parent 1.5.7.RELEASE org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-starter-test test

    springboot的老用户会发现redis依赖名称发生了一点小的变化,在springboot1.4之前,redis依赖的名称为:spring-boot-starter-redis,而在之后较新的版本中,使用spring-boot-starter-redis依赖,则会在项目启动时得到一个过期警告。意味着,我们应该彻底放弃旧的依赖。spring-data这个项目定位为spring提供一个统一的数据仓库接口,如(spring-boot-starter-data-jpa,spring-boot-starter-data-mongo,spring-boot-starter-data-rest),将redis纳入后,改名为了spring-boot-starter-data-redis。

    2 配置redis连接

    resources/application.yml
    spring:
    redis:
    host: 127.0.0.1
    database: 0
    port: 6379
    password:

    本机启动一个单点的redis即可,使用redis的0号库作为默认库(默认有16个库),在生产项目中一般会配置redis集群和哨兵保证redis的高可用,同样可以在application.yml中修改,非常方便。

    3 编写测试类

    import org.assertj.core.api.Assertions;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.test.context.junit4.SpringRunner;
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class ApplicationTests {
    @Autowired
    private RedisTemplate redisTemplate;// <1>
    @Test
    public void test() throws Exception {
    redisTemplate.opsForValue().set(“student:1”, “kirito”); // <2>
    Assertions.assertThat(redisTemplate.opsForValue().get(“student:1”)).isEqualTo(“kirito”);
    }
    }

    <1> 引入了 RedisTemplate,这个类是 spring-starter-data-redis 提供给应用直接访问 redis 的入口。从其命名就可以看出,其是模板模式在 spring 中的体现,与 restTemplate,jdbcTemplate 类似,而 springboot 为我们做了自动的配置,具体会在下文详解。

    <2> redisTemplate 通常不直接操作键值,而是通过 opsForXxx() 访问,在本例中,key 和 value 均为字符串类型。绑定字符串在实际开发中也是最为常用的操作类型。

    3.详解 RedisTemplate 的 API

    RedisTemplate 为我们操作 Redis 提供了丰富的 API,可以将他们简单进行下归类。

    1 常用数据操作

    这一类 API 也是我们最常用的一类。

    众所周知,redis 存在 5 种数据类型:

    字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset)

    而 redisTemplate 实现了 RedisOperations 接口,在其中,定义了一系列与 redis 相关的基础数据操作接口,数据类型分别于下来 API 对应:

    //非绑定key操作
    ValueOperations opsForValue();
    HashOperations opsForHash();
    ListOperations opsForList();
    SetOperations opsForSet();
    ZSetOperations opsForZSet();
    //绑定key操作
    BoundValueOperations boundValueOps(K key);
    BoundHashOperations boundHashOps(K key);
    BoundListOperations boundListOps(K key);
    BoundSetOperations boundSetOps(K key);
    BoundZSetOperations boundZSetOps(K key);

    若以 bound 开头,则意味着在操作之初就会绑定一个 key,后续的所有操作便默认认为是对该 key 的操作,算是一个小优化。

    2.几种数据结构操作的具体用法

    参考公众号一点教程《从入门到精通,超强 RedisTemplate 方法详解!》

    操作 Redis 的 String 数据结构

    设置当前的 key 以及 value 值

    redisTemplate.opsForValue().set(key, value)
    redisTemplate.opsForValue().set(“num”,“123”);

    设置当前的 key 以及 value 值并且设置过期时间

    redisTemplate.opsForValue().set(key, value, timeout, unit)
    redisTemplate.opsForValue().set(“num”,“123”,10, TimeUnit.SECONDS);

    //TimeUnit.DAYS //天
    //TimeUnit.HOURS //小时
    //TimeUnit.MINUTES //分钟
    //TimeUnit.SECONDS //秒
    //TimeUnit.MILLISECONDS //毫秒

    将旧的 key 设置为 value,并且返回旧的 key(设置 key 的字符串 value 并返回其旧值)

    redisTemplate.opsForValue().getAndSet(key, value);

    在原有的值基础上新增字符串到末尾

    redisTemplate.opsForValue().append(key, value)

    获取字符串的长度

    redisTemplate.opsForValue().size(key)

    重新设置 key 对应的值,如果存在返回 false,否则返回 true

    redisTemplate.opsForValue().setIfAbsent(key, value)

    设置 map 集合到 redis

    Map valueMap = new HashMap();
    valueMap.put(“valueMap1”,“map1”);
    valueMap.put(“valueMap2”,“map2”);
    valueMap.put(“valueMap3”,“map3”);
    redisTemplate.opsForValue().multiSet(valueMap);

    如果对应的 map 集合名称不存在,则添加否则不做修改

    Map valueMap = new HashMap();
    valueMap.put(“valueMap1”,“map1”);
    valueMap.put(“valueMap2”,“map2”);
    valueMap.put(“valueMap3”,“map3”);
    redisTemplate.opsForValue().multiSetIfAbsent(valueMap);

    通过 increment(K key, long delta) 方法以增量方式存储 long 值(正值则自增,负值则自减)

    redisTemplate.opsForValue().increment(key, increment);

    批量获取值

    public List multiGet(Collection keys) {
    return redisTemplate.opsForValue().multiGet(keys);
    }

    返回传入 key 所存储的值的类型

    修改 redis 中 key 的名称

    public void renameKey(String oldKey, String newKey) {
    redisTemplate.rename(oldKey, newKey);
    }

    如果旧值 key 存在时,将旧值改为新值

    public Boolean renameOldKeyIfAbsent(String oldKey, String newKey) {
    return redisTemplate.renameIfAbsent(oldKey, newKey);
    }

    判断是否有 key 所对应的值,有则返回 true,没有则返回 false

    redisTemplate.hasKey(key)

    删除单个 key 值

    redisTemplate.delete(key)

    批量删除 key

    redisTemplate.delete(keys) //其中keys:Collection keys

    设置过期时间

    public Boolean expire(String key, long timeout, TimeUnit unit){
    return redisTemplate.expire(key, timeout, unit);
    }

    public Boolean expireAt(String key, Date date) {
    return redisTemplate.expireAt(key, date);
    }

    返回当前 key 所对应的剩余过期时间

    redisTemplate.getExpire(key);

    返回剩余过期时间并且指定时间单位

    public Long getExpire(String key, TimeUnit unit) {
    return redisTemplate.getExpire(key, unit);
    }

    查找匹配的 key 值,返回一个 Set 集合类型

    public Set getPatternKey(String pattern) {
    return redisTemplate.keys(pattern);
    }

    将 key 持久化保存

    public Boolean persistKey(String key) {
    return redisTemplate.persist(key);
    }

    将当前数据库的 key 移动到指定 redis 中数据库当中

    public Boolean moveToDbIndex(String key, int dbIndex) {
    return redisTemplate.move(key, dbIndex);
    }

    Hash 类型

    「Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。」 「Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)。」

    获取变量中的指定 map 键是否有值,如果存在该 map 键则获取值,没有则返回 null。

    redisTemplate.opsForHash().get(key, field)

    获取变量中的键值对

    public Map hGetAll(String key) {
    return redisTemplate.opsForHash().entries(key);
    }

    新增 hashMap 值

    redisTemplate.opsForHash().put(key, hashKey, value)

    以 map 集合的形式添加键值对

    public void hPutAll(String key, Map maps) {
    redisTemplate.opsForHash().putAll(key, maps);
    }

    仅当 hashKey 不存在时才设置

    public Boolean hashPutIfAbsent(String key, String hashKey, String value) {
    return redisTemplate.opsForHash().putIfAbsent(key, hashKey, value);
    }

    删除一个或者多个 hash 表字段

    public Long hashDelete(String key, Object… fields) {
    return redisTemplate.opsForHash().delete(key, fields);
    }

    查看 hash 表中指定字段是否存在

    public boolean hashExists(String key, String field) {
    return redisTemplate.opsForHash().hasKey(key, field);
    }

    给哈希表 key 中的指定字段的整数值加上增量 increment

    public Long hashIncrBy(String key, Object field, long increment) {
    return redisTemplate.opsForHash().increment(key, field, increment);
    }

    public Double hIncrByDouble(String key, Object field, double delta) {
    return redisTemplate.opsForHash().increment(key, field, delta);
    }

    获取所有 hash 表中字段

    redisTemplate.opsForHash().keys(key)

    获取 hash 表中存在的所有的值

    public List hValues(String key) {
    return redisTemplate.opsForHash().values(key);
    }

    获取 hash 表中字段的数量

    redisTemplate.opsForHash().size(key)

    匹配获取键值对,ScanOptions.NONE 为获取全部键对

    public Cursor> hashScan(String key, ScanOptions options) {
    return redisTemplate.opsForHash().scan(key, options);
    }

    List 类型

    通过索引获取列表中的元素

    redisTemplate.opsForList().index(key, index)

    获取列表指定范围内的元素(start 开始位置, 0 是开始位置,end 结束位置, -1返回所有)

    redisTemplate.opsForList().range(key, start, end)

    存储在 list 的头部,即添加一个就把它放在最前面的索引处

    redisTemplate.opsForList().leftPush(key, value)

    把多个值存入 List 中(value 可以是多个值,也可以是一个 Collection value)

    redisTemplate.opsForList().leftPushAll(key, value)

    List 存在的时候再加入

    redisTemplate.opsForList().leftPushIfPresent(key, value)

    按照先进先出的顺序来添加(value 可以是多个值,或者是 Collection var2)

    redisTemplate.opsForList().rightPush(key, value)
    redisTemplate.opsForList().rightPushAll(key, value)

    设置指定索引处元素的值

    redisTemplate.opsForList().set(key, index, value)

    移除并获取列表中第一个元素(如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止)

    redisTemplate.opsForList().leftPop(key)
    redisTemplate.opsForList().leftPop(key, timeout, unit)

    移除并获取列表最后一个元素

    redisTemplate.opsForList().rightPop(key)
    redisTemplate.opsForList().rightPop(key, timeout, unit)

    从一个队列的右边弹出一个元素并将这个元素放入另一个指定队列的最左边

    redisTemplate.opsForList().rightPopAndLeftPush(sourceKey, destinationKey)
    redisTemplate.opsForList().rightPopAndLeftPush(sourceKey, destinationKey, timeout, unit)

    删除集合中值等于 value 的元素(index=0, 删除所有值等于 value 的元素; index>0, 从头部开始删除第一个值等于 value 的元素; index<0, 从尾部开始删除第一个值等于 value 的元素)

    redisTemplate.opsForList().remove(key, index, value)

    将 List 列表进行剪裁

    redisTemplate.opsForList().trim(key, start, end)

    获取当前 key 的 List 列表长度

    redisTemplate.opsForList().size(key)

    Set 类型

    添加元素

    redisTemplate.opsForSet().add(key, values)

    移除元素(单个值、多个值)

    redisTemplate.opsForSet().remove(key, values)

    获取集合的大小

    redisTemplate.opsForSet().size(key)

    判断集合是否包含 value

    redisTemplate.opsForSet().isMember(key, value)

    获取两个集合的交集(key 对应的无序集合与 otherKey 对应的无序集合求交集)

    redisTemplate.opsForSet().intersect(key, otherKey)

    获取多个集合的交集(Collection var2)

    redisTemplate.opsForSet().intersect(key, otherKeys)

    key 集合与 otherKey 集合的交集存储到 destKey 集合中(其中 otherKey 可以为单个值或者集合)

    redisTemplate.opsForSet().intersectAndStore(key, otherKey, destKey)

    key 集合与多个集合的交集存储到 destKey 无序集合中

    redisTemplate.opsForSet().intersectAndStore(key, otherKeys, destKey)

    获取两个或者多个集合的并集(otherKeys 可以为单个值或者是集合)

    redisTemplate.opsForSet().union(key, otherKeys)

    key 集合与 otherKey 集合的并集存储到 destKey 中(otherKeys 可以为单个值或者是集合)

    redisTemplate.opsForSet().unionAndStore(key, otherKey, destKey)

    获取两个或者多个集合的差集(otherKeys 可以为单个值或者是集合)

    redisTemplate.opsForSet().difference(key, otherKeys)

    差集存储到 destKey 中(otherKeys 可以为单个值或者集合)

    redisTemplate.opsForSet().differenceAndStore(key, otherKey, destKey)

    获取集合中的所有元素

    redisTemplate.opsForSet().members(key)

    随机获取集合中 count 个元素

    redisTemplate.opsForSet().randomMembers(key, count)

    随机获取集合中的一个元素

    redisTemplate.opsForSet().randomMember(key)

    遍历 set 类似于 Interator(ScanOptions.NONE 为显示所有的)

    redisTemplate.opsForSet().scan(key, options)

    zset 类型

    ZSetOperations 提供了一系列方法对有序集合进行操作,添加元素(有序集合是按照元素的 score 值由小到大进行排列)。

    redisTemplate.opsForZSet().add(key, value, score)

    删除对应的 value,value 可以为多个值

    redisTemplate.opsForZSet().remove(key, values)

    增加元素的 score 值,并返回增加后的值

    redisTemplate.opsForZSet().incrementScore(key, value, delta)

    返回元素在集合的排名,有序集合是按照元素的 score 值由小到大排列

    redisTemplate.opsForZSet().rank(key, value)

    返回元素在集合的排名,按元素的 score 值由大到小排列

    redisTemplate.opsForZSet().reverseRank(key, value)

    获取集合中给定区间的元素(start 开始位置,end 结束位置, -1 查询所有)

    redisTemplate.opsForZSet().reverseRangeWithScores(key, start,end)

    按照 Score 值查询集合中的元素,结果从小到大排序

    redisTemplate.opsForZSet().reverseRangeByScore(key, min, max)

    从高到低的排序集中获取分数在最小和最大值之间的元素

    redisTemplate.opsForZSet().reverseRangeByScore(key, min, max, start, end)

    根据 score 值获取集合元素数量

    redisTemplate.opsForZSet().count(key, min, max)

    获取集合的大小

    redisTemplate.opsForZSet().size(key)

    获取集合中 key、value 元素对应的 score 值

    redisTemplate.opsForZSet().score(key, value)

    移除指定索引位置处的成员

    redisTemplate.opsForZSet().removeRange(key, start, end)

    移除指定 score 范围的集合成员

    redisTemplate.opsForZSet().removeRangeByScore(key, min, max)

    获取 key 和 otherKey 的并集并存储在 destKey 中(其中 otherKeys 可以为单个字符串或者字符串集合)

    redisTemplate.opsForZSet().unionAndStore(key, otherKey, destKey)

    获取 key 和 otherKey 的交集并存储在 destKey 中(其中 otherKeys 可以为单个字符串或者字符串集合)

    redisTemplate.opsForZSet().intersectAndStore(key, otherKey, destKey)

    遍历集合(和 iterator 一模一样)

    Cursor scan = opsForZSet.scan(“test3”, ScanOptions.NONE); while (scan.hasNext()){
    ZSetOperations.TypedTuple item = scan.next();
    System.out.println(item.getValue() + “:” + item.getScore());
    }

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    [错题]电路维修
    谷歌禁止Deepfake项目研究
    《数据结构C++版》实验三:二叉树实验
    TAT (AYGRKKRRQRRR)
    java在线影院系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    Seata Server 1.5.2 源码学习
    用友畅捷通文吉:如何通过智能运维提升稳定性保障
    终于拿到了2022阿里技术专家分享的552页大型网站架构实战PDF文档
    Spark Catalog深入理解与实战——《DEEPNOVA开发者社区》
    Day08--自定义组件的behaviors(等用于vue中的mixins)
  • 原文地址:https://blog.csdn.net/m0_67401153/article/details/126114433