SpringBoot使用RedisTemplate

2023-05-16

目录

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 引入依赖


<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.7.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>  

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<K, V> opsForValue();
<HK, HV> HashOperations<K, HK, HV> opsForHash();
ListOperations<K, V> opsForList();
SetOperations<K, V> opsForSet();
ZSetOperations<K, V> opsForZSet();
//绑定key操作
BoundValueOperations<K, V> boundValueOps(K key);
<HK, HV> BoundHashOperations<K, HK, HV> boundHashOps(K key);
BoundListOperations<K, V> boundListOps(K key);
BoundSetOperations<K, V> boundSetOps(K key);
BoundZSetOperations<K, V> 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<String> multiGet(Collection<String> 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<K> 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<String> 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<Object, Object> hGetAll(String key) {
    return redisTemplate.opsForHash().entries(key);
}  

新增 hashMap 值


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

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


public void hPutAll(String key, Map<String, String> 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<Object> hValues(String key) {
    return redisTemplate.opsForHash().values(key);
}  

获取 hash 表中字段的数量


redisTemplate.opsForHash().size(key)  

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


public Cursor<Entry<Object, Object>> 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<TypedTuple<Object>> scan = opsForZSet.scan("test3", ScanOptions.NONE); while (scan.hasNext()){
ZSetOperations.TypedTuple<Object> item = scan.next();
System.out.println(item.getValue() \+ ":" + item.getScore());
}  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot使用RedisTemplate 的相关文章

随机推荐

  • 回环检测之决策模型

    前面我们已经讲了如何描述场景 xff0c 让机器人尽可能的了解周围环境 xff0c 那么了解了之后 xff0c 如何判断出是回环的呢 xff1f 本节讨论如何建立决策模型来根据当前场景描述和地图信息识别出可能的闭环 合理的决策模型可有效提高
  • 回环检测之DBoW2

    前面我们已经讲了回环检测中用的一些方法 xff0c 今天主要介绍一下现在用的最多的词袋模型 DBoW2 这里就不在细讲回环检测的定义 xff0c 具体可以看看我的前面的博客 xff0c 而回环检测在SLAM中的作用可以从下面的图片中大致有一
  • 快速解决rosdep update一直不通过问题

    以前安装ROS的时候遇到rosdep update不通过 xff0c 需要很多次测试才能通过 xff0c 能通过完全靠运气 xff0c 也找了网上很多种方法 xff0c 比较麻烦 xff0c 今天这里说一下一位大神帅鱼提供的一个方法 xff
  • Matlab读取文本数据

    用Nastran的时候 xff0c 想把bdf文件里的节点坐标导出来 xff0c 但是坐标的格式很奇怪 xff0c 见下图 xff1a 会发现这种科学计数法中间没有字母E或e xff0c 直接用Matlab中的load函数读取的话 xff0
  • 为学弟学妹熬夜的一份零基础 C++ 开发学习路线

    大家好 xff0c 我是帅地 之前写过几篇学习路线的文章 前端开发学习路线 Java 后端开发学习路线 一般开发岗主流的就是 Java 后台开发 xff0c 前端开发以及 C 43 43 后台开发 xff0c 现在 Go 开发也是越来越多了
  • ars408_ros驱动问题

    0 ars408 ros驱动 mkdir folder mkdir folder src cd folder src git clone https github com sergiocasaspastor myrepository git
  • Tensorflow实战:LSTM原理及实现(详解)

    LSTM规避了标准RNN中梯度爆炸和梯度消失的问题 xff0c 所以会显得更好用 xff0c 学习速度更快 下图是最基本的LSTM单元连接起来的样子 上图为一层LSTM单元连接起来的样子 xff0c 在工业上 xff0c LSTM是可以像一
  • Gazebo版本升级7.0--->7.16

    GPU issues The GPU problems reported in this issue have been solved with this pull request for the gazebo7branch The Gaz
  • 机器人局部动态避障算法dwa解析

    简介 dwa算法全称叫动态窗口法 xff08 dynamic window approach xff09 xff0c 其算法过程主要分为仿真获取机器人的运动轨迹 对轨迹进行评价选择最优轨迹两个主要过程 xff0c 动态窗口表达的是仿真的运动
  • 应届生应该如何准备校招

    大家好 xff0c 我是羽峰 xff0c 今天要和大家分享的是应届生应该如何准备校招 xff0c 希望该文章对一些今年要找工作的朋友有一些帮助 还是老话 xff0c 我是羽峰 xff0c 希望我所分享的文章能为您及更多的朋友带来帮助 欢迎转
  • docker容器迁移到其他服务器

    以把旧服务器的mysql容器迁移到虚拟机上为例 1 旧服务器查看路径映射 首先查看mysql容器的路径映射 span class token function docker span inspect mysql 2 基本数据由旧服务器迁移到
  • 查看msg类型数组的长度

    msg类型数组的使用 需要说明的是std msgs中有些数组用法和C 43 43 标准库中不一样 比如Float32MultiArray xff0c 其定义如下 xff1a std msgs MultiArrayLayout layout
  • ROS 查看tf树

    rosrun rqt tf tree rqt tf tree
  • C++——构造函数后加冒号

    其实冒号后的内容是初始化成员列表 xff0c 一般有三种情况 xff1a 1 对含有对象成员的对象进行初始化 xff0c 例如 xff0c 类 line 有两个私有对象成员 startpoint endpoint line 的构造函数写成
  • Redis——在windows下设置密码

    设置密码有两种方式 1 命令行设置密码 运行cmd切换到redis根目录 xff0c 先启动服务端 gt redis server exe 另开一个cmd切换到redis根目录 xff0c 启动客户端 gt redis cli exe h
  • C++——函数声明省略形参名的用法注意

    函数声明时 xff0c 形参可以没有参数名 xff08 形参 xff09 xff0c 函数定义时 xff0c 一定要有参数名 xff08 形参 xff09 xff0c 函数调用时 xff0c 一定要有参数名 xff08 实参 xff09 i
  • Go——打印变量类型的两种方法

    1 使用reflect的TypeOf方法 模块是 xff1a 34 reflect 34 fmt Println reflect TypeOf var 切片类型的输出 2 使用Printf中的占位符 T 占位符 说明 举例 输出 T 相应值
  • Mybatis——foreach用法

    目录 1 foreach元素的属性 2 foreach时 xff0c collection属性值的三种情况 xff1a 3 代码示例 xff1a 3 1 collection属性值类型为List 使用 64 Param注解自定义keyNam
  • linux学习——(踩坑)语法错误: 未预期的文件结尾

    if eq 3 then if e 34 1 34 then miss1 1 elif e 34 2 34 a e 34 3 34 then miss2and3 1 2 3 elif e 34 2 34 a e 34 3 34 then m
  • SpringBoot使用RedisTemplate

    目录 1 Redis五种基础数据结构 2 SpringBoot连接Redis 1 引入依赖 2 配置redis连接 3 编写测试类 3 详解 RedisTemplate 的 API 1 常用数据操作 2 几种数据结构操作的具体用法 1 Re