SpringBoot使用RedisTemplate
目录1.Redis五种基础数据结构2.SpringBoot连接Redis1 引入依赖2 配置redis连接3 编写测试类3.详解 RedisTemplate 的 API1 常用数据操作2.几种数据结构操作的具体用法1.Redis五种基础数据结构参考链接:Redis入门 - 数据类型:5种基础数据类型详解 | Java 全栈知识体系,摘抄如下,更详细见原文Redis基础文章非常多,关于基础数据结构类
目录
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()); }
更多推荐
所有评论(0)