帶你進spring-集成redis

Redis是key-value存儲的非關(guān)系型數(shù)據(jù)庫。Spring Data Redis包含了多個模板實現(xiàn)赖欣,用來完成Redis數(shù)據(jù)庫的數(shù)據(jù)存取功能

1转绷、如何連接Redis?

Spring Data Redis提供了JedisConnectFactory連接工廠(不止這一個)

2笛钝、使用模板

Spring Data Redis提供了RedisTemplate 和 StringRedisTemplate模板。模板封裝了對redis操作低零,提供了較高級的數(shù)據(jù)訪問方案婆翔。從名字可以看出后者只關(guān)注字符串類型,當redis的key和value都是字符串時候建議使用StringRedisTemplate

RedisTemplate的很多功能以子API的形式提供掏婶,他們區(qū)分了單個值和集合值得場景啃奴。

package com.cn.util;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.stereotype.Component;

import java.util.List;

import java.util.Set;

@Component

public class JedisUtil {

@Autowired

private RedisTemplate redisTemplate;

//字符串

public void setStr(String key, Object value){

redisTemplate.opsForValue().set(key, value);

}

public Object getStr(String key){

return redisTemplate.opsForValue().get(key);

}

//list集合

public void lpush(String key, Object value){

redisTemplate.opsForList().leftPush(key, value);

}

public Object lpop(String key){

return redisTemplate.opsForList().leftPop(key);

}

public List lrange(String key, long start , long end){

return redisTemplate.opsForList().range(key, start, end);

}

//set集合

public void addSet(String key, String value){

redisTemplate.opsForSet().add(key, value);

}

public Set getSet(String key){

return redisTemplate.opsForSet().members(key);

}

//hash集合

public void hset(String key, String key1, String value){

redisTemplate.opsForHash().put(key, key1, value);

}

public Object hget(String key, String key1){

return redisTemplate.opsForHash().get(key, key1);

}

public Set getKeys(String key){

return redisTemplate.opsForHash().keys(key);

}

}

測試類

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = {"classpath:springMvc.xml", "classpath:spring-source.xml"})

public class JedisUtilTest {

@Autowired

private JedisUtil jedisUtil;

@Test

public void setStr() throws Exception {

jedisUtil.setStr("shoudu","beijing");

}

@Test

public void getStr() throws Exception {

Object obj=jedisUtil.getStr("shoudu");

System.out.println(obj);

}

@Test

public void lpush() throws Exception {

jedisUtil.lpush("testlist",new User("ii","ll"));

}

@Test

public void lpop() throws Exception {

Object obj= jedisUtil.lpop("testlist");

System.out.println(obj);

}

@Test

public void lrange() throws Exception {

List list=jedisUtil.lrange("testlist", 0 , -1);

System.out.println(list);

}

@Test

public void addSet() throws Exception {

jedisUtil.addSet("testset", "jj2");

}

@Test

public void getSet() throws Exception {

Object obj = jedisUtil.getSet("testset");

System.out.println(obj);

}

@Test

public void hset() throws Exception {

jedisUtil.hset("testhash", "name", "liming");

}

@Test

public void hget() throws Exception {

Object obj=jedisUtil.hget("testhash","name");

System.out.println(obj);

}

@Test

public void getKeys() throws Exception {

Set keys=jedisUtil.getKeys("testhash");

System.out.println(keys);

}

@Test

public void muchOps() throws Exception{

BoundHashOperations boundHashOperations=

jedisUtil.redisTemplate.boundHashOps("testhash");

String str=boundHashOperations.getKey();

System.out.println(str);

Object obj=boundHashOperations.get("name");

System.out.println(obj);

boundValueOperations.put("age",123);

boundValueOperations.put("school","beida");

Set keys=boundHashOperations.keys();

System.out.println(keys);

}

}

以上測試方法,僅僅測試了每種redis數(shù)據(jù)類型的部分方法雄妥。注意最蕾,最后muchOps()測試方法,redisTemplate提供綁定key(此處為hash類型的key老厌,其它類型類似)的方式執(zhí)行操作瘟则,整個方法中僅僅一個地方使用了key,即jedisUtil.redisTemplate.boundHashOps("testhash")枝秤,對返回的boundValueOperations執(zhí)行的所有操作都會應(yīng)用到這個key上醋拧。

3、使用key和value的序列化器

當某個key-value條目保存到Redis存儲時候,key和value都會使用Redis序列化器進行序列化丹壕。Spring Date Redis 提供了多個序列化器:

1)JdkSerializationRedisSerializer:POJO對象的存取場景庆械,使用JDK本身序列化機制,將pojo類通過ObjectInputStream/ObjectOutputStream進行序列化操作菌赖,最終redis-server中將存儲字節(jié)序列缭乘。是目前最常用的序列化策略。

2)StringRedisSerializer:Key或者value為字符串的場景琉用,根據(jù)指定的charset對數(shù)據(jù)的字節(jié)序列編碼成string堕绩,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封裝。是最輕量級和高效的策略邑时。

3)JacksonJsonRedisSerializer:jackson-json工具提供了javabean與json之間的轉(zhuǎn)換能力奴紧,可以將pojo實例序列化成json格式存儲在redis中,也可以將json格式的數(shù)據(jù)轉(zhuǎn)換成pojo實例晶丘。因為jackson工具在序列化和反序列化時绰寞,需要明確指定Class類型,因此此策略封裝起來稍微復(fù)雜铣口。【需要jackson-mapper-asl工具支持】

4)OxmSerializer:提供了將javabean與xml之間的轉(zhuǎn)換能力觉壶,目前可用的三方支持包括jaxb脑题,apache-xmlbeans;redis存儲的數(shù)據(jù)將是xml工具铜靶。不過使用此策略叔遂,編程將會有些難度,而且效率最低争剿;不建議使用已艰。【需要spring-oxm模塊的支持

RedisTemplate中需要聲明4種serializer蚕苇,默認為“JdkSerializationRedisSerializer”:

a) keySerializer :對于普通K-V操作時哩掺,key采取的序列化策略

b) valueSerializer:value采取的序列化策略

c) hashKeySerializer: 在hash數(shù)據(jù)結(jié)構(gòu)中,hash-key的序列化策略

d) hashValueSerializer:hash-value的序列化策略

StringRedisTemplate也需要申明4中serializer涩笤,但是默認為“StringRedisSerializer”嚼吞,可以看StringRedisTemplate類的源碼:

package org.springframework.data.redis.core;

import org.springframework.data.redis.connection.DefaultStringRedisConnection;

import org.springframework.data.redis.connection.RedisConnection;

import org.springframework.data.redis.connection.RedisConnectionFactory;

import org.springframework.data.redis.serializer.RedisSerializer;

import org.springframework.data.redis.serializer.StringRedisSerializer;

public class StringRedisTemplate extends RedisTemplate {

public StringRedisTemplate() {

RedisSerializer stringSerializer = new StringRedisSerializer(); //StringRedisSerializer序列器

this.setKeySerializer(stringSerializer);

this.setValueSerializer(stringSerializer);

this.setHashKeySerializer(stringSerializer);

this.setHashValueSerializer(stringSerializer);

}

public StringRedisTemplate(RedisConnectionFactory connectionFactory) {

this();

this.setConnectionFactory(connectionFactory);

this.afterPropertiesSet();

}

protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {

return new DefaultStringRedisConnection(connection);

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蹬碧,隨后出現(xiàn)的幾起案子舱禽,更是在濱河造成了極大的恐慌,老刑警劉巖恩沽,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件誊稚,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機里伯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門城瞎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俏脊,你說我怎么就攤上這事全谤。” “怎么了爷贫?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵认然,是天一觀的道長。 經(jīng)常有香客問我漫萄,道長卷员,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任腾务,我火速辦了婚禮毕骡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岩瘦。我一直安慰自己未巫,他們只是感情好,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布启昧。 她就那樣靜靜地躺著叙凡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪密末。 梳的紋絲不亂的頭發(fā)上握爷,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機與錄音严里,去河邊找鬼新啼。 笑死,一個胖子當著我的面吹牛刹碾,可吹牛的內(nèi)容都是我干的燥撞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼教硫,長吁一口氣:“原來是場噩夢啊……” “哼叨吮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞬矩,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤茶鉴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后景用,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涵叮,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡惭蹂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了割粮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盾碗。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖舀瓢,靈堂內(nèi)的尸體忽然破棺而出廷雅,到底是詐尸還是另有隱情,我是刑警寧澤京髓,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布航缀,位于F島的核電站,受9級特大地震影響堰怨,放射性物質(zhì)發(fā)生泄漏芥玉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一备图、第九天 我趴在偏房一處隱蔽的房頂上張望灿巧。 院中可真熱鬧训柴,春花似錦相满、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幢痘。三九已至,卻和暖如春家破,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背购岗。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工汰聋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喊积。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓烹困,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乾吻。 傳聞我的和親對象是個殘疾皇子髓梅,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)绎签,斷路器枯饿,智...
    卡卡羅2017閱讀 134,702評論 18 139
  • 夏夜,公園里靜悄悄的诡必。水池里奢方,睡蓮剛閉上眼睛,就被哭聲驚醒了。她睜開眼睛一看蟋字,是一只小螞蟻稿蹲,趴在一根水草上。問小螞...
    李艾娟閱讀 480評論 0 0
  • 2018年5月10日 星期四 天氣晴 今天正式失業(yè)了鹊奖,以后工作就是看兒子苛聘,接送女兒,哈哈哈 ...
    張涵舒閱讀 239評論 0 1
  • 今天見了一窩麻雀忠聚,一只野兔设哗,一條魚。 今天眼睜睜看著太陽一寸寸挪到那山的后面咒林,想起了小學一篇課文《和時間賽跑》熬拒,明...
    唐僧娶媳婦閱讀 448評論 2 0
  • jquery 能做什么? jQuery是JavaScript的一個庫垫竞,封裝了各種API澎粟,處理了瀏覽器的兼容問題。 ...
    輝夜乀閱讀 199評論 0 0