1. 程式人生 > >day72_淘淘商城專案_05_首頁輪播圖顯示實現 + redis的安裝及使用 + redis叢集環境搭建 + redis實現快取 + 快取同步_匠心筆記

day72_淘淘商城專案_05_首頁輪播圖顯示實現 + redis的安裝及使用 + redis叢集環境搭建 + redis實現快取 + 快取同步_匠心筆記

淘淘商城專案_05


課程計劃:

  • 第五天
    • 1、首頁輪播圖的展示
    • 2、首頁大廣告展示流程圖
    • 3、Redis的安裝及使用
    • 4、Redis叢集的搭建
    • 5、向業務邏輯中新增快取
    • 6、Jedis的使用(redis的客戶端)
    • 7、快取同步

1、首頁輪播圖的展示

taotao-portal-web工程中,動態展示內容資訊。
前端團隊:負責JS,html等開發。
後端團隊:負責後臺的開發並提供資料給前端。

1.1、功能分析

只需要動態生成一個json資料,輪播圖就可以動態展示。
taotao-portal-web工程下的index.jsp中:
Json資料格式:

[
	{
		"srcB": "http://image.taotao.com/images/2015/03/03/2015030304360302109345.jpg",
		"height": 240,
		"alt": "",
		"width": 670,
		"src": "http://image.taotao.com/images/2015/03/03/2015030304360302109345.jpg",
		"widthB": 550,
		"href": "http://sale.jd.com/act/e0FMkuDhJz35CNt.html?cpdad=1DLSUE",
		"heightB": 240
	},
	{
		"srcB": "http://image.taotao.com/images/2015/03/03/2015030304353109508500.jpg",
		"height": 240,
		"alt": "",
		"width": 670,
		"src": "http://image.taotao.com/images/2015/03/03/2015030304353109508500.jpg",
		"widthB": 550,
		"href": "http://sale.jd.com/act/UMJaAPD2VIXkZn.html?cpdad=1DLSUE",
		"heightB": 240
	},
    ......
]

分析:
  taotao-portal-web 需要自己自定義的POJO的型別資料的列表。
  taotao-content 是服務層公用的,可以被其他的系統(表現層的系統)來呼叫。
  為了通用性:taotao-content 服務層中獲取tb_content的內容列表 即:list<TbContent>
  taotao-portal-web 表現層需要拿到tb_content的列表,然後進行轉換成自定義的型別的資料列表即可。
  從tb_content表中取資料,根據(葉子節點)內容分類id查詢列表(內容列表)。
  內容分類id固定,需要配置在屬性檔案中
  圖片的width、height配置在屬性檔案中
  alt屬性從欄位sub_title中獲取。
  src --> pic
  srcB --> pic2
  href --> url


URL:/index
引數:無。
返回值:首頁頁面(資料是JSON,設定在Model中)

業務邏輯:
  1、根據分類的id 查詢內容列表(List<TbContent>)
  2、服務層釋出服務。
  3、表現層引入服務。
  4、呼叫服務,轉換成自定義的資料型別(Ad1Node)的列表。
  5、將資料列表設定到Model中,返回給頁面。

需要建立一個pojo轉換成頁面需要的json資料格式。放入taotao-portal-web工程的com.taotao.portal.pojo中。
AD1Node.java

/**
 * 前臺大廣告位需要的pojo資料型別
 * @author chenmingjun
 * @date 2018年11月18日下午4:03:34
 * @version 1.0
 */
public class AD1Node implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private String srcB;
	private Integer height;
	private String alt;
	private Integer width;
	private String src;
	private Integer widthB;
	private String href;
	private Integer heightB;

	public String getSrcB() {
		return srcB;
	}

	public void setSrcB(String srcB) {
		this.srcB = srcB;
	}

	public Integer getHeight() {
		return height;
	}

	public void setHeight(Integer height) {
		this.height = height;
	}

	public String getAlt() {
		return alt;
	}

	public void setAlt(String alt) {
		this.alt = alt;
	}

	public Integer getWidth() {
		return width;
	}

	public void setWidth(Integer width) {
		this.width = width;
	}

	public String getSrc() {
		return src;
	}

	public void setSrc(String src) {
		this.src = src;
	}

	public Integer getWidthB() {
		return widthB;
	}

	public void setWidthB(Integer widthB) {
		this.widthB = widthB;
	}

	public String getHref() {
		return href;
	}

	public void setHref(String href) {
		this.href = href;
	}

	public Integer getHeightB() {
		return heightB;
	}

	public void setHeightB(Integer heightB) {
		this.heightB = heightB;
	}

	@Override
	public String toString() {
		return "AD1Node [srcB=" + srcB + ", height=" + height + ", alt=" + alt + ", width=" + width + ", src=" + src
				+ ", widthB=" + widthB + ", href=" + href + ", heightB=" + heightB + "]";
	}
}

1.2、Dao層

從tb_content表中取出資料,根據內容分類id查詢內容列表。可以使用逆向工程生成的Mapper。

1.3、Service層

引數:Long categoryId
返回值:List<TbContent>

	@Override
	public List<TbContent> getContentListByCategoryId(Long categoryId) {
		TbContentExample contentExample = new TbContentExample();
		Criteria criteria = contentExample.createCriteria();
		criteria.andCategoryIdEqualTo(categoryId);
		List<TbContent> list = contentMapper.selectByExample(contentExample);
		return list;
	}

1.3.1、釋出服務

在taotao-content-service工程applicationContext-service.xml中釋出服務

1.4、表現層

在taotao-portal-web中實現,查詢首頁輪播圖的內容。

1.4.1、引用服務

先在taotao-protal-web專案中引入對taotao-content-interface的依賴,如圖:

在taotao-content-web工程springmvc.xml中引入服務

1.4.2、Controller

在首頁展示之前,對資料進行處理,然後展示首頁,需要在IndexController中實現。

/**
 * 前臺首頁展示Controller
 * @author chenmingjun
 * @date 2018年12月31日
 * @version V1.0
 */
@Controller
public class IndexController {
    @Autowired
    private ContentService contentService;
    
    @Value("${AD1_CATEGORY_ID}")
    private Long AD1_CATEGORY_ID;
    @Value("${AD1_HEIGHT}")
    private Integer AD1_HEIGHT;
    @Value("${AD1_HEIGHT_B}")
    private Integer AD1_HEIGHT_B;
    @Value("${AD1_WIDTH}")
    private Integer AD1_WIDTH;
    @Value("${AD1_WIDTH_B}")
    private Integer AD1_WIDTH_B;
    
    /**
     * 展示前臺首頁,並展示首頁輪播圖(大廣告)+展示小廣告......
     * @return
     */
    @RequestMapping("/index")
    public String showIndex(Model model) {
    	// 展示首頁輪播圖
        // 1、引入服務
        // 2、注入服務
        // 3、呼叫方法查詢TbContent的列表
        List<TbContent> contentList = contentService.getContentListByCategoryId(AD1_CATEGORY_ID);
        // 4、把TbContent的列表轉換為AD1Node列表
        List<AD1Node> aD1NodeList = new ArrayList<>();
        for (TbContent tbContent : contentList) {
            AD1Node aD1Node = new AD1Node();
            aD1Node.setAlt(tbContent.getSubTitle());
            aD1Node.setHref(tbContent.getUrl());
            aD1Node.setSrc(tbContent.getPic());
            aD1Node.setSrcB(tbContent.getPic2());
            aD1Node.setHeight(AD1_HEIGHT);
            aD1Node.setHeightB(AD1_HEIGHT_B);
            aD1Node.setWidth(AD1_WIDTH);
            aD1Node.setWidthB(AD1_WIDTH_B);
            aD1NodeList.add(aD1Node);
        }
        // 5、把AD1Node列表轉換為JSON資料
        String json = JsonUtils.objectToJson(aD1NodeList);
        // 6、把JSON資料設定到request域中去(Model)
        model.addAttribute("ad1", json);
        // 展示小廣告......等等省略了,以後實現
        return "index";
    }
}

屬性檔案所在位置:

在taotao-portal-web中的springmvc.xml中還需要配置:

	<!-- 配置載入屬性檔案 -->
	<context:property-placeholder location="classpath:resource/resource.properties"/>

1.5、測試

後臺資料如下圖所示:

前臺瀏覽器顯示介面:

其他廣告位同理。

2、首頁大廣告展示流程圖

  首頁是系統的門戶,也就是系統的入口。所以首頁的訪問量是這個系統最大的。如果每次展示首頁都從資料庫中查詢首頁的內容資訊,那麼勢必會對資料庫造成很大的壓力,所以需要使用快取來減輕資料庫壓力。
  實現快取的工具有很多,現在比較流行的是redis。
  首頁大廣告展示流程:
  展示流程:先從快取取,如果不存在,從資料庫取出來,寫入快取,再返回頁面;如果存在key,直接從快取中取出來,展示到頁面。
  同步快取:當事務提交(更新,刪除,插入)後,需要同步快取,直接根據Key刪除redis的key(清空快取),再展示時,由上邊的流程展示。

3、Redis的安裝及使用

3.1、redis的下載

  官網地址:http://redis.io/
  下載地址:http://download.redis.io/releases/redis-3.0.0.tar.gz

3.2、redis的安裝

  安裝redis需要c語言的編譯環境,如果沒有gcc需要線上安裝。如下命令:

[[email protected] ~]# yum -y install gcc-c++

  檢測是否有gcc環境,只需輸入命令:

[[email protected] ~]# gcc
[[email protected] ~]# gcc
gcc: 致命錯誤:沒有輸入檔案
編譯中斷。
[[email protected] ~]# 

出現如上所述內容,表示gcc安裝成功。
安裝步驟:
  第一步:將redis的原始碼包上傳到linux系統。
  第二步:解壓縮redis的原始碼包。
  第三步:進行編譯。cd到解壓後的目錄,輸入命令:make
  第四步:進行安裝。輸入命令:make install PREFIX=/usr/local/redis
  第五步:檢查目錄是否存在。在/usr/local/redis下有bin目錄,則說明安裝成功。

3.3、連線redis

3.3.1、redis的啟動

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

[[email protected] bin]# pwd
/usr/local/redis/bin
[[email protected] bin]# ./redis-server

後臺啟動:
把/root/redis-3.0.0/redis.conf複製到/usr/local/redis/bin目錄下

[[email protected] redis-3.0.0]# cp redis.conf /usr/local/redis/bin/

修改配置檔案:將daemonize由no改為yes
再次啟動redis:

[[email protected] bin]# ./redis-server redis.conf 

檢視redis程序:

[[email protected] bin]# ps aux | grep redis
root       5845  0.4  0.2 140888  2104 ?        Ssl  22:51   0:00 ./redis-server *:6379
root       5858  0.0  0.0 112720   980 pts/1    R+   22:51   0:00 grep --color=auto redis
[[email protected] bin]# 

前端啟動,不能更換終端,影響下一步操作。而後臺啟動,只在程序中悄悄啟動。推薦使用後臺啟動。

3.3.2、使用redis自帶的客戶端redis-cli連線redis

使用redis-cli建立連線:

[[email protected] bin]# ./redis-cli 
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> 

預設連線localhost執行在6379埠的redis服務。
連線其他ip和埠:

[[email protected] bin]# ./redis-cli -h 192.168.25.153 -p 6379
192.168.25.153:6379> ping
PONG
192.168.25.153:6379> 

-h:連線的伺服器的地址
-p:服務的埠號
退出redis連線的三種方式
第一種方式

[[email protected] bin]# ./redis-cli 
127.0.0.1:6379> quit
[[email protected] bin]# 

第二種方式

[[email protected] bin]# ./redis-cli 
127.0.0.1:6379> exit
[[email protected] bin]# 

第三種方式

Ctrl+C

3.3.3、使用redis的桌面客戶端軟體連線redis

先安裝:redis-desktop-manager-0.7.9.809.exe,注意:該軟體只能連線redis單機版。

安裝好後,雙擊開啟軟體

redis預設有16個庫,如果不指定庫,預設儲存在索引為0的庫中。

3.3.4、關閉redis服務

第一種:通過使用redis自帶的客戶端redis-cli進行關閉,使用 shutdown 命令。

[[email protected] bin]# ./redis-cli 
127.0.0.1:6379> shutdown
not connected> 

第二種:使用 kill 命令。
找到對應的redis的程序id 然後使用命令:(pid為程序id)

[[email protected] bin]# kill -9 pid

3.4、redis五種資料型別

3.4.1、String:key-value

redis命令不區分大小寫,但是key區分大小寫的。
redis中所有的資料都是字串
redis是單執行緒的,所以不適合儲存比較大的資料,最好要存小且能快速處理完的東西。
使用incr命令,如果key不存在,會自動建立key並自動+1。
  set key value   設定值
  get key   獲取值
  incr key   加一
  decr key   減一

127.0.0.1:6379> set key1 2
OK
127.0.0.1:6379> set key2 value2
OK
127.0.0.1:6379> get key1
"2"
127.0.0.1:6379> get key2
"value2"
127.0.0.1:6379> Get key2
"value2"
127.0.0.1:6379> incr key1
(integer) 3
127.0.0.1:6379> decr key1
(integer) 2
127.0.0.1:6379> 

3.4.2、Hash: key-field-value

相當於一個key對應一個map (map中又是key-value),一般應用於歸類。
  hset key field value
  hget key field
  hincrby key field num

127.0.0.1:6379> hset hkey1 filed1 value1
(integer) 1
127.0.0.1:6379> hset hkey1 filed2 2
(integer) 1
127.0.0.1:6379> hget hkey1 filed1
"value1"
127.0.0.1:6379> hget hkey1 filed2
"2"
127.0.0.1:6379> hincrby hkey1 filed2 1
(integer) 3
127.0.0.1:6379> hincrby hkey1 filed2 -1
(integer) 2
127.0.0.1:6379> 

3.4.3、List

List是有順序可重複(資料結構中的:雙鏈表,佇列)
可作為連結串列,可以從左新增元素,也可以從右新增元素。
  lpush list a b c d   (從左新增元素)
  rpush list 1 2 3 4   (從右邊新增元素)
  lrange list 0 -1   (從 0 到 -1 元素檢視:也就表示檢視所有)
  lpop list   (從左邊取,刪除)
  rpop list   (從右邊取,刪除)

127.0.0.1:6379> lpush list1 a b c d
(integer) 4
127.0.0.1:6379> lrange list1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> rpush list1 1 2 3 4
(integer) 8
127.0.0.1:6379> lrange list1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "1"
6) "2"
7) "3"
8) "4"
127.0.0.1:6379> lpop list1
"d"
127.0.0.1:6379> lrange list1 0 -1
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
6) "3"
7) "4"
127.0.0.1:6379> rpop list1
"4"
127.0.0.1:6379> lrange list1 0 -1
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
6) "3"
127.0.0.1:6379> 

3.4.4、Set

Set無順序,不能重複。
  sadd set1 a b c d d   (向set1中新增元素)元素不重複
  smembers set1   (查詢元素)
  srem set1 a   (刪除元素)

127.0.0.1:6379> sadd set1 a a a b b c
(integer) 3
127.0.0.1:6379> smembers set1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> srem set1 a
(integer) 1
127.0.0.1:6379> smembers set1
1) "c"
2) "b"
127.0.0.1:6379> 

3.4.5、SortedSet(zset)

SortedSet有順序,不能重複。
適合做排行榜 排序需要一個分數屬性。
  zadd zset1 8 a 4 b 5 c 1 d   (新增元素:zadd key score member)
  zrange key start stop [WITHSCORES]   (檢視所有元素:zrange key 0 -1 withscores)
    如果要檢視分數,需要加上withscores
  zrange zset1 0 -1   (從小到大)
  zrevrange zset1 0 -1   (從大到小)
  zincrby zset1 score member   (對元素 member 增加 score)

127.0.0.1:6379> zadd zset1 8 a 4 b 5 c 1 d
(integer) 4
127.0.0.1:6379> zrange zset1 0 -1
1) "d"
2) "b"
3) "c"
4) "a"
127.0.0.1:6379> zadd zset1 9 a
(integer) 0
127.0.0.1:6379> zrange zset1 0 -1
1) "d"
2) "b"
3) "c"
4) "a"
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "d"
2) "1"
3) "b"
4) "4"
5) "c"
6) "5"
7) "a"
8) "9"
127.0.0.1:6379> zrevrange zset1 0 -1
1) "a"
2) "c"
3) "b"
4) "d"
127.0.0.1:6379> zrevrange zset1 0 -1 withscores
1) "a"
2) "9"
3) "c"
4) "5"
5) "b"
6) "4"
7) "d"
8) "1"
127.0.0.1:6379> 

3.5、key 命令

expire key second   設定key的過期時間
ttl key             檢視剩餘時間(-2 表示不存在,-1 表示已被持久化(永不過期),正數表示剩餘的時間)
persist key         清除過期時間,也即持久化,持久化成功體提示 1,不成功提示 0
del key             刪除key  
exists key          若key存在,返回1,否則返回0。
select 0            表示選擇0號資料庫。預設是0號資料庫。

redis 預設有16個庫 select num 從0開始換庫

keys *              獲取redis裡面所有的key
dbsize              檢視當前資料庫的key的數量
flushdb             清空當前庫的所有key
flushall            清空所有庫的key
exists key          是否存在該key
move key db         把當前庫的key移到db號庫中
type key            檢視key的型別

3.6、redis持久化方案

redis 資料都放在記憶體中。如果機器掛掉,記憶體的資料就不存在。
需要做持久化處理,將記憶體中的資料儲存在磁碟,下一次啟動的時候就可以恢復資料到記憶體中。
  方案1:RDB 快照形式(定期將當前時刻的資料儲存磁碟中)會產生一個dump.rdb檔案。
    特點:會存在資料丟失,效能較好,資料備份。
  方案2:AOF:append only file (所有對redis的操作命令記錄在aof檔案中),恢復資料,重新執行一遍即可。
    特點:每秒儲存(也可能會存在資料丟失),資料比較完整,耗費效能。其實也可以設定成每次儲存,但是此就失去了快取的意義了。
redis預設開啟RDB。如下圖:

redis.conf 中預設設定了儲存規則及時間間隔。

save 開頭的一行就是持久化配置,可以配置多個條件(每行配置一個條件),每個條件之間是“或”的關係。
    save 900 1      表示15分鐘(900秒)內至少1個鍵被更改則進行快照。
    save 300 10     表示5分鐘(300秒)內至少10個鍵被更改則進行快照。
    save 60 10000   表示1分鐘(60秒)內至少10000個鍵被更改則進行快照。

AOF開啟設定,修改 redis.conf 檔案,如下圖:
將appendonly設定為yes即可。

同時開啟兩個持久化方案,則按照AOF的持久化放案恢復資料
預設是按照RDB的方式恢復資料,如果開啟了AOF,就是用AOF恢復資料,資料是存在於/usr/local/redis/bin/appendonly.aof檔案中。

4、Redis叢集的搭建

4.1、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 會根據節點數量`大致均等`的將雜湊槽對映到不同的節點。如下圖所示:

雜湊槽的圖解:

redis-cluster投票,容錯機制圖解:

4.2、redis叢集的搭建

因為有投票容錯機制,所以需要至少3個節點(奇數),為了叢集的高可用,為每一個節點增加一個備份機(共6臺伺服器)。
搭建偽分散式叢集方案:在一臺機器裡面執行6個redis例項。埠需要不同即可(7001-7006)。

4.2.1、叢集搭建環境

4.2.2、搭建步驟

參考文章連結:https://www.cnblogs.com/chenmingjun/p/9903889.html
建立叢集命令:

[[email protected] 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

4.3、叢集的使用方法

redis-cli連線叢集。連線主節點或者從節點都可以。

[[email protected] redis-cluster]# 7001/redis-cli -h 192.168.25.153 -p 7006 -c
192.168.25.153:7006> set key1 123
-> Redirected to slot [9189] located at 192.168.25.153:7002
OK
192.168.25.153:7002> keys *
1) "key1"
192.168.25.153:7002> set key2 abc
-> Redirected to slot [4998] located at 192.168.25.153:7001
OK
192.168.25.153:7001> keys *
1) "key2"
192.168.25.153:7001> set key3 bbbb
OK
192.168.25.153:7001> set key4 cccc
-> Redirected to slot [13120] located at 192.168.25.153:7003
OK
192.168.25.153:7003> 

-c:代表連線的是redis叢集
使用命令操作redis叢集是和單機版的redids是一樣的。

192.168.25.153:7003> cluster info   #查詢叢集的資訊
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:3
cluster_stats_messages_sent:1623
cluster_stats_messages_received:1623
192.168.25.153:7003> cluster nodes  #查詢叢集的節點
ecb5aafd409740004ac3bf298318e2243f562e4e 192.168.25.153:7004 slave b207611daffa174990c64499495fc42ce3978767 0 1542619629901 4 connected
30775ef3b509604b604b76a4407334fe1fb6304f 192.168.25.153:7006 slave c6514cdac6977ef8a8fbee8c7d5c3e4edd7df585 0 1542619634936 6 connected
fd369b55daa7cdd8640e1e1bfa8fa2ab9cfe39cd 192.168.25.153:7002 master - 0 1542619633928 2 connected 5461-10922
c6514cdac6977ef8a8fbee8c7d5c3e4edd7df585 192.168.25.153:7003 myself,master - 0 0 3 connected 10923-16383
75a701f4cd545ee704ded294c17bbfa3f02eaee1 192.168.25.153:7005 slave fd369b55daa7cdd8640e1e1bfa8fa2ab9cfe39cd 0 1542619631916 5 connected
b207611daffa174990c64499495fc42ce3978767 192.168.25.153:7001 master - 0 1542619632921 1 connected 0-5460
192.168.25.153:7003> 

5、Java客戶端Jedis的使用方法

需要把jedis依賴的jar包新增到工程中。Maven工程中需要把jedis的座標新增到依賴。
推薦新增到服務層。本例中是:taotao-content-service工程中。
第一步:新增jar包的依賴

在taotao-content-service中新增測試方法,測試如下:

5.1、通過單例項連線redis伺服器單機版

	@Test
	public void jedisClientTest() throws Exception {
        // 1、建立一個Jedis的連線物件(單例項),需要指定服務端的ip及埠
        Jedis jedis = new Jedis("192.168.25.153", 6379);
        // 2、選擇要操作的資料庫
        jedis.select(2);
        // 3、執行redis命令,即使用Jedis物件操作資料庫,每個redis命令對應一個方法
        jedis.set("s4", "曉藝,你還好嗎?");
        // 從redis中取值
        String result = jedis.get("s4");
        // 列印結果
        System.out.println(result);
        // 4、關閉連線
        jedis.close();
	}

通過單例項連線redis伺服器,我們發現每一次連線都需要建立連線,建立連線是比較浪費資源的,所以我們需要使用連線池來連線redis資料庫。

5.2、通過連線池連線redis伺服器單機版

測試程式碼如下:

    /**
     * 通過連線池連線redis伺服器單機版
     */
    @Test
    public void jedisPoolTest() throws Exception {
        // 1、建立一個連線池JedisPool物件(單例項),需要指定服務端的ip及埠
        JedisPool jedisPool = new JedisPool("192.168.25.153", 6379);
        // 2、從連線池JedisPool中獲取jedis會話物件
        Jedis jedis = jedisPool.getResource();
        // 3、使用redis命令操作redis資料庫(方法級別使用:用完之後就要關閉)
        String result = jedis.get("s11");
        System.out.println(result);
        // 4、關閉連線,操作完畢後關閉jedis物件,連線池要回收資源。
        jedis.close();
        // 5、關閉連線池物件JedisPool
        jedisPool.close();
    }

5.3、使用spring整合JedisPool連線redis伺服器單機版

新增spring的jar包
配置spring配置檔案applicationContext.xml
applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.2.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

    <!-- 連線池配置 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!-- 最大連線數 -->
        <property name="maxTotal" value="30" />
        <!-- 最大空閒連線數 -->
        <property name="maxIdle" value="10" />
        <!-- 每次釋放連線的最大數目 -->
        <property name="numTestsPerEvictionRun" value="1024" />
        <!-- 釋放連線的掃描間隔(毫秒) -->
        <property name="timeBetweenEvictionRunsMillis" value="30000" />
        <!-- 連線最小空閒時間 -->
        <property name="minEvictableIdleTimeMillis" value="1800000