简化Redis数据访问代码RedisTemplate
---恢復(fù)內(nèi)容開始---
?
Redis數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)介:
Redis可以存儲(chǔ)鍵與5中數(shù)據(jù)結(jié)構(gòu)類型之間的映射,這5中數(shù)據(jù)結(jié)構(gòu)類型分別是;String(字符串),List(列表),Set(集合),Hash(散列)和ZSet(有序集合)。
下面對(duì)這5中數(shù)據(jù)結(jié)構(gòu)做簡(jiǎn)單的介紹:
String:可以是字符串,整數(shù)和浮點(diǎn)數(shù)。對(duì)整個(gè)字符串和字符串其中的一部分執(zhí)行操作;對(duì)象的浮點(diǎn)數(shù)執(zhí)行自增(increment)或者自減(decrement)。
List:一個(gè)鏈表,鏈表上的每個(gè)節(jié)點(diǎn)都包含一個(gè)字符串;從鏈表的兩端推入和彈出元素,根據(jù)偏移量對(duì)鏈表作出裁剪(trim);讀取單個(gè)或者是多個(gè)元素,根據(jù)值來查找或者是移除元素。
Set:包含字符串的無序收集器(unorderedcollection),并且被包含的每個(gè)字符串都是獨(dú)一無二的、各不相同;添加獲取或者是移除單個(gè)元素;檢查一個(gè)元素是否存在于某個(gè)集合中,計(jì)算交集并集和差集,從集合里隨機(jī)獲取元素。
Hash:包含鍵值對(duì)的無序散列表;添加獲取移除單個(gè)鍵值對(duì)。獲取所有的鍵值對(duì)。
ZSet:字符串成員(member)與浮點(diǎn)數(shù)分值(score)之間的有序映射,元素的排列順序由分值的大小決定;添加,獲取,刪除單個(gè)元素;根據(jù)分值范圍(range)或者成員來獲取元素。
下面介紹spring封裝的RedisTemplate對(duì)這5種數(shù)據(jù)結(jié)構(gòu)的運(yùn)用做分析:
RedisTemplate的介紹:
spring封裝了redisTemplate對(duì)象來進(jìn)行對(duì)redis的各種操作,它支持所有的redis原生api。
類型參數(shù)(Type Parameter)
K:模板工作的Redis鍵類型(通常是一個(gè)字符串),RedisTemplate<String,Object>
注意:如果沒有特殊情況,切勿定義為RedisTemplate<Object,Object>,否則根據(jù)里氏替換原則,使用的時(shí)候會(huì)造成類型錯(cuò)誤。
V:是模板工作中Redis值的類型
RedisTemplate定義了對(duì)5種數(shù)據(jù)結(jié)構(gòu)操作:
redisTemplate.opsForValue(); // 操作字符串 redisTemplate.opsForHash(); // 操作hash redisTemplate.opsForList(); // 操作List redisTemplate.opsForSet(); // 操作Set redisTemplate.opsForZSet(); // 操作有序SetStringRedisTemplate與RedisTemplate:
兩者的關(guān)系是StringRedisTemplate繼承RedisTemplate。
兩者的數(shù)據(jù)是不共通的,也就是說StringRedisTemplate只能管理StringRedisTemplate里面的數(shù)據(jù);RedisTemplate只能管理RedisTemplate里面的數(shù)據(jù)。
SDR默認(rèn)采用的序列化策略有兩種,一種是String的序列化策略。一種是jdk的序列化策略。
StringRedisTemplate默認(rèn)采用的是String序列化策略,保存的是key和value都是采用這種策略序列化保存的。
RedisTemplate默認(rèn)采用的是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數(shù)據(jù)結(jié)構(gòu)(推薦使用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"); 結(jié)果:redisTemplate.opsForValue().get("name"); // 輸出結(jié)果為tomset?set void set(K key,V value,long timeOut,TimeUnit unit);
使用:redisTemplate.opsForValue().set("name","tom",10,TimeUnit.SECONDS); 結(jié)果:redisTemplate.opsForValue().get("name") // 由于設(shè)置的是十秒失效,十秒之內(nèi)查詢有結(jié)果,十秒之后返回為nullset?void?set(K,key,V?value,long?offset);
該方法是用value參數(shù)覆寫(override)給定key所儲(chǔ)存的字符串值,從偏移量offset開始。
使用:template.opsForValue().set("key","Helo world"); templste.opsForValue().set("key","redis",6); System.out.println("**********"+template.opsForValue().get("key")); 輸出結(jié)果:**********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結(jié)果:false表示以前已經(jīng)存在,true表示以前不存在multiSet void multiSet(Map <? extends K, ? extends V> m);為多個(gè)鍵分別設(shè)置他們的值
使用: 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)); 結(jié)果: [multi1,multi2,multi3]multiSetIfAbsent Boolean multiSetIfAbsent(Map<? extends K, ? extends V> m);為多個(gè)鍵分別設(shè)置它們的值,如果存在則返回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")); 輸出結(jié)果:"*********"Hello worldgetAndSet V getAndSet(K key, V value);
設(shè)置鍵的字符串值并返回其舊值
?
?
?
?
?
---恢復(fù)內(nèi)容結(jié)束---
轉(zhuǎn)載于:https://www.cnblogs.com/hengzhou/p/9542720.html
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的简化Redis数据访问代码RedisTemplate的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式---接口隔离模式之门面模式(F
- 下一篇: yum安装apache及问题解决