[toc] "項目的Github地址" 需求介紹 為了縮短用戶看到首頁信息的時間, 我們把首頁顯示的類目信息, 廣告等數據放到Redis緩存中, 這樣就不用通過耗時的資料庫操作獲取數據, 而是直接從Redis緩存中獲取. 在開始之前先記錄一個坑: 重啟虛擬機後nginx伺服器關閉了, 導致nginx ...
目錄
- 項目的Github地址
- 需求介紹
- 搭建Redis集群環境
- 基於SOA架構, 創建門戶ashop-portal-web門戶項目
- 實現門戶首頁商品類目顯示
- 實現門戶首頁大廣告輪播
- 實現商品類目緩存
- 實現大廣告緩存, 緩存同步
項目的Github地址
需求介紹
- 為了縮短用戶看到首頁信息的時間, 我們把首頁顯示的類目信息, 廣告等數據放到Redis緩存中, 這樣就不用通過耗時的資料庫操作獲取數據, 而是直接從Redis緩存中獲取.
- 在開始之前先記錄一個坑: 重啟虛擬機後nginx伺服器關閉了, 導致nginx上的圖片無法訪問, 當再次啟動nginx的時候遇到
- 進入nginx.conf文件把HTTPS SERVER裡面的root註釋掉後問題就沒有了, 能正常啟動.
搭建Redis集群環境
- 實現Redis 3主3從集群搭建
- Redis3.0 開始支持集群,在每個 Master 上存放著各不相同的數據,即分散式存儲的思想。
集群中的每個節點都需要知道集群中自己之外的其它節點。 - Redis 集群主(Master(M1,M2,M3))從(Slave(S1,S2,S3))複製、讀寫分離 。Master 只負責寫和
同步數據給 Slave,Slave 負責被讀的任務,可以通過 Slave 的擴容提高讀的速度。
下麵先描述單機版redis的安裝
- 首先要把redis的安裝包上傳到虛擬機上.
- 安裝gcc-c++編譯器, 輸入命令:
yum install gcc-c++
(我的機器已經安裝過了, 第一次安裝中途需要輸入確定信息)
- 解壓redis安裝包:
tar zxvf 壓縮包名...
- 進入解壓後的文件夾, 輸入指令
make
進行編譯, 結果如下
- 接下來執行安裝操作:
make PREFIX=/usr/local/redis/ install
(PREFIX指定了安裝位置)
- 進入bin目錄後就可以登陸redis了. 但是redis有兩種啟動方式, 預設是前臺啟動:
./redis-server
- 使用前臺啟動的話, 命令行就不能用來輸入命令了, 可以按Ctrl + C 強行退出.
- 然後進入到解壓目錄, 把解壓文件中的
redis.conf
文件拷貝到安裝目錄下:cp redis.conf /usr/local/redis/bin
- 編輯redis.conf:
vi redis.conf
- 重新啟動redis:
./redis-server redis.conf
(指定配置文件) - 查看是否啟動:
ps -ef | grep -i redis
- 在防火牆中配置6379埠為打開.
- 重啟防火牆:
service iptables restart
- 測試是否能夠連接上redis服務:
./redis-cli
- 單機安裝到這裡便告一段落.
下麵將進行Redis3主3從集群環境搭建
- 安裝集群需要ruby腳本, 先解壓ruby腳本
tar zxvf 壓縮包名
- 進入解壓目錄, 執行install.sh
- 然後創建redis集群相關目錄
- 首先在/opt目錄下創建redis目錄
- 然後進入redis目錄, 在這創建3個集群相關目錄:
mkdir conf
,mkdir logs
,mkdir data
- 其中conf目錄用於存放6個redis共用的配置文件
- 需要將原始的redis.conf配置文件, 拷貝到/opt/redis/conf中, 更名為redis-common
- 建議如果不熟悉的話在windows下進行配置, 然後在上傳到linux中. (該配置文件已經給出, 可以到素材文件夾中獲取)
- 然後進入
/usr/local/redis/bin
目錄中, 加入各個redis的配置文件.
關閉防火牆:
service iptables stop
- 然後啟動redis的6個服務. (先把之前啟動的單機redis進程kill掉)
然後逐個啟動6個服務
- 接下來要創建集群:(按照自己的ip地址進行修改), 執行目錄為redis解壓目錄下的src目錄
./redis-trib.rb create --replicas 1 192.168.117.130:6380 192.168.117.130:6381 192.168.117.130:6382 192.168.117.130:6383 192.168.117.130:6384 192.168.117.130:6385
- 找到執行這行命令的目錄, redis壓縮包的解壓目錄/src: 複製執行上面的命令
- 下麵連接上集群進行測試, 進入
/usr/local/redis/bin
- 輸入指令:
./redis-cli -c -p 6380
, -c表示集群
- 這裡記錄一下redis集群的重啟.
- 重啟的參考連接
- 大致步驟是要把/opt/redis/data 目錄下的文件清空, 然後重新啟動每個redis服務, 最後創建redis集群.
基於SOA架構, 創建門戶ashop-portal-web門戶項目
- 在ashop項目下創建war類型子模塊
ashop-portal-web
- 接著配置好pom.xml, src/main/resource下的配置文件和web.xml. 這些文件的配置可在源碼中獲得.
- 然後把靜態資源複製到項目中
- 接著創建PageController
- 打包部署項目, 顯示出網站首頁本階段完成.
實現門戶首頁商品類目顯示
- 創建遠程服務方法:
- 然後封裝回顯數據的實體類對象
- 在ashop-common模塊下的beans包中創建
CatResult
類
- 創建CatNode實體類.
- 編寫web模塊的service介面和實現類, 裡面涉及到json字元串的封裝
- 編寫controller, 這次響應回去的類型是text/html
- 最後實現這樣的效果
實現門戶首頁大廣告輪播
- 遠程服務提供者實現
- 編寫封裝響應信息的實體類.
編寫web模塊的service介面及實現類
編寫controller
- 最後打包部署, 能在商品的大廣告位看到圖片
實現商品類目緩存
- 考慮到商城首頁的併發量很大, 如果每個用戶的請求都從資料庫中查詢商品類目效率將會很低. 我們將會用redis把商品類目緩存到記憶體中, 加快響應速度.
- 整個邏輯是很好理解的:
- 如果redis緩存中沒有商品類目數據, 就通過調用ashop-rpc遠程服務獲得數據, 通過處理後保存到redis中, 再返回給用戶進行展示.
- 如果redis緩存中已經緩存了商品類目數據, 就直接返回給客戶, 不需要調用ashop-rpc.
- 首先在pom文件中添加依賴
創建applicationContext-redis.xml
在src下創建文件cache.properties, 記錄redis中保存商品類目的鍵, 註意要在上面的spring配置文件中添加context頭
- 接下來修改service實現類中的邏輯
實現大廣告緩存, 緩存同步
- 緩存的邏輯和上面商品類目的緩存一樣.
緩存同步
- 使用緩存就肯定要考慮緩存更新的問題. 如果後臺更新了數據, 而redis緩存中的數據沒有更新, 用戶就會獲取到非最新數據, 出現臟讀.
- 關於實現緩存與資料庫之間的同步, 以下提供兩種思路:
- 設置key的生命周期, 定期同步資料庫.
- 當調用遠程服務操作資料庫後, 同時清空緩存中的內容, 這樣當客戶訪問時伺服器將重新到資料庫讀取數據.