日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

简化Redis数据访问代码RedisTemplate

發布時間:2024/4/15 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简化Redis数据访问代码RedisTemplate 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

---恢復內容開始---

?

Redis數據結構簡介:

Redis可以存儲鍵與5中數據結構類型之間的映射,這5中數據結構類型分別是;String(字符串),List(列表),Set(集合),Hash(散列)和ZSet(有序集合)。

下面對這5中數據結構做簡單的介紹:

String:可以是字符串,整數和浮點數。對整個字符串和字符串其中的一部分執行操作;對象的浮點數執行自增(increment)或者自減(decrement)。

List:一個鏈表,鏈表上的每個節點都包含一個字符串;從鏈表的兩端推入和彈出元素,根據偏移量對鏈表作出裁剪(trim);讀取單個或者是多個元素,根據值來查找或者是移除元素。

Set:包含字符串的無序收集器(unorderedcollection),并且被包含的每個字符串都是獨一無二的、各不相同;添加獲取或者是移除單個元素;檢查一個元素是否存在于某個集合中,計算交集并集和差集,從集合里隨機獲取元素。

Hash:包含鍵值對的無序散列表;添加獲取移除單個鍵值對。獲取所有的鍵值對。

ZSet:字符串成員(member)與浮點數分值(score)之間的有序映射,元素的排列順序由分值的大小決定;添加,獲取,刪除單個元素;根據分值范圍(range)或者成員來獲取元素。

下面介紹spring封裝的RedisTemplate對這5種數據結構的運用做分析:

RedisTemplate的介紹:

spring封裝了redisTemplate對象來進行對redis的各種操作,它支持所有的redis原生api。

類型參數(Type Parameter)

K:模板工作的Redis鍵類型(通常是一個字符串),RedisTemplate<String,Object>

注意:如果沒有特殊情況,切勿定義為RedisTemplate<Object,Object>,否則根據里氏替換原則,使用的時候會造成類型錯誤。

V:是模板工作中Redis值的類型

RedisTemplate定義了對5種數據結構操作:

redisTemplate.opsForValue(); // 操作字符串 redisTemplate.opsForHash(); // 操作hash redisTemplate.opsForList(); // 操作List redisTemplate.opsForSet(); // 操作Set redisTemplate.opsForZSet(); // 操作有序Set

StringRedisTemplate與RedisTemplate:

兩者的關系是StringRedisTemplate繼承RedisTemplate。

兩者的數據是不共通的,也就是說StringRedisTemplate只能管理StringRedisTemplate里面的數據;RedisTemplate只能管理RedisTemplate里面的數據。

SDR默認采用的序列化策略有兩種,一種是String的序列化策略。一種是jdk的序列化策略。

StringRedisTemplate默認采用的是String序列化策略,保存的是key和value都是采用這種策略序列化保存的。

RedisTemplate默認采用的是jdk的序列化策略,保存的key和value都是采用此策略序列化保存。

RedisTemplate的配置如下:

@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jack2JsonRedisSerializer<Object>(Object.class);ObjectMpper om = new ObjectMapper();om.setVisibility(PropertyAccessor.All,JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);RedisTemplate<String,Object> template = new RedisTemplate<String,Object>();template.setConnectionFactory(redisConnectionFactory);template.setKeySerializer(jackson2JsonRedisSerializer);template.setValueSerializer(jackson2JsonRedisSerializer);template.setHashKeySerializer(jackson2JsonRedisSerializer);template.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template; }

Redis的String數據結構(推薦使用StringRedisTemplate)

注意:如果是RedisTemplate需要修改序列化方式。

RedisSerializer<String> stringRedisSerializer = new RedisSerializer(); template.setKeySerializer(stringRedisSerializer); template.setValueSerilizer(stringRedisSerializer); template.setHashKeySerializer(stringRedisSerializer); template.setHashValueSerializer(stringRedisSerializer);

set void set(K key,V value);

使用:redisTemplate.opsForValue().set("name","tom"); 結果:redisTemplate.opsForValue().get("name"); // 輸出結果為tomset

?set void set(K key,V value,long timeOut,TimeUnit unit);

使用:redisTemplate.opsForValue().set("name","tom",10,TimeUnit.SECONDS); 結果:redisTemplate.opsForValue().get("name") // 由于設置的是十秒失效,十秒之內查詢有結果,十秒之后返回為null

set?void?set(K,key,V?value,long?offset);

該方法是用value參數覆寫(override)給定key所儲存的字符串值,從偏移量offset開始。

使用:template.opsForValue().set("key","Helo world"); templste.opsForValue().set("key","redis",6); System.out.println("**********"+template.opsForValue().get("key")); 輸出結果:**********Hello redis

selfAbsent Boolean selfAbsent(K key,V value);

使用:System.out.println(template.opsForValue().setIfAbsent("multi1","multi1"));// false System.out.println(template.opsForValue().setIfAbsent("multi2","multi2"));// true結果:false表示以前已經存在,true表示以前不存在

multiSet void multiSet(Map <? extends K, ? extends V> m);為多個鍵分別設置他們的值

使用: Map<String,String> maps = new HashMap<String,String>(); maps.put("multi1","multi1"); maps.put("multi2","multi2'); maps.put("muliti3","multi3"); template.opsForValue().multiSet(maps); List<String> keys = new ArrayList<String>(); keys.add("multi1"); keys.add("multi2"); keys.add("multi3"); System.out.println(template.opsForValue().multiGet(keys)); 結果: [multi1,multi2,multi3]

multiSetIfAbsent Boolean multiSetIfAbsent(Map<? extends K, ? extends V> m);為多個鍵分別設置它們的值,如果存在則返回false,不存在則返回true

使用: Map<String,String> maps = new HashMap<String,String>(); maps.put("multi1","multi1"); maps.put("multi2","multi2"); maps.put("multi3","multi3");
Maps<String,String> maps2 = new HashMap<String,String>();
maps2.put("multi11","multi11");
maps2.put("multi22","multi22");
maps2.put("multi33","multi33");
System.out.println(template.opsForValue().multiSetIfAbsent(maps))
System.out.println(template.opsForValue().multiSetIfAbsent(maps2))
// 如果存在則返回false,不存在則返回true

get V get (Object key);

使用: template.opsForValue().set("key","Hello world"); System.out.println("********"+template.opsForValue().get("key")); 輸出結果:"*********"Hello world

getAndSet V getAndSet(K key, V value);
設置鍵的字符串值并返回其舊值

使用:template.opsForValue().set("getSetTest","test"); System.out.println(template.opsForValue().getAndSet("getSetTest","test2")); 結果:test

?

?

?

?

?

---恢復內容結束---

轉載于:https://www.cnblogs.com/hengzhou/p/9542720.html

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的简化Redis数据访问代码RedisTemplate的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。