查詢商品詳情添加緩存分析、商品詳情緩存的實現、Mac下安裝Redis及Redis Desktop Manager

查詢商品詳情添加緩存分析

上節課我們一起學習了商品詳情展示,這節課我們一起學習下如何添加緩存。

因爲查詢商品詳情涉及到查詢數據庫,當網站訪問量很大時,查詢商品詳情都去查詢數據庫的話,數據庫的壓力是難以承受的,爲了解決這個問題就要引入緩存。但是引入緩存又有個問題需要考慮,那就是緩存資源是非常有限的,如果我們把大量的商品詳情信息都放到緩存當中的話,緩存的壓力是非常大的。我們知道,商品是分熱點商品和冷門商品的,熱點商品的訪問量很大,但是冷門商品可能十天半月也沒有人訪問,因此存儲熱門商品信息才能提高緩存的利用率。那麼我們怎麼能儘可能少的佔用緩存資源呢?這裏有兩種解決方案,

第一種方案是利用redis的的訪問量統計功能並利用其zset數據類型進行訪問量排序,把訪問量高的商品詳情內容添加到緩存當中。這種方案比較麻煩,我們不建議採用這種方式。

第二種方案是設置緩存的過期時間,用戶只要點擊查看商品詳情,我們一律先都存放到緩存當中,但是我們要設置一下該條商品的緩存時間(比如半天或一天或其它),到期後該商品的緩存就會被刪除掉,如果該商品是熱門商品的話,用戶再查看詳情的時候就又會向緩存中添加該商品的緩存,如果該商品是冷門商品,過期後緩存中便沒有這款商品的緩存信息了(直到有下一位用戶查看該商品的詳情信息),這樣就可以節約緩存的空間,而且這種方式無疑是提高緩存利用率最簡單的方法了。

redis存儲信息有兩種方式,一種是哈希方式,這種存儲方式的好處是可以將緩存信息分類存儲,比如在前面我們在首頁展示的時候,頁面上的商品都是分類展示的,爲了區分要緩存的是首頁的信息,因此設置哈希的key是INDEX_CONTENT,首頁大廣告位的分類ID是89,因此89作爲第二個參數(key),value則是首頁大廣告位的所有商品信息。

另一種存儲方式是string存儲方式,也就是普通的key-value形式

哈希存儲方式適合做緩存處理但是它卻不適合設置緩存過期時間,這是因爲它不支持具體到每個Field進行設置過期時間,比如上面提到的首頁展示時存儲的key(INDEX_CONTENT),redis僅支持對hash的key設置過期時間,這也就意味着如果我們設置的INDEX_CONTENT這個key到期後,首頁所有的商品的緩存信息都將消失,這顯然是不合理的,我們想要的是針對每個商品設置過期時間,因此設置過期時間的話,hash存儲不合適。String存儲是比較適合的,那麼問題又來了,String存儲時key是容易重複的,怎麼來避免key衝突呢?我們可以通過添加前綴、後綴的方式對redis的key進行分類,如下圖所示。既然是要存儲商品詳情,就在商品ID前面起個名字,就叫做ITEM_INFO(大家可以隨便起),在ID的後面添加後綴BASE(代表是基本信息),DESC(代表是商品描述信息)

redis:0>set ITEM_INFO:1235:BASE aaaaa
OK

redis:0>set ITEM_INFO:1235:DESC ccccc
OK

redis:0>get ITEM_INFO:1235:BASE
aaaaa

redis:0>get ITEM_INFO:1235:DESC
ccccc

redis:0>

這樣我們既可以區分key還可以針對每個商品設置過期時間,但是現在又有個問題來了,我們怎樣存儲二維表(就是我們表格的數據,表格有行和列,這就是二維表)信息?我們以user表爲例,如下圖所示,我們怎麼把這張表中的數據進行存儲呢?

我們可以按"表名🆔列名"來表示
redis:0>set tb_user:7:id 7
OK

redis:0>set tb_user:7:username zhangsan
OK

redis:0>set tb_user:7:password e10adc3949ba59abbe56e057f20f883e
OK

redis:0>get tb_user:7:id
7

redis:0>get tb_user:7:username
zhangsan

redis:0>get tb_user:7:password
e10adc3949ba59abbe56e057f20f883e

redis:0>

我們可以設置過期時間,比如給tb_user:7:id設置過期時間爲100秒。這樣每次查看tb_user:7:id時都可以看到TTL剩餘秒數在減少直到減到0,然後就過期了。

我們便可以通過這種方式來添加商品詳情緩存以及提高緩存的利用效率。

商品詳情緩存的實現

上節課我們一起分析了下商品詳情緩存策略,這節課我們一起實現商品詳情緩存的添加。

首先,我們要想清楚緩存應該加到哪個工程當中,現在我們有兩個工程可以選擇,第一個工程是taotao-item-web(商品詳情工程),如果把緩存加到這個工程的話,由於該工程是個web工程,不被其它工程所共用,那麼這塊緩存的功能只能被它自己使用。第二個工程是taotao-manager(商品工程),由於多個工程都依賴taotao-manager,因此緩存的功能可以被多個工程所共用。顯然,我們應該選擇第二個工程taotao-manager-service來添加緩存。

要使用Redis緩存技術,就要先添加Redis的依賴

添加完依賴之後,需要添加對Redis操作的接口及實現類,由於我們在taotao-content工程已經實現過了,因此我們只需要把taotao-content-interface工程中關於jedis接口的包及接口類拷貝過來,然後把taotao-content-service工程中jedis的包及實現類拷貝過來

下面還需要把taotao-conent-service工程中關於jedis的配置文件給複製過來applicationContext-jedis.xml

我們打開applicationContext-jedis.xml文件,如下圖所示,可以看到有單機版和集羣版兩種配置,現在我用的是單機版redis,因此我們打開的是單機版的redis配置。

在上節課中我們制定了通過添加redis緩存前綴來區分key的策略,而這個key我們是不能寫死到代碼當中的,應該配置到配置文件當中,還有就是商品的過期時間,這個也應該是可配置的,因此我們需要在taotao-manager-service工程添加一個配置文件resource.properties,如下圖所示。不過需要提醒的是,剛建的配置文件默認編碼是iso8859-1,是不能寫中文註釋的,因此爲了能夠寫中文註釋,我們把該文件的編碼改成UTF-8。

添加了配置文件,要讓Spring容器能夠掃描到,因此我們打開applicationContext-dao.xml文件,把關於加載配置文件的配置由原來的db.properties修改爲*.properties,這樣properties目錄下的所有配置文件都可以被掃描到了。

下面我們真正開始寫緩存代碼,在ItemServiceImpl類中的獲取商品基本信息方法(getItemById)和獲取商品描述信息方法(getItemDescById)中添加緩存代碼,添加完緩存後,ItemServiceImplement類的所有代碼如下:
其中新注入的內容如下圖藍色標註所示。

代碼寫好了,下面我們便要進行測試,由於我們修改了taotao-manager工程,最好我們重新打包taotao-manager工程到本地Maven倉庫,然後我們重啓taotao-manager工程,重啓後,我們再來訪問商品詳情頁面,第一次訪問是查詢數據庫,然後我們再刷新頁面,第二次訪問就是查詢的緩存了。緩存中存儲的信息如下圖所示。

代碼寫好了,下面我們便要進行測試,由於我們修改了taotao-manager工程,最好我們重新打包taotao-manager工程到本地Maven倉庫,然後我們重啓taotao-manager工程,重啓後,我們再來訪問商品詳情頁面,第一次訪問是查詢數據庫,然後我們再刷新頁面,第二次訪問就是查詢的緩存了。緩存中存儲的信息如下圖所示。

Mac下安裝Redis及Redis Desktop Manager

在這裏插入圖片描述

如何開始使用Redis Desktop Manager for Mac?
Redis Desktop Manager for Mac又被稱爲RDM,是適用於MacOS的快速開源Redis數據庫管理應用程序。將鍵視爲樹,CRUD鍵,通過shell執行命令。那麼如何開始使用RDM,我們來介紹一下。
在這裏插入圖片描述
您之後安裝 RDM第一需要,以開始使用它創建連接到你的Redis服務器來做。在主屏幕上,按“ 連接到Redis服務器”按鈕。
在這裏插入圖片描述
連接到本地或公共redis服務器在“連接設置”的第一個選項卡上,輸入有關您正在創建的連接的常規信
名稱 - 新連接的名稱(例如:my_local_redis)
主機 - redis-server主機(例如:localhost)
端口 - redis-server端口(例如:6379)
Auth - redis-server身份驗證密碼
使用SSL連接到公共redis-server
如果要使用SSL連接到redis-server,則需要在第二個選項卡上啓用SSL並提供PEM格式的公鑰。您可以找到特定雲服務的說明。
在這裏插入圖片描述
Windows Azure Redis緩存1.使用所有請求的信息創建連接
在這裏插入圖片描述
2.確保已啓用“使用SSL協議”複選框

3.您的Azure Redis連接已準備就緒
Redis Labs
要使用SSL / TLS加密連接Redis Labs實例,請執行以下步驟:
1.確保在Redis Labs儀表板中爲Redis實例啓用了SSL。
2.garantia_credentials.zip從Redis Labs儀表板下載並解壓縮
3.選擇garantia_user.crt在“公鑰”字段
4.選擇garantia_user_private.key在“私鑰”字段
5.garantia_ca.pem在“權限”字段中選擇

通過SSH隧道連接到私有redis-server
基本的SSH隧道
SSH選項卡應該允許您使用SSH隧道。如果您的redis-server無法通過網絡公開訪問,這將非常有用。要使用SSH隧道,請選中“使用SSH隧道”複選框。有不同的安全選項:您可以使用普通密碼或OpenSSH私鑰。

對於Windows用戶:
您的私鑰必須是.pem格式。
在這裏插入圖片描述
高級SSH隧道如果您需要高級SSH隧道,則應手動設置SSH隧道並通過localhost連接:
ssh SSH_HOST -L 7000:localhost:6379
如何通過EC2連接到Redis ElastiCache
按照此博客文章中的說明操作
如何通過EC2連接Redis ElastiCache和In-Transit Encryption
使用RedisDesktopManager> = 0.9.9
單擊SSH連接設置中的“啓用TLS-over-SSH”
使用RedisDesktopManager <0.9.9
按照本文檔部分的說明在EC2實例上進行設置stunnel
之後通過EC2連接到Redis ElastiCache
連接到UNIX套接字
Redis Desktop Manager 不直接支持UNIX套接字,但您可以使用本地套接字重定向到unix域套接字,例如使用socat:
socat -v tcp-l:6379,reuseaddr,fork unix:/tmp/redis.sock
高級連接設置
使用下一個選項卡高級設置以設置命名空間分隔符或其他設置。
在這裏插入圖片描述
下一步現在您可以立即測試連接或創建連接。恭喜,現在您已連接到Redis服務器。您應該看到類似於我們在屏幕上顯示的內容。
在這裏插入圖片描述

單擊連接並展開鍵。通過單擊右鍵,您可以看到控制檯菜單並從那裏管理您的連接。

我的操作:
在這裏插入圖片描述
在這裏插入圖片描述
密碼就是你linux root的密碼
在這裏插入圖片描述

緩存結果RDM頁面

在這裏插入圖片描述

在這裏插入圖片描述
這下每點擊一個商品詳情頁面,都會加入緩存中
在這裏插入圖片描述
設置緩存成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章