您好,登錄后才能下訂單哦!
這篇文章主要講解了“SpringBoot怎么使用RedisTemplate操作Redis數據類型”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“SpringBoot怎么使用RedisTemplate操作Redis數據類型”吧!
Spring 封裝了 RedisTemplate 來操作 Redis,它支持所有的 Redis 原生的 API。在 RedisTemplate 中定義了對5種數據結構的操作方法。
opsForValue():操作字符串。
opsForList():操作列表。
opsForHash():操作哈希。
opsForSet():操作集合。
opsForZSet():操作有序集合。
下面通過實例來理解和應用這些方法。這里需要特別注意的是,運行上述方法后要對數據進行清空操作,否則多次運行會導致數據重復操作。
(1)使用Maven添加依賴文件
在pom.xml配置信息文件中,添加Redis依賴:
我的SpringBoot版本:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
添加Redis依賴:
<!-- Redis啟動器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.3.3.RELEASE</version> </dependency>
(2)Redis的配置
在 application.yml 配置文件中配置Redis信息:
#Spring配置 spring: #緩存管理器 cache: type: redis #Redis配置 redis: database: 0 #Redis數據庫索引(默認為0) host: 127.0.0.1 #Redis服務器地址 port: 6379 #Redis服務器連接端口 password: #Redis服務器連接密碼(默認為空) jedis: pool: max-active: 8 #連接池最大連接數(使用負值表示沒有限制) max-wait: -1s #連接池最大阻塞等待時間(使用負值表示沒有限制) max-idle: 8 #連接池中的最大空閑連接 min-idle: 0 #連接池中的最小空閑連接 lettuce: shutdown-timeout: 100ms #關閉超時時間,默認值100ms
(3)Redis配置類(config層)
創建com.pjb.config包中,并創建RedisConfig類(Redis配置類),并繼承CachingConfigurerSupport類。
package com.pjb.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import java.lang.reflect.Method; /** * Redis配置類 * @author pan_junbiao **/ @Configuration public class RedisConfig extends CachingConfigurerSupport { /** * 緩存對象集合中,緩存是以key-value形式保存的, * 當不指定緩存的key時,SpringBoot會使用keyGenerator生成Key。 */ @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); //類名+方法名 sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; } /** * 緩存管理器 */ @SuppressWarnings("rawtypes") @Bean public CacheManager cacheManager(RedisConnectionFactory connectionFactory) { RedisCacheManager cacheManager = RedisCacheManager.create(connectionFactory); //設置緩存過期時間 return cacheManager; } /** * 實例化RedisTemplate對象 */ @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } }
字符串(String)是 Redis 最基本的數據類型。String 的一個“Key”對應一個“Value”,即 Key-Value 鍵值對。String 是二進制安全的,可以存儲任何數據(比如圖片或序列化的對象)。值最大能存儲512MB的數據。一般用于一些復雜的計數功能的緩存。RedisTemplate 提供以下操作 String 的方法。
具體用法見以下代碼:
/** * Redis操作字符串(String) * @author pan_junbiao **/ @SpringBootTest public class StringTest { @Autowired private RedisTemplate redisTemplate; @Test public void string1() { redisTemplate.opsForValue().set("userName","pan_junbiao的博客"); redisTemplate.opsForValue().set("blogUrl","https://blog.csdn.net/pan_junbiao"); redisTemplate.opsForValue().set("blogRemark","您好,歡迎訪問 pan_junbiao的博客"); System.out.println("用戶名稱:" + redisTemplate.opsForValue().get("userName")); System.out.println("博客地址:" + redisTemplate.opsForValue().get("blogUrl")); System.out.println("博客信息:" + redisTemplate.opsForValue().get("blogRemark")); } }
執行結果:
以下代碼設置3s失效。3s之內查詢有結果,3s之后查詢返回為null。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void string2() { //設置的是3s失效,3s之內查詢有結果,3s之后返回null redisTemplate.opsForValue().set("blogRemark","您好,歡迎訪問 pan_junbiao的博客",3, TimeUnit.SECONDS); try { Object s1 = redisTemplate.opsForValue().get("blogRemark"); System.out.println("博客信息:" + s1); Thread.currentThread().sleep(2000); Object s2 = redisTemplate.opsForValue().get("blogRemark"); System.out.println("博客信息:" + s2); Thread.currentThread().sleep(5000); Object s3 = redisTemplate.opsForValue().get("blogRemark"); System.out.println("博客信息:" + s3); } catch (InterruptedException ie) { ie.printStackTrace(); } }
執行結果:
設置鍵的字符串,并返回其舊值。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void string3() { //設置鍵的字符串并返回其舊值 redisTemplate.opsForValue().set("blogRemark","pan_junbiao的博客"); Object oldVaule = redisTemplate.opsForValue().getAndSet("blogRemark","您好,歡迎訪問 pan_junbiao的博客"); Object newVaule = redisTemplate.opsForValue().get("blogRemark"); System.out.println("舊值:" + oldVaule); System.out.println("新值:" + newVaule); }
執行結果:
如果key已經存在,并且是一個字符串,則該命令將該值追加到字符串的末尾。如果key不存在,則它將被創建并設置為空字符串,因此 append 在這種特殊情況下類似于 set。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void string4() { //設置value的序列化規則,否則會報錯 redisTemplate.setValueSerializer(new StringRedisSerializer()); redisTemplate.opsForValue().append("blogRemark","您好,歡迎訪問 "); System.out.println(redisTemplate.opsForValue().get("blogRemark")); redisTemplate.opsForValue().append("blogRemark","pan_junbiao的博客"); System.out.println(redisTemplate.opsForValue().get("blogRemark")); }
執行結果:
注意:這里一定要注意反序列化配置,否則會報錯。
返回key所對應的value值的長度,見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void string5() { redisTemplate.opsForValue().set("userName","pan_junbiao的博客"); System.out.println("Value值:" + redisTemplate.opsForValue().get("userName")); System.out.println("Value值的長度:" + redisTemplate.opsForValue().size("userName")); }
執行結果:
Redis列表是簡單的字符串列表,按照插入順序排序。可以添加一個元素到列表的頭部(左邊)或尾部(右邊)。
使用list數據結果,可以做簡單的消息隊列的功能。還可以利用 Irange 命令,做基于Reids的分頁功能,性能極佳。
leftPushAll方法:表示把一個數組插入列表中。
rightPushAll方法:表示向列表的最右邊批量添加元素。具體用法見以下代碼:
/** * Redis操作列表(List) * @author pan_junbiao **/ @SpringBootTest public class ListTest { @Autowired private RedisTemplate redisTemplate; @Test public void list1() { String[] user1 = new String[]{"1","pan_junbiao的博客","您好,歡迎訪問 pan_junbiao的博客"}; String[] user2 = new String[]{"2","pan_junbiao的博客","https://blog.csdn.net/pan_junbiao"}; String[] user3 = new String[]{"3","pan_junbiao的博客","您好,歡迎訪問 pan_junbiao的博客"}; redisTemplate.opsForList().rightPushAll("user1",user1); redisTemplate.opsForList().rightPushAll("user2",user2); redisTemplate.opsForList().rightPushAll("user3",user3); System.out.println(redisTemplate.opsForList().range("user1",0,-1)); System.out.println(redisTemplate.opsForList().range("user2",0,-1)); System.out.println(redisTemplate.opsForList().range("user3",0,-1)); } }
執行結果:
leftPush方法:將所有指定的值插入在鍵的列表的頭部。如果鍵不存在,則在執行推送操作之前將其創建為空列表(從左邊插入)。
rightPush方法:將所有指定的值插入在鍵的列表的尾部。如果鍵不存在,則在執行推送操作之前將其創建為空列表(從右邊插入)。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void list2() { redisTemplate.opsForList().rightPush("userInfo",1); redisTemplate.opsForList().rightPush("userInfo","pan_junbiao的博客"); redisTemplate.opsForList().rightPush("userInfo","https://blog.csdn.net/pan_junbiao"); redisTemplate.opsForList().rightPush("userInfo","您好,歡迎訪問 pan_junbiao的博客"); System.out.println("用戶編號:" + redisTemplate.opsForList().index("userInfo",0)); System.out.println("用戶名稱:" + redisTemplate.opsForList().index("userInfo",1)); System.out.println("博客地址:" + redisTemplate.opsForList().index("userInfo",2)); System.out.println("博客信息:" + redisTemplate.opsForList().index("userInfo",3)); }
執行結果:
返回存儲在鍵中的列表的長度。如果鍵不存在,則將其解釋為空列表,并返回0。如果key存在的值不是列表,則返回錯誤。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void list3() { String[] user = new String[]{"1","pan_junbiao的博客","您好,歡迎訪問 pan_junbiao的博客"}; redisTemplate.opsForList().leftPushAll("user",user); System.out.println("列表的長度:" + redisTemplate.opsForList().size("user")); }
執行結果:
在列表中 index 的位置設置 value。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void list4() { String[] user = new String[]{"1","pan_junbiao的博客","https://blog.csdn.net/pan_junbiao"}; redisTemplate.opsForList().rightPushAll("user",user); System.out.println(redisTemplate.opsForList().range("user",0,-1)); redisTemplate.opsForList().set("user",2,"您好,歡迎訪問 pan_junbiao的博客"); System.out.println(redisTemplate.opsForList().range("user",0,-1)); }
執行結果:
根據下標獲取列表中的值(下標從0開始)。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void list2() { redisTemplate.opsForList().rightPush("userInfo",1); redisTemplate.opsForList().rightPush("userInfo","pan_junbiao的博客"); redisTemplate.opsForList().rightPush("userInfo","https://blog.csdn.net/pan_junbiao"); redisTemplate.opsForList().rightPush("userInfo","您好,歡迎訪問 pan_junbiao的博客"); System.out.println("用戶編號:" + redisTemplate.opsForList().index("userInfo",0)); System.out.println("用戶名稱:" + redisTemplate.opsForList().index("userInfo",1)); System.out.println("博客地址:" + redisTemplate.opsForList().index("userInfo",2)); System.out.println("博客信息:" + redisTemplate.opsForList().index("userInfo",3)); }
執行結果:
從存儲在鍵中的列表,刪除給定“count”值的元素的第1個計數事件。其中,參數count的含義如下:
count=0:刪除等于value的所有元素。
count>0:刪除等于從頭到尾移動的值的元素。
count<0:刪除等于從尾到頭移動的值的元素。
以下代碼用于刪除列表中第一次出現的值:
@Autowired private RedisTemplate redisTemplate; @Test public void list5() { String[] user = new String[]{"1","pan_junbiao的博客","您好,歡迎訪問 pan_junbiao的博客"}; redisTemplate.opsForList().rightPushAll("user",user); System.out.println(redisTemplate.opsForList().range("user",0,-1)); //將刪除列表中第一次出現的pan_junbiao的博客 redisTemplate.opsForList().remove("user",1,"pan_junbiao的博客"); System.out.println(redisTemplate.opsForList().range("user",0,-1)); }
執行結果:
leftPop方法:彈出最左邊的元素,彈出之后該值在列表中將不復存在。
rightPop方法:彈出最右邊的元素,彈出之后該值在列表中將不復存在。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void list6() { String[] user = new String[]{"1","pan_junbiao的博客","您好,歡迎訪問 pan_junbiao的博客"}; redisTemplate.opsForList().rightPushAll("user",user); System.out.println(redisTemplate.opsForList().range("user",0,-1)); //彈出最右邊的元素,彈出之后該值在列表中將不復存在 System.out.println(redisTemplate.opsForList().rightPop("user")); System.out.println(redisTemplate.opsForList().range("user",0,-1)); }
執行結果:
Redis 中的 hash(哈希)是一個 string 類型的 field 和 value 的映射表,hash 特別適合用于存儲對象。value 中存放的是結構化的對象。利用這樣數據結果,可以方便地操作其中的某個字段。比如在“單點登錄”時,可以用這種數據結構存儲用戶信息。以 CookieId 作為 key,設置30分鐘為緩存過期時間,能很好地模擬出類似 Session 的效果。
putAll方法:用 m 中提供的多個散列字段設置到 key 對應的散列表中。
entries方法:根據密鑰獲取整個散列存儲。具體用法見以下代碼:
/** * Redis操作哈希(Hash) * @author pan_junbiao **/ @SpringBootTest public class HashTest { @Autowired private RedisTemplate redisTemplate; @Test public void hash2() { Map<String,Object> userMap = new HashMap<>(); userMap.put("userName","pan_junbiao的博客"); userMap.put("blogRemark","您好,歡迎訪問 pan_junbiao的博客"); redisTemplate.opsForHash().putAll("userHash",userMap); System.out.println(redisTemplate.opsForHash().entries("userHash")); } }
執行結果:
put方法:設置 hashKey 的值。
get方法:從鍵中的散列獲取給定 hashKey 的值。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void hash3() { redisTemplate.opsForHash().put("userHash","userName","pan_junbiao的博客"); redisTemplate.opsForHash().put("userHash","blogUrl","https://blog.csdn.net/pan_junbiao"); redisTemplate.opsForHash().put("userHash","blogRemark","您好,歡迎訪問 pan_junbiao的博客"); System.out.println("用戶名稱:" + redisTemplate.opsForHash().get("userHash","userName")); System.out.println("博客地址:" + redisTemplate.opsForHash().get("userHash","blogUrl")); System.out.println("博客信息:" + redisTemplate.opsForHash().get("userHash","blogRemark")); }
執行結果:
values方法:根據密鑰獲取整個散列存儲的值。
keys方法:根據密鑰獲取整個散列存儲的鍵。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void hash4() { redisTemplate.opsForHash().put("userHash","userName","pan_junbiao的博客"); redisTemplate.opsForHash().put("userHash","blogRemark","您好,歡迎訪問 pan_junbiao的博客"); System.out.println("散列存儲的值:" + redisTemplate.opsForHash().values("userHash")); System.out.println("散列存儲的鍵:" + redisTemplate.opsForHash().keys("userHash")); }
執行結果:
hasKey方法:確定 hashKey 是否存在。
size方法:獲取 key 所對應的散列表的大小個數。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void hash5() { redisTemplate.opsForHash().put("userHash","userName","pan_junbiao的博客"); redisTemplate.opsForHash().put("userHash","blogUrl","https://blog.csdn.net/pan_junbiao"); redisTemplate.opsForHash().put("userHash","blogRemark","您好,歡迎訪問 pan_junbiao的博客"); System.out.println(redisTemplate.opsForHash().hasKey("userHash","userName")); System.out.println(redisTemplate.opsForHash().hasKey("userHash","age")); System.out.println(redisTemplate.opsForHash().size("userHash")); }
執行結果:
刪除給定的 hashKeys。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void hash6() { redisTemplate.opsForHash().put("userHash","userName","pan_junbiao的博客"); redisTemplate.opsForHash().put("userHash","blogRemark","您好,歡迎訪問 pan_junbiao的博客"); System.out.println(redisTemplate.opsForHash().delete("userHash","blogRemark")); System.out.println(redisTemplate.opsForHash().entries("userHash")); }
執行結果:
set 是存放不重復值的集合。利用 set 可以做全局去重復的功能。還可以進行交集、并集、差集等操作,也可用來實現計算共同喜好、全部的喜好、自己獨有的喜好等功能。
Redis 的 set 是 string 類型的無序集合,通過散列表實現。
add方法:在無序集合中添加元素,返回添加個數;如果存在重復的則不進行添加。
members方法:返回集合中的所有成員。具體用法見以下代碼:
/** * Redis操作集合(Set) * @author pan_junbiao **/ @SpringBootTest public class SetTest { @Autowired private RedisTemplate redisTemplate; @Test public void set1() { String[] citys = new String[]{"北京","上海","廣州","深圳"}; System.out.println(redisTemplate.opsForSet().add("citySet",citys)); System.out.println(redisTemplate.opsForSet().add("citySet","香港","澳門","臺灣")); //返回集合中的所有元素 System.out.println(redisTemplate.opsForSet().members("citySet")); } }
執行結果:
移除集合中一個或多個成員。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void set2() { String[] citys = new String[]{"北京","上海","廣州","深圳"}; System.out.println(redisTemplate.opsForSet().add("citySet",citys)); System.out.println(redisTemplate.opsForSet().remove("citySet",citys)); }
執行結果:
移除并返回集合中的一個隨機元素。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void set3() { String[] citys = new String[]{"北京","上海","廣州","深圳"}; System.out.println(redisTemplate.opsForSet().add("citySet",citys)); System.out.println(redisTemplate.opsForSet().pop("citySet")); System.out.println(redisTemplate.opsForSet().members("citySet")); }
執行結果:
將 member 元素移動。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void set4() { String[] citys = new String[]{"北京","上海","廣州","深圳"}; System.out.println(redisTemplate.opsForSet().add("citySet",citys)); System.out.println(redisTemplate.opsForSet().move("citySet","深圳","citySet2")); System.out.println(redisTemplate.opsForSet().members("citySet")); System.out.println(redisTemplate.opsForSet().members("citySet2")); }
執行結果:
用于遍歷 Set。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void set5() { String[] citys = new String[]{"北京","上海","廣州","深圳"}; System.out.println(redisTemplate.opsForSet().add("citySet",citys)); Cursor<Object> cursor = redisTemplate.opsForSet().scan("citySet", ScanOptions.NONE); while(cursor.hasNext()) { System.out.println(cursor.next()); } }
執行結果:
Set<V> intersect(K key1, K key2)方法、Long intersectAndStore(K key1, K key2, K destKey)方法:交集。
Set<V> union(K key1, K key2)方法、Long unionAndStore(K key1, K key2, K destKey)方法:并集。
Set<V> difference(K key1, K key2)方法、Long differenceAndStore(K key1, K key2, K destKey)方法:差集。
具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void set6() { String[] city1 = new String[]{"北京", "上海", "廣州", "深圳", "昆明"}; String[] city2 = new String[]{"北京", "深圳", "昆明", "成都"}; System.out.println(redisTemplate.opsForSet().add("citySet1", city1)); System.out.println(redisTemplate.opsForSet().add("citySet2", city2)); //返回集合中的所有元素 System.out.println("城市集合1:" + redisTemplate.opsForSet().members("citySet1")); System.out.println("城市集合2:" + redisTemplate.opsForSet().members("citySet2")); //求交集、并集、差集(方式一) System.out.println("求交集、并集、差集(方式一):"); System.out.println("交集:" + redisTemplate.opsForSet().intersect("citySet1","citySet2")); System.out.println("并集:" + redisTemplate.opsForSet().union("citySet1","citySet2")); System.out.println("差集:" + redisTemplate.opsForSet().difference("citySet1","citySet2")); //求交集、并集、差集(方式二) redisTemplate.opsForSet().intersectAndStore("citySet1","citySet2", "intersectCity"); redisTemplate.opsForSet().unionAndStore("citySet1","citySet2", "unionCity"); redisTemplate.opsForSet().differenceAndStore("citySet1","citySet2", "differenceCity"); System.out.println("求交集、并集、差集(方式二):"); System.out.println("交集:" + redisTemplate.opsForSet().members("intersectCity")); System.out.println("并集:" + redisTemplate.opsForSet().members("unionCity")); System.out.println("差集:" + redisTemplate.opsForSet().members("differenceCity")); }
執行結果:
zset(Sorted Set 有序集合)也是 string 類型元素的集合,且不允許重復的成員。每個元素都會關聯一個 double 類型的分數。可以通過分數將該集合中的成員從小到大進行排序。
zset 的成員是唯一的,但權重參數分數(score)卻可以重復。集合中的元素能夠按 score 進行排列。它可以用來做排行榜應用、取TOP/N、延時任務、范圍查找等。
增加一個有序集合。具體用法見以下代碼:
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.DefaultTypedTuple; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ZSetOperations; import java.util.HashSet; import java.util.Set; /** * Redis操作有序集合(Sorted Set) * @author pan_junbiao **/ @SpringBootTest public class SortedSetTest { @Autowired private RedisTemplate redisTemplate; @Test public void Zset1() { ZSetOperations.TypedTuple<String> objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6); ZSetOperations.TypedTuple<String> objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5); ZSetOperations.TypedTuple<String> objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4); Set<ZSetOperations.TypedTuple<String>> typles = new HashSet<ZSetOperations.TypedTuple<String>>(); typles.add(objectTypedTuple1); typles.add(objectTypedTuple2); typles.add(objectTypedTuple3); System.out.println(redisTemplate.opsForZSet().add("typles",typles)); System.out.println(redisTemplate.opsForZSet().range("typles",0,-1)); } }
執行結果:
新增一個有序集合,存在的話為false,不存在的話為true。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void Zset2() { System.out.println(redisTemplate.opsForZSet().add("zset2", "pan_junbiao的博客_01", 9.6)); System.out.println(redisTemplate.opsForZSet().add("zset2", "pan_junbiao的博客_01", 9.6)); }
執行結果:
從有序集合中移除一個或者多個元素。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void Zset3() { System.out.println(redisTemplate.opsForZSet().add("zset3", "pan_junbiao的博客_01", 1.0)); System.out.println(redisTemplate.opsForZSet().add("zset3", "pan_junbiao的博客_02", 1.0)); System.out.println(redisTemplate.opsForZSet().range("zset3", 0, -1)); System.out.println(redisTemplate.opsForZSet().remove("zset3", "pan_junbiao的博客_02")); System.out.println(redisTemplate.opsForZSet().range("zset3", 0, -1)); }
執行結果:
返回有序集中指定成員的排名,其中有序集成員按分數值遞增(從小到大)順序排列。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void Zset4() { System.out.println(redisTemplate.opsForZSet().add("zset4", "pan_junbiao的博客_01",9.6)); System.out.println(redisTemplate.opsForZSet().add("zset4", "pan_junbiao的博客_02",1.5)); System.out.println(redisTemplate.opsForZSet().add("zset4", "pan_junbiao的博客_03",7.4)); System.out.println(redisTemplate.opsForZSet().range("zset4", 0, -1)); System.out.println(redisTemplate.opsForZSet().rank("zset4", "pan_junbiao的博客_02")); }
執行結果:
注意:結果中的0表示第一(最小)。
range方法:通過索引區間返回有序集合成指定區間內的成員,其中有序集成員按分數值遞增(從小到大)順序排列。
rangeByScore方法:通過分數區間返回有序集合成指定區間內的成員,其中有序集成員按分數值遞增(從小到大)順序排列。
具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void Zset5() { ZSetOperations.TypedTuple<String> objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6); ZSetOperations.TypedTuple<String> objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5); ZSetOperations.TypedTuple<String> objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4); Set<ZSetOperations.TypedTuple<String>> typles = new HashSet<ZSetOperations.TypedTuple<String>>(); typles.add(objectTypedTuple1); typles.add(objectTypedTuple2); typles.add(objectTypedTuple3); System.out.println(redisTemplate.opsForZSet().add("zset5",typles)); System.out.println(redisTemplate.opsForZSet().range("zset5",0,-1)); System.out.println(redisTemplate.opsForZSet().rangeByScore("zset5", 0, 8)); }
執行結果:
count方法:通過分數返回有序集合指定區間內的成員個數。
size方法:獲取有序集合的成員數。
具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void Zset6() { ZSetOperations.TypedTuple<String> objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6); ZSetOperations.TypedTuple<String> objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5); ZSetOperations.TypedTuple<String> objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4); Set<ZSetOperations.TypedTuple<String>> typles = new HashSet<ZSetOperations.TypedTuple<String>>(); typles.add(objectTypedTuple1); typles.add(objectTypedTuple2); typles.add(objectTypedTuple3); redisTemplate.opsForZSet().add("zset6", typles); System.out.println("分數在0至8區間內的成員個數:" + redisTemplate.opsForZSet().count("zset6", 0, 8)); System.out.println("有序集合的成員數:" + redisTemplate.opsForZSet().size("zset6")); }
執行結果:
獲取指定成員的score值。具體用法見以下代碼:
@Test public void Zset7() { redisTemplate.opsForZSet().add("zset7", "pan_junbiao的博客_01", 9.6); redisTemplate.opsForZSet().add("zset7", "pan_junbiao的博客_02", 1.5); redisTemplate.opsForZSet().add("zset7", "pan_junbiao的博客_03", 7.4); System.out.println("pan_junbiao的博客_01的分數:" + redisTemplate.opsForZSet().score("zset7", "pan_junbiao的博客_01")); System.out.println("pan_junbiao的博客_02的分數:" + redisTemplate.opsForZSet().score("zset7", "pan_junbiao的博客_02")); System.out.println("pan_junbiao的博客_03的分數:" + redisTemplate.opsForZSet().score("zset7", "pan_junbiao的博客_03")); }
執行結果:
移除指定索引位置的成員,有序集合成員按照分數值遞增(從小到大)順序排列。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void Zset8() { ZSetOperations.TypedTuple<String> objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6); ZSetOperations.TypedTuple<String> objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5); ZSetOperations.TypedTuple<String> objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4); Set<ZSetOperations.TypedTuple<String>> tuples = new HashSet<ZSetOperations.TypedTuple<String>>(); tuples.add(objectTypedTuple1); tuples.add(objectTypedTuple2); tuples.add(objectTypedTuple3); System.out.println(redisTemplate.opsForZSet().add("zset8", tuples)); System.out.println(redisTemplate.opsForZSet().range("zset8", 0, -1)); System.out.println(redisTemplate.opsForZSet().removeRange("zset8", 1, 5)); System.out.println(redisTemplate.opsForZSet().range("zset8", 0, -1)); }
執行結果:
遍歷 zset。具體用法見以下代碼:
@Autowired private RedisTemplate redisTemplate; @Test public void Zset9() { ZSetOperations.TypedTuple<String> objectTypedTuple1 = new DefaultTypedTuple<>("pan_junbiao的博客_01",9.6); ZSetOperations.TypedTuple<String> objectTypedTuple2 = new DefaultTypedTuple<>("pan_junbiao的博客_02",1.5); ZSetOperations.TypedTuple<String> objectTypedTuple3 = new DefaultTypedTuple<>("pan_junbiao的博客_03",7.4); Set<ZSetOperations.TypedTuple<String>> tuples = new HashSet<ZSetOperations.TypedTuple<String>>(); tuples.add(objectTypedTuple1); tuples.add(objectTypedTuple2); tuples.add(objectTypedTuple3); System.out.println(redisTemplate.opsForZSet().add("zset9", tuples)); Cursor<ZSetOperations.TypedTuple<Object>> cursor = redisTemplate.opsForZSet().scan("zset9", ScanOptions.NONE); while (cursor.hasNext()) { ZSetOperations.TypedTuple<Object> item = cursor.next(); System.out.println(item.getValue() + " 的分數值:" + item.getScore()); } }
執行結果:
感謝各位的閱讀,以上就是“SpringBoot怎么使用RedisTemplate操作Redis數據類型”的內容了,經過本文的學習后,相信大家對SpringBoot怎么使用RedisTemplate操作Redis數據類型這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。