Redis相關知識
Redis基礎知識
Redis是什麼
Redis是現在最受歡迎的NoSQL資料庫之一,Redis是一個使用ANSI C編寫的開源、包含多種資料結構、支援網路、基於記憶體、可選永續性的鍵值對儲存資料庫,其具備如下特性:
- 基於記憶體執行,效能高效
- 支援分散式,理論上可以無限擴充套件
- key-value儲存系統
- 開源的使用ANSI C語言編寫、遵守BSD協議、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API
相比於其他資料庫型別,Redis具備的特點是:
- C/S通訊模型
- 單程序單執行緒模型
- 豐富的資料型別
- 操作具有原子性
- 持久化
- 高併發讀寫
- 支援lua指令碼
哪些大廠在使用Redis?
- github
- 微博
- 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的資料結構如下圖所示:
關於上表中的部分釋義:
- 壓縮列表是列表鍵和雜湊鍵的底層實現之一。當一個列表鍵只包含少量列表項,並且每個列表項要麼就是小整數,要麼就是長度比較短的字串,Redis就會使用壓縮列表來做列表鍵的底層實現
- 整數集合是集合鍵的底層實現之一,當一個集合只包含整數值元素,並且這個集合的元素數量不多時,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的配置:
注意:單機版和叢集版不能共存,使用單機版時註釋叢集版的配置。使用叢集版,把單機版註釋。
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