简化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(); // 操作有序SetStringRedisTemplate與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") // 由于設置的是十秒失效,十秒之內查詢有結果,十秒之后返回為nullset?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 redisselfAbsent 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 worldgetAndSet V getAndSet(K key, V value);
設置鍵的字符串值并返回其舊值
?
?
?
?
?
---恢復內容結束---
轉載于:https://www.cnblogs.com/hengzhou/p/9542720.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的简化Redis数据访问代码RedisTemplate的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式---接口隔离模式之门面模式(F
- 下一篇: linux/windows中mysql、