Spring Boot(十一)Redis集成從Docker安裝到分布式Session共享

一伦腐、簡介

Redis是一個開源的使用ANSI C語言編寫赢底、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型柏蘑、Key-Value數(shù)據(jù)庫幸冻,并提供多種語言的API,Redis也是技術(shù)領(lǐng)域使用最為廣泛的存儲中間件咳焚,它是「Remote Dictionary Service」首字母縮寫洽损,也就是「遠程字典服務(wù)」。

Redis相比Memcached提供更多的數(shù)據(jù)類型支持和數(shù)據(jù)持久化操作黔攒。

二趁啸、在Docker中安裝Redis

2.1 下載鏡像

訪問官網(wǎng):https://hub.docker.com/r/library/redis/ 選擇下載版本,本文選擇最新Stable 4.0.11

使用命令拉取鏡像:

docker pull redis:4.0.11

2.2 啟動容器

啟動Redis命令如下:

docker run --name myredis -p 6379:6379 -d redis:4.0.11 redis-server --appendonly yes

命令說明:

  • --name 設(shè)置別名
  • -p 映射宿主端口到容器端口
  • -d 后臺運行
  • redis-server --appendonly yes 在容器啟動執(zhí)行redis-server啟動命令督惰,打開redis持久化

啟動成功之后使用命令:

docker ps

查看redis運行請求不傅,如下圖為運行成功:

2.3 使用客戶端連接

連接Redis不錯的GUI工具應(yīng)該是Redis Desktop Manager了,不過現(xiàn)在只有Linux版可以免費下載赏胚,我上傳了一個Windows版本在百度云访娶,版本號為:0.9.5(發(fā)布于2018.08.24)也是比較新的,鏈接: https://pan.baidu.com/s/16npZtnGa3-p2PAafiPEAkA 密碼: 9uqg觉阅,還是免安裝的崖疤,很好用。

Redis Desktop Manager客戶端預覽:

三典勇、Redis集成

開發(fā)環(huán)境

  • Spring Boot 2.0.4 RELEASE
  • Manven

3.1 添加依賴

在pom.xml添加如下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

注意不要依賴“spring-boot-starter-redis”它是舊版本劫哼,新版已經(jīng)遷移到“spring-boot-starter-data-redis”了。

3.2 配置Redis

在application.properties進行如下設(shè)置:

# Redis 配置
# Redis服務(wù)器地址
spring.redis.host=127.0.0.1
# Redis服務(wù)器連接密碼(默認為空)
spring.redis.password=
# Redis服務(wù)器連接端口
spring.redis.port=6379  
# Redis分片(默認為0)Redis默認有16個分片
spring.redis.database=0
# 連接池最大連接數(shù)(使用負值表示沒有限制)
spring.redis.pool.max-active=8  
# 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1  
# 連接池中的最大空閑連接
spring.redis.pool.max-idle=8  
# 連接池中的最小空閑連接
spring.redis.pool.min-idle=0  
# 連接超時時間(毫秒)
spring.redis.timeout=10000
# 指定spring的緩存為redis
spring.cache.type=redis

注意:spring.redis.timeout不要設(shè)置為0割笙,設(shè)置為0查詢Redis時會報錯权烧,因為查詢連接時間太短了。

3.3 Redis使用

完成以上配置之后就可以寫代碼操作Redis了伤溉,示例代碼如下:

@Autowired
private StringRedisTemplate stringRedisTemplate;

@RequestMapping("/")
public String doTest() {
    String _key = "time"; //緩存key
    stringRedisTemplate.opsForValue().set(_key, String.valueOf(new Date().getTime())); //redis存值
    return stringRedisTemplate.opsForValue().get(_key); //redis取值
}

更多操作:

  • stringRedisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS); 向redis里存入數(shù)據(jù)和設(shè)置緩存時間般码;
  • stringRedisTemplate.hasKey("keyName"); 檢查key是否存在,返回boolean乱顾;

四板祝、聲明式緩存

為了簡化緩存可以直接使用聲名式緩存,可以省去設(shè)置緩存和讀取緩存的代碼走净,使用起來會方便很多券时。

聲明式緩存使用步驟如下:

4.1 設(shè)置Redis緩存

在pom.xml文件設(shè)置緩存為Redis,代碼如下:

spring.cache.type=redis

4.2 開啟全局緩存

在啟動文件Application.java設(shè)置開啟緩存伏伯,代碼如下:

@SpringBootApplication
@EnableCaching
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

4.3 使用注解

注解如下:

  • @Cacheable 設(shè)置并讀取緩存(第一次設(shè)置以后直接讀雀镂);
  • @CachePut 更新緩存(每次刪除并更新緩存結(jié)果)舵鳞;
  • @CacheEvict 刪除緩存(只刪除緩存)震檩;

通用屬性:

  • value 緩存名稱;
  • key 使用SpEL表達式自定義的緩存Key蜓堕,比如:#name是以參數(shù)name為key的緩存抛虏,#resule.name是以返回結(jié)果的name作為key的緩存;

4.3.1 @Cacheable 使用

示例代碼如下:

// 緩存key
private final String _CacheKey = "userCacheKeyTime";
    
@RequestMapping("/")
@Cacheable(value = _CacheKey)
public String index() {
    System.out.println("set cache");
    return "cache:" + new Date().getTime();
}

只有首次訪問的時候會在控制臺打印“set cache”信息套才,之后直接返回Redis結(jié)果了迂猴,不會在有添加的打印信息出現(xiàn)。

4.3.2 @CachePut 使用

示例代碼如下:

// 緩存key
private final String _CacheKey = "userCacheKeyTime";

@RequestMapping("/put")
@CachePut(value = _CacheKey)
public String putCache() {
    System.out.println("update cache");
    return "update cache:" + new Date().getTime();
}

訪問http://xxx/put 每次會把最新的數(shù)據(jù)存儲緩存起來背伴。

4.3.3 @CacheEvict 使用

示例代碼如下:

// 緩存key
private final String _CacheKey = "userCacheKeyTime";

@RequestMapping("/del")
@CacheEvict(value = _CacheKey)
public String delCache() {
    System.out.println("緩存刪除");
    return "delete cache:" + new Date().getTime();
}

訪問http://xxx/del 只會刪除緩存沸毁,除此之后不會進行任何操作峰髓。

五、分布式Session共享

在分布式系統(tǒng)中Session共享有很多種方案息尺,而把Session托管在緩存中是最常用的方案之一掷邦,下面來看Session在Redis中的托管步驟击罪。

5.1 添加依賴

在pom.xml中添加如下引用:

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>

5.2 開啟Session功能

在啟動類Application.java的類注解添加開啟Session,代碼如下:

@SpringBootApplication
@EnableCaching
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class RedisApplication {
    public static void main(String[] args) {
        SpringApplication.run(RedisApplication.class, args);
    }
}

其中maxInactiveIntervalInSeconds為Session過期時間,默認30分鐘挟鸠,設(shè)置單位為秒查邢。

5.3 Session使用

接下來編寫一段代碼來測試一下Session票渠,示例代碼如下:

@RequestMapping("/uid")
public String testSession(HttpSession session) {
    UUID uid = (UUID) session.getAttribute("uid");
    if (uid == null) {
        uid = UUID.randomUUID();
    }
    session.setAttribute("uid", uid);
    
    return session.getId();
}

連續(xù)訪問兩次請求之后庵朝,查看控制臺信息如下圖:

可以看出,兩次訪問的SessionId是一樣的侮腹,這個時候在查看Redis 客戶端嘲碧,如下圖:

發(fā)現(xiàn)Redis里存儲的Session過期時間也是對的,符合我們的設(shè)置父阻。

5.4 分布式系統(tǒng)共享Session

因為把Session托管給同一臺Redis服務(wù)器了呀潭,所以Session在Spring Boot中按照如上方式在配置多臺服務(wù)器,得到的Session是一樣的至非。

示例源碼下載:https://github.com/vipstone/springboot-example/tree/master/springboot-redis

參考資料

Spring boot中Redis的使用:http://www.ityouknow.com/springboot/2016/03/06/spring-boot-redis.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钠署,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子荒椭,更是在濱河造成了極大的恐慌谐鼎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趣惠,死亡現(xiàn)場離奇詭異狸棍,居然都是意外死亡,警方通過查閱死者的電腦和手機味悄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門草戈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侍瑟,你說我怎么就攤上這事唐片。” “怎么了涨颜?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵费韭,是天一觀的道長。 經(jīng)常有香客問我庭瑰,道長星持,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任弹灭,我火速辦了婚禮督暂,結(jié)果婚禮上揪垄,老公的妹妹穿的比我還像新娘。我一直安慰自己逻翁,他們只是感情好饥努,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卢未,像睡著了一般肪凛。 火紅的嫁衣襯著肌膚如雪堰汉。 梳的紋絲不亂的頭發(fā)上辽社,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音翘鸭,去河邊找鬼滴铅。 笑死,一個胖子當著我的面吹牛就乓,可吹牛的內(nèi)容都是我干的汉匙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼生蚁,長吁一口氣:“原來是場噩夢啊……” “哼噩翠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邦投,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤伤锚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后志衣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屯援,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年念脯,在試婚紗的時候發(fā)現(xiàn)自己被綠了狞洋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绿店,死狀恐怖吉懊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情假勿,我是刑警寧澤惕它,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站废登,受9級特大地震影響淹魄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜堡距,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一甲锡、第九天 我趴在偏房一處隱蔽的房頂上張望兆蕉。 院中可真熱鬧,春花似錦缤沦、人聲如沸虎韵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽包蓝。三九已至,卻和暖如春企量,著一層夾襖步出監(jiān)牢的瞬間测萎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工届巩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留硅瞧,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓恕汇,卻偏偏與公主長得像腕唧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瘾英,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

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