1. 程式人生 > 資料庫 >Redis相關知識

Redis相關知識

Redis基礎知識

Redis是什麼

Redis是現在最受歡迎的NoSQL資料庫之一,Redis是一個使用ANSI C編寫的開源、包含多種資料結構、支援網路、基於記憶體、可選永續性的鍵值對儲存資料庫,其具備如下特性:

  • 基於記憶體執行,效能高效
  • 支援分散式,理論上可以無限擴充套件
  • key-value儲存系統
  • 開源的使用ANSI C語言編寫、遵守BSD協議、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API

相比於其他資料庫型別,Redis具備的特點是:

  • C/S通訊模型
  • 單程序單執行緒模型
  • 豐富的資料型別
  • 操作具有原子性
  • 持久化
  • 高併發讀寫
  • 支援lua指令碼

哪些大廠在使用Redis?

  • github
  • twitter
  • 微博
  • Stack Overflow
  • 阿里巴巴
  • 百度
  • 美團
  • 搜狐

Redis的應用場景有哪些?

Redis 的應用場景包括:快取系統(“熱點”資料:高頻讀、低頻寫)、計數器、訊息佇列系統、排行榜、社交網路和實時系統。

 

Redis的資料型別及主要特性

Redis提供的資料型別主要分為5種自有型別和一種自定義型別,這5種自有型別包括:String型別、雜湊型別、列表型別、集合型別和順序集合型別。

String型別:

它是一個二進位制安全的字串,意味著它不僅能夠儲存字串、還能儲存圖片、視訊等多種型別, 最大長度支援512M。

對每種資料型別,Redis都提供了豐富的操作命令,如:

  • GET/MGET
  • SET/SETEX/MSET/MSETNX
  • INCR/DECR
  • GETSET
  • DEL

雜湊型別:

該型別是由field和關聯的value組成的map。其中,field和value都是字串型別的。

Hash的操作命令如下:

  • HGET/HMGET/HGETALL
  • HSET/HMSET/HSETNX
  • HEXISTS/HLEN
  • HKEYS/HDEL
  • HVALS

列表型別:

該型別是一個插入順序排序的字串元素集合, 基於雙鏈表實現。

List的操作命令如下:

  • LPUSH/LPUSHX/LPOP/RPUSH/RPUSHX/RPOP/LINSERT/LSET
  • LINDEX/LRANGE
  • LLEN/LTRIM

集合型別:

Set型別是一種無順序集合, 它和List型別最大的區別是:集合中的元素沒有順序, 且元素是唯一的。

Set型別的底層是通過雜湊表實現的,其操作命令為:

  • SADD/SPOP/SMOVE/SCARD
  • SINTER/SDIFF/SDIFFSTORE/SUNION

Set型別主要應用於:在某些場景,如社交場景中,通過交集、並集和差集運算,通過Set型別可以非常方便地查詢共同好友、共同關注和共同偏好等社交關係。

順序集合型別:

ZSet是一種有序集合型別,每個元素都會關聯一個double型別的分數權值,通過這個權值來為集合中的成員進行從小到大的排序。與Set型別一樣,其底層也是通過雜湊表實現的。

ZSet命令:

  • ZADD/ZPOP/ZMOVE/ZCARD/ZCOUNT
  • ZINTER/ZDIFF/ZDIFFSTORE/ZUNION

Redis的資料結構

Redis的資料結構如下圖所示:

關於上表中的部分釋義:

  1. 壓縮列表是列表鍵和雜湊鍵的底層實現之一。當一個列表鍵只包含少量列表項,並且每個列表項要麼就是小整數,要麼就是長度比較短的字串,Redis就會使用壓縮列表來做列表鍵的底層實現
  2. 整數集合是集合鍵的底層實現之一,當一個集合只包含整數值元素,並且這個集合的元素數量不多時,Redis就會使用整數集合作為集合鍵的底層實現

如下是定義一個Struct資料結構的例子:

 簡單動態字串SDS (Simple Dynamic String)

基於C語言中傳統字串的缺陷,Redis自己構建了一種名為簡單動態字串的抽象型別,簡稱SDS,其結構如下:

SDS幾乎貫穿了Redis的所有資料結構,應用十分廣泛。

SDS的特點

和C字串相比,SDS的特點如下:

  1. 常數複雜度獲取字串長度

    Redis中利用SDS字串的len屬性可以直接獲取到所儲存的字串的長
    度,直接將獲取字串長度所需的複雜度從C字串的O(N)降低到了O(1)。

  2. 減少修改字串時導致的記憶體重新分配次數

    通過C字串的特性,我們知道對於一個包含了N個字元的C字串來說,其底層實現總是N+1個字元長的陣列(額外一個空字元結尾)

    那麼如果這個時候需要對字串進行修改,程式就需要提前對這個C字串陣列進行一次記憶體重分配(可能是擴充套件或者釋放) 

    而記憶體重分配就意味著是一個耗時的操作。

Redis巧妙的使用了SDS避免了C字串的缺陷。在SDS中,buf陣列的長度不一定就是字串的字元數量加一,buf數組裡面可以包含未使用的位元組,而這些未使用的位元組由free屬性記錄。

與此同時,SDS採用了空間預分配的策略,避免C字串每一次修改時都需要進行記憶體重分配的耗時操作,將記憶體重分配從原來的每修改N次就分配N次——>降低到了修改N次最多分配N次。

如下是Redis對SDS的簡單定義:

  

Redis特性1:事務

  • 命令序列化,按順序執行
  • 原子性
  • 三階段: 開始事務 - 命令入隊 - 執行事務
  • 命令:MULTI/EXEC/DISCARD

Redis特性2:釋出訂閱(Pub/Sub)

  • Pub/sub是一種訊息通訊模式
  • Pub傳送訊息, Sub接受訊息
  • Redis客戶端可以訂閱任意數量的頻道
  • “fire and forgot”, 傳送即遺忘
  • 命令:Publish/Subscribe/Psubscribe/UnSub

  

Redis特性3:Stream

  • Redis 5.0新增
  • 等待消費
  • 消費組(組內競爭)
  • 消費歷史資料
  • FIFO

以上就是Redis的基本概念,下面我們將介紹在開發過程中可能會踩到的“坑”。

Redis常見問題解析:擊穿

概念:在Redis獲取某一key時, 由於key不存在, 而必須向DB發起一次請求的行為, 稱為“Redis擊穿”。

引發擊穿的原因:

  • 第一次訪問
  • 惡意訪問不存在的key
  • Key過期

合理的規避方案:

  • 伺服器啟動時, 提前寫入
  • 規範key的命名, 通過中介軟體攔截
  • 對某些高頻訪問的Key,設定合理的TTL或永不過期

Redis常見問題解析:雪崩

概念:Redis快取層由於某種原因宕機後,所有的請求會湧向儲存層,短時間內的高併發請求可能會導致儲存層掛機,稱之為“Redis雪崩”。

合理的規避方案:

  • 使用Redis叢集
  • 限流

Redis在產品開發中的應用實踐

為此,我很高興的為大家介紹,葡萄城架構師Jim將在2019-11-27 14:00 為大家帶來一場公開課,其中 Jim除了為大家講解Redis的基礎,同時也會實際演示他所在的專案組使用Redis時碰到的問題以及解決方案,對於剛接觸Redis的同學來說,更具參考意義和學習價值,歡迎大家屆時參加,公開課地址:。

  • 後端採用nodeJS
  • 使用Azure的Redis服務
  • Redis的使用場景

    -  token快取, 用於令牌驗證

    -  IP白名單

碰到的問題

  • “網路抖動”或者Redis服務異常導致Redis訪問超時
  • Redis客戶端驅動穩定性問題

    -  連線池 “Broken connection” 問題

    -  JS的Promise引出的Redis重置問題

下面我們來簡單瞭解一下Redis的進階知識。

進階之Redis協議簡介

Redis客戶端通訊協議:RESP(Redis Serialization Protocol),其特點是:

  • 簡單
  • 解析速度快
  • 可讀性好

Redis叢集內部通訊協議:RECP(Redis Cluster Protocol ) ,其特點是:

  • 每一個node兩個tcp 連線
  • 一個負責client-server通訊(P: 6379)
  • 一個負責node之間通訊(P: 10000 + 6379)

 

Redis協議支援的資料型別:

  • 簡單字元(首位元組: “+”)

        “+OK\r\n”

  • 錯誤(首位元組: “-”)

        “-error msg\r\n”

  • 數字(首位元組: “:”)

        “:123\r\n”

  • 批量字元(首位元組: “$”)

        “&hello\r\nWhoa re you\r\n”

  • 陣列(首位元組: “*”)

        “*0\r\n”

        “*-1\r\n”

除了Redis,還有什麼NoSQL型資料庫

市面上類似於Redis,同樣是NoSQL型的資料庫有很多,如下圖所示,除了Redis,還有MemCache、Cassadra和Mongo。下面,我們就分別對這幾個資料庫做一下簡要的介紹:

 

 

Memcache這是一個和Redis非常相似的資料庫,但是它的資料型別沒有Redis豐富。Memcache由LiveJournal的Brad Fitzpatrick開發,作為一套分散式的快取記憶體系統,被許多網站使用以提升網站的訪問速度,對於一些大型的、需要頻繁訪問資料庫的網站訪問速度的提升效果十分顯著。

Apache Cassandra(社群內一般簡稱為C*)這是一套開源分散式NoSQL資料庫系統。它最初由Facebook開發,用於儲存收件箱等簡單格式資料,集Google BigTable的資料模型與Amazon Dynamo的完全分散式架構於一身。Facebook於2008將 Cassandra 開源,由於其良好的可擴充套件性和效能,被 Apple、Comcast、Instagram、Spotify、eBay、Rackspace、Netflix等知名網站所採用,成為了一種流行的分散式結構化資料儲存方案。

MongoDB:是一個基於分散式檔案儲存、面向文件的NoSQL資料庫,由C++編寫,旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。MongoDB是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係型資料庫的,它支援的資料結構非常鬆散,是一種類似json的BSON格式。

Redis叢集的搭建

3.   Redis的安裝

 

3.1. Redis的安裝

Redis是c語言開發的。

安裝redis需要c語言的編譯環境。如果沒有gcc需要線上安裝。yum install gcc-c++

 

安裝步驟:

第一步:redis的原始碼包上傳到linux系統。

第二步:解壓縮redis。

第三步:編譯。進入redis原始碼目錄。make

第四步:安裝。make install PREFIX=/usr/local/redis

PREFIX引數指定redis的安裝目錄。一般軟體安裝到/usr目錄下

3.2. 連線redis

3.2.1.    redis的啟動:

前端啟動:在redis的安裝目錄下直接啟動redis-server

[root@localhost bin]# ./redis-server

 

後臺啟動:

把/root/redis-3.0.0/redis.conf複製到/usr/local/redis/bin目錄下

[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis/bin/

修改配置檔案:

 

 

[root@localhost bin]# ./redis-server redis.conf

檢視redis程序 ps aux|grep redis:

[root@localhost bin]# ps aux|grep redis

root      5190  0.1  0.3  33936  1712 ?        Ssl  18:23   0:00 ./redis-server *:6379   

root      5196  0.0  0.1   4356   728 pts/0    S+   18:24   0:00 grep redis

[root@localhost bin]#

 

3.2.2.    Redis-cli

[root@localhost bin]# ./redis-cli

預設連線localhost執行在6379埠的redis服務。

[root@localhost bin]# ./redis-cli -h 192.168.25.153 -p 6379

-h:連線的伺服器的地址

-p:服務的埠號

 

關閉redis:[root@localhost bin]# ./redis-cli shutdown

 

3.3. Redis五種資料型別

String:key-value(做快取)

Redis中所有的資料都是字串。命令不區分大小寫,key是區分大小寫的。Redis是單執行緒的。Redis中不適合儲存內容大的資料。

get、set、

incr:加一(生成id)

Decr:減一

 

Hash:key-fields-values(做快取)

相當於一個key對應一個map,map中還有key-value

使用hash對key進行歸類。

Hset:向hash中新增內容

Hget:從hash中取內容

 

List:有順序可重複

192.168.25.153:6379> lpush list1 a b c d

(integer) 4

192.168.25.153:6379> lrange list1 0 -1

1) "d"

2) "c"

3) "b"

4) "a"

192.168.25.153:6379> rpush list1 1 2 3 4

(integer) 8

192.168.25.153:6379> lrange list1 0 -1

1) "d"

2) "c"

3) "b"

4) "a"

5) "1"

6) "2"

7) "3"

8) "4"

192.168.25.153:6379>

192.168.25.153:6379> lpop list1

"d"

192.168.25.153:6379> lrange list1 0 -1

1) "c"

2) "b"

3) "a"

4) "1"

5) "2"

6) "3"

7) "4"

192.168.25.153:6379> rpop list1

"4"

192.168.25.153:6379> lrange list1 0 -1

1) "c"

2) "b"

3) "a"

4) "1"

5) "2"

6) "3"

192.168.25.153:6379>

 

Set:元素無順序,不能重複

192.168.25.153:6379> sadd set1 a b c c c d

(integer) 4

192.168.25.153:6379> smembers set1

1) "b"

2) "c"

3) "d"

4) "a"

192.168.25.153:6379> srem set1 a

(integer) 1

192.168.25.153:6379> smembers set1

1) "b"

2) "c"

3) "d"

192.168.25.153:6379>

還有集合運算命令,自學。

 

SortedSet(zset):有順序,不能重複

192.168.25.153:6379> zadd zset1 2 a 5 b 1 c 6 d

(integer) 4

192.168.25.153:6379> zrange zset1 0 -1

1) "c"

2) "a"

3) "b"

4) "d"

192.168.25.153:6379> zrem zset1 a

(integer) 1

192.168.25.153:6379> zrange zset1 0 -1

1) "c"

2) "b"

3) "d"

192.168.25.153:6379> zrevrange zset1 0 -1

1) "d"

2) "b"

3) "c"

192.168.25.153:6379> zrange zset1 0 -1 withscores

1) "c"

2) "1"

3) "b"

4) "5"

5) "d"

6) "6"

192.168.25.153:6379> zrevrange zset1 0 -1 withscores

1) "d"

2) "6"

3) "b"

4) "5"

5) "c"

6) "1"

192.168.25.153:6379>

 

3.4. Key命令

設定key的過期時間。

Expire key second:設定key的過期時間

Ttl key:檢視key的有效期

Persist key:清除key的過期時間。Key持久化。

 

192.168.25.153:6379> expire Hello 100

(integer) 1

192.168.25.153:6379> ttl Hello

(integer) 77

4.   Redis的持久化方案

Redis的所有資料都是儲存到記憶體中的。

Rdb:快照形式,定期把記憶體中當前時刻的資料儲存到磁碟。Redis預設支援的持久化方案。

aof形式:append only file。把所有對redis資料庫操作的命令,增刪改操作的命令。儲存到檔案中。資料庫恢復時把所有的命令執行一遍即可。

 

redis.conf配置檔案中配置。

Rdb的配置:

 

 

Aof的配置:

 

 

兩種持久化方案同時開啟使用aof檔案來恢復資料庫。

 

5.   Redis叢集的搭建

5.1. redis-cluster架構圖

 



 

redis-cluster投票:容錯

 

 

 

架構細節:

(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.

(2)節點的fail是通過叢集中超過半數的節點檢測失效時才生效.

(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可

(4)redis-cluster把所有的物理節點對映到[0-16383]slot上,cluster 負責維護node<->slot<->value

Redis 叢集中內建了 16384 個雜湊槽,當需要在 Redis 叢集中放置一個 key-value 時,redis 先對 key 使用 crc16 演算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的雜湊槽,redis 會根據節點數量大致均等的將雜湊槽對映到不同的節點

 

 

5.2. Redis叢集的搭建

Redis叢集中至少應該有三個節點。要保證叢集的高可用,需要每個節點有一個備份機。

Redis叢集至少需要6臺伺服器。

搭建偽分散式。可以使用一臺虛擬機器執行6個redis例項。需要修改redis的埠號7001-7006

5.2.1.    叢集搭建環境

1、使用ruby指令碼搭建叢集。需要ruby的執行環境。

安裝ruby

yum install ruby

yum install rubygems

 

2、安裝ruby指令碼執行使用的包。

[root@localhost ~]# gem install redis-3.0.0.gem

Successfully installed redis-3.0.0

1 gem installed

Installing ri documentation for redis-3.0.0...

Installing RDoc documentation for redis-3.0.0...

[root@localhost ~]#

 

[root@localhost ~]# cd redis-3.0.0/src

[root@localhost src]# ll *.rb

-rwxrwxr-x. 1 root root 48141 Apr  1  2015 redis-trib.rb

 

5.2.2.    搭建步驟

需要6臺redis伺服器。搭建偽分散式。

需要6個redis例項。

需要執行在不同的埠7001-7006

 

第一步:建立6個redis例項

每個例項執行在不同的。需要修改redis.conf配置檔案。配置檔案中還需要把cluster-enabled yes前的註釋去掉,開啟叢集模式。

 

 

第二步:啟動每個redis例項。

在redis-cluster目錄下建立啟動指令碼start-all.sh,檢測一下之前修改的redis能否正常啟動,為叢集的搭建作準備

 View Code

 

為建立的指令碼新增可執行許可權:

chmod u+x start-all.sh

補充:

如果給所有人新增可執行許可權:chmod a+x 檔名;
如果給檔案所有者新增可執行許可權:chmod u+x 檔名;
如果給所在組新增可執行許可權:chmod g+x 檔名;
如果給所在組以外的人新增可執行許可權:chmod o+x 檔名

 

檢視程序,檢測redis是否正常啟動

ps aux | gerp redis

 

第三步:使用ruby指令碼搭建叢集。

./redis-trib.rb create --replicas n ip:port ...

  -n: 從節點個數

./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005 192.168.25.153:7006

 

注意:搭建叢集使用的redis節點必須是乾淨的節點,不包含任何資料和殘留配置資訊。

 

可能會遇到的問題和對應的解決方法:

 

1)、將需要新增的節點下aof、rdb等本地備份檔案刪除;

 

2)、同時將新Node的叢集配置檔案刪除,即:刪除你redis.conf裡面cluster-config-file所在的檔案;

 

3)、再次新增新節點如果還是報錯,則登入新Node,./redis-cli–h x –p對資料庫進行清除:

 

172.168.63.201:7001>  flushdb      #清空當前資料庫

 

建立關閉叢集的指令碼:

[root@localhost redis-cluster]# vim shutdow-all.sh

redis01/redis-cli -p 7001 shutdown

redis01/redis-cli -p 7002 shutdown

redis01/redis-cli -p 7003 shutdown

redis01/redis-cli -p 7004 shutdown

redis01/redis-cli -p 7005 shutdown

redis01/redis-cli -p 7006 shutdown

[root@localhost redis-cluster]# chmod u+x shutdow-all.sh

 

[root@localhost redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005  192.168.25.153:7006

>>> Creating cluster

Connecting to node 192.168.25.153:7001: OK

Connecting to node 192.168.25.153:7002: OK

Connecting to node 192.168.25.153:7003: OK

Connecting to node 192.168.25.153:7004: OK

Connecting to node 192.168.25.153:7005: OK

Connecting to node 192.168.25.153:7006: OK

>>> Performing hash slots allocation on 6 nodes...

Using 3 masters:

192.168.25.153:7001

192.168.25.153:7002

192.168.25.153:7003

Adding replica 192.168.25.153:7004 to 192.168.25.153:7001

Adding replica 192.168.25.153:7005 to 192.168.25.153:7002

Adding replica 192.168.25.153:7006 to 192.168.25.153:7003

M: 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3 192.168.25.153:7001

   slots:0-5460 (5461 slots) master

M: 8cd93a9a943b4ef851af6a03edd699a6061ace01 192.168.25.153:7002

   slots:5461-10922 (5462 slots) master

M: 2935007902d83f20b1253d7f43dae32aab9744e6 192.168.25.153:7003

   slots:10923-16383 (5461 slots) master

S: 74f9d9706f848471583929fc8bbde3c8e99e211b 192.168.25.153:7004

   replicates 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3

S: 42cc9e25ebb19dda92591364c1df4b3a518b795b 192.168.25.153:7005

   replicates 8cd93a9a943b4ef851af6a03edd699a6061ace01

S: 8b1b11d509d29659c2831e7a9f6469c060dfcd39 192.168.25.153:7006

   replicates 2935007902d83f20b1253d7f43dae32aab9744e6

Can I set the above configuration? (type 'yes' to accept): yes

>>> Nodes configuration updated

>>> Assign a different config epoch to each node

>>> Sending CLUSTER MEET messages to join the cluster

Waiting for the cluster to join.....

>>> Performing Cluster Check (using node 192.168.25.153:7001)

M: 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3 192.168.25.153:7001

   slots:0-5460 (5461 slots) master

M: 8cd93a9a943b4ef851af6a03edd699a6061ace01 192.168.25.153:7002

   slots:5461-10922 (5462 slots) master

M: 2935007902d83f20b1253d7f43dae32aab9744e6 192.168.25.153:7003

   slots:10923-16383 (5461 slots) master

M: 74f9d9706f848471583929fc8bbde3c8e99e211b 192.168.25.153:7004

   slots: (0 slots) master

   replicates 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3

M: 42cc9e25ebb19dda92591364c1df4b3a518b795b 192.168.25.153:7005

   slots: (0 slots) master

   replicates 8cd93a9a943b4ef851af6a03edd699a6061ace01

M: 8b1b11d509d29659c2831e7a9f6469c060dfcd39 192.168.25.153:7006

   slots: (0 slots) master

   replicates 2935007902d83f20b1253d7f43dae32aab9744e6

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

[root@localhost redis-cluster]#

 

5.3. 叢集的使用方法

Redis-cli連線叢集。

[root@localhost redis-cluster]# redis01/redis-cli -p 7002 -c

-c:代表連線的是redis叢集

 

6.   Jedis

需要把jedis依賴的jar包新增到工程中。Maven工程中需要把jedis的座標新增到依賴。

 

推薦新增到服務層工程中。

 

6.1. 連線單機版

第一步:建立一個Jedis物件。需要指定服務端的ip及埠。

第二步:使用Jedis物件操作資料庫,每個redis命令對應一個方法。

第三步:列印結果。

第四步:關閉Jedis

@Test

     public void testJedis() throws Exception {

         // 第一步:建立一個Jedis物件。需要指定服務端的ip及埠。

         Jedis jedis = new Jedis("192.168.25.153", 6379);

         // 第二步:使用Jedis物件操作資料庫,每個redis命令對應一個方法。

         String result = jedis.get("hello");

         // 第三步:列印結果。

          System.out.println(result);

         // 第四步:關閉Jedis

         jedis.close();

     }

 

6.2. 連線單機版使用連線池

第一步:建立一個JedisPool物件。需要指定服務端的ip及埠。

第二步:從JedisPool中獲得Jedis物件。

第三步:使用Jedis操作redis伺服器。

第四步:操作完畢後關閉jedis物件,連線池回收資源。

第五步:關閉JedisPool物件。

@Test

     public void testJedisPool() throws Exception {

         // 第一步:建立一個JedisPool物件。需要指定服務端的ip及埠。

         JedisPool jedisPool = new JedisPool("192.168.25.153", 6379);

         // 第二步:從JedisPool中獲得Jedis物件。

         Jedis jedis = jedisPool.getResource();

         // 第三步:使用Jedis操作redis伺服器。

         jedis.set("jedis", "test");

         String result = jedis.get("jedis");

         System.out.println(result);

         // 第四步:操作完畢後關閉jedis物件,連線池回收資源。

         jedis.close();

         // 第五步:關閉JedisPool物件。

         jedisPool.close();

     }

 

6.3. 連線叢集版

第一步:使用JedisCluster物件。需要一個Set<HostAndPort>引數。Redis節點的列表。

第二步:直接使用JedisCluster物件操作redis。在系統中單例存在。

第三步:列印結果

第四步:系統關閉前,關閉JedisCluster物件。

 

@Test

     public void testJedisCluster() throws Exception {

         // 第一步:使用JedisCluster物件。需要一個Set<HostAndPort>引數。Redis節點的列表。

         Set<HostAndPort> nodes = new HashSet<>();

         nodes.add(new HostAndPort("192.168.25.153", 7001));

         nodes.add(new HostAndPort("192.168.25.153", 7002));

         nodes.add(new HostAndPort("192.168.25.153", 7003));

         nodes.add(new HostAndPort("192.168.25.153", 7004));

         nodes.add(new HostAndPort("192.168.25.153", 7005));

         nodes.add(new HostAndPort("192.168.25.153", 7006));

         JedisCluster jedisCluster = new JedisCluster(nodes);

         // 第二步:直接使用JedisCluster物件操作redis。在系統中單例存在。

         jedisCluster.set("hello", "100");

         String result = jedisCluster.get("hello");

         // 第三步:列印結果

         System.out.println(result);

         // 第四步:系統關閉前,關閉JedisCluster物件。

         jedisCluster.close();

     }

 

7.   向業務邏輯中新增快取

7.1. 介面封裝

常用的操作redis的方法提取出一個介面,分別對應單機版和叢集版建立兩個實現類。

 

7.1.1.    介面定義

 View Code

 

7.1.2.    單機版實現類 

 View Code 

配置:applicationContext-redis.xml

 View Code

 

7.1.3.    叢集版實現類 

 View Code

 


Spring的配置:

 View Code

 


注意:單機版和叢集版不能共存,使用單機版時註釋叢集版的配置。使用叢集版,把單機版註釋。 

 

 

7.2. 封裝程式碼測試

 1 @Test
 2 
 3      public void testJedisClient() throws Exception {
 4 
 5          //初始化Spring容器
 6 
 7          ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
 8 
 9          //從容器中獲得JedisClient物件
10 
11          JedisClient jedisClient = applicationContext.getBean(JedisClient.class);
12 
13          jedisClient.set("first", "100");
14 
15          String result = jedisClient.get("first");
16 
17          System.out.println(result);
18 
19         
20 
21                   
22 
23      }

 

7.3. 新增快取 

7.3.1.    功能分析

查詢內容列表時新增快取。

1、查詢資料庫之前先查詢快取。

2、查詢到結果,直接響應結果。

3、查詢不到,快取中沒有需要查詢資料庫。

4、把查詢結果新增到快取中。

5、返回結果。

 

向redis中新增快取:

Key:cid

Value:內容列表。需要把java物件轉換成json。

 

使用hash對key進行歸類。

HASH_KEY:HASH

            |--KEY:VALUE

            |--KEY:VALUE

            |--KEY:VALUE

            |--KEY:VALUE

 

 

注意:新增快取不能影響正常業務邏輯。

 

7.3.2.    程式碼實現

用 try catch{} 程式碼塊包裹快取程式碼,即是快取程式碼如下異常,也不能影響正常的業務邏輯。

 View Code

 

7.4. 快取同步 

對內容資訊做增刪改操作後只需要把對應快取刪除即可。

可以根據cid刪除。

 

 View Code