企業專案開發--分散式快取memcached(3)
此文已由作者趙計剛授權網易雲社群釋出。
歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。
3.3、ssmm0-data
結構:
3.3.1、pom.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4 5 <modelVersion>4.0.0</modelVersion> 6 7 <!-- 指定父模組 --> 8 <parent> 9 <groupId>com.xxx</groupId> 10 <artifactId>ssmm0</artifactId> 11 <version>1.0-SNAPSHOT</version> 12 </parent> 13 14 <groupId>com.xxx.ssmm0</groupId> 15 <artifactId>ssmm0-data</artifactId> 16 17 <name>ssmm0-data</name> 18 <packaging>jar</packaging><!-- 只是作為其他模組使用的工具 --> 19 20 <!-- 引入實際依賴 --> 21 <dependencies> 22 <!-- mysql --> 23 <dependency> 24 <groupId>mysql</groupId> 25 <artifactId>mysql-connector-java</artifactId> 26 </dependency> 27 <!-- 資料來源 --> 28 <dependency> 29 <groupId>org.apache.tomcat</groupId> 30 <artifactId>tomcat-jdbc</artifactId> 31 </dependency> 32 <!-- mybatis --> 33 <dependency> 34 <groupId>org.mybatis</groupId> 35 <artifactId>mybatis</artifactId> 36 </dependency> 37 <dependency> 38 <groupId>org.mybatis</groupId> 39 <artifactId>mybatis-spring</artifactId> 40 </dependency> 41 <!-- servlet --><!-- 為了會用cookie --> 42 <dependency> 43 <groupId>javax.servlet</groupId> 44 <artifactId>javax.servlet-api</artifactId> 45 </dependency> 46 <!-- bc-加密 --> 47 <dependency> 48 <groupId>org.bouncycastle</groupId> 49 <artifactId>bcprov-jdk15on</artifactId> 50 </dependency> 51 <!-- cc加密 --> 52 <dependency> 53 <groupId>commons-codec</groupId> 54 <artifactId>commons-codec</artifactId> 55 </dependency> 56 <!-- guava cache --> 57 <dependency> 58 <groupId>com.google.guava</groupId> 59 <artifactId>guava</artifactId> 60 <version>14.0.1</version> 61 </dependency> 62 <!-- 引入自定義cache模組 --> 63 <dependency> 64 <groupId>com.xxx.ssmm0</groupId> 65 <artifactId>ssmm0-cache</artifactId> 66 <version>1.0-SNAPSHOT</version> 67 </dependency> 68 </dependencies> 69 </project>
說明:只引入了上邊的ssmm0-cache模組。
3.3.2、Admin
1 package com.xxx.model.userManagement; 2 3 import java.io.Serializable; 4 5 import com.alibaba.fastjson.JSON; 6 7 /** 8 * 管理員 9 * 這裡序列化,是為了向xmemcached中儲存,否則會報異常; 10 * 當然除了用序列化之外,還可以將admin物件轉化為json串,然後進行儲存 11 */ 12 public class Admin implements Serializable{ 13 14 private static final long serialVersionUID = 7149009421720474527L; 15 16 private int id; 17 private String username; 18 private String password; 19 20 public int getId() { 21 return id; 22 } 23 24 public void setId(int id) { 25 this.id = id; 26 } 27 28 public String getUsername() { 29 return username; 30 } 31 32 public void setUsername(String username) { 33 this.username = username; 34 } 35 36 public String getPassword() { 37 return password; 38 } 39 40 public void setPassword(String password) { 41 this.password = password; 42 } 43 44 //將json串轉為Admin 45 public static Admin parseJsonToAdmin(String jsonStr){ 46 try { 47 return JSON.parseObject(jsonStr, Admin.class); 48 } catch (Exception e) { 49 e.printStackTrace(); 50 return null; 51 } 52 } 53 54 //將當前例項轉化為json串 55 public String toJson(){ 56 return JSON.toJSONString(this); 57 } 58 }
說明:這裡只添加了讓該類實現java.io.Serializable介面,添加了序列號
注意:在實際使用中,把物件存入快取有兩種方式
序列化:使用上述的方式,或者使用其他序列化方式
將物件轉化為json串,在該類中,有兩個方法:一個將Admin-->Json,一個將Json-->Admin
這兩種方式都可以,只是Java預設的序列化效率低且生成的碼流大,但是使用方便,當然第二種方式使用也相當簡單。
關於各種序列化的方式以及優缺點對比,檢視《netty權威指南(第2版)》,或者檢視我的"Java高效使用"系列的後續文章
3.3.3、AdminMapper
1 /**************memcached**************/ 2 3 @Select("SELECT * FROM userinfo WHERE id = #{id}") 4 @Results(value = { 5 @Result(id = true, column = "id", property = "id"), 6 @Result(column = "username", property = "username"), 7 @Result(column = "password", property = "password") }) 8 public Admin selectById(@Param("id") int id);
說明:添加了上述按照ID查詢使用者的方法。
3.3.4、AdminDao
1 /******************memcached********************/ 2 public Admin getUserById(int id){ 3 return adminMapper.selectById(id); 4 }
說明:添加了上述方法。
3.3.5、AdminService
1 /*********************memcached********************/ 2 public Admin findAdminById(int id) { 3 //從快取中獲取資料 4 Admin admin = (Admin)MemcachedUtil.getCache(CachePrefix.USER_MANAGEMENT, String.valueOf(id)); 5 //若快取中有,直接返回 6 if(admin != null){ 7 return admin; 8 } 9 //若快取中沒有,從資料庫查詢 10 admin = adminDao.getUserById(id); 11 //若查詢出的資料不為null 12 if(admin!=null){ 13 //將資料存入快取 14 MemcachedUtil.setCacheWithNoReply(CachePrefix.USER_MANAGEMENT, String.valueOf(id), admin); 15 } 16 //返回從資料庫查詢的admin(當然也可能資料庫中也沒有,就是null) 17 return admin; 18 }
說明:添加了上述方法。
注意:
上述方法是快取使用中最常見的模式,即"從快取獲取-->若沒有,從資料庫查詢,存入快取-->返回資料",這就是guava cache的get(Object key)使用一個方法完成的原子操作。
3.4、ssmm0-userManagement
在該模組中,只在一個類中添加了一個方法。
AdminController.java
1 /** 2 * 根據id查詢Admin 3 */ 4 @ResponseBody 5 @RequestMapping("/findAdminById") 6 public Admin findAdminById(@RequestParam(value="id") int id){ 7 8 return adminService.findAdminById(id); 9 }
說明:下邊這個方法就是該模組中唯一新增的一個方法。
4、測試
在瀏覽器輸入"localhost:8080/ssmm0-userManagement/admin/findAdminById?id=1",這樣就可以測試快取,具體測試方式看《第七章 企業專案開發--本地快取guava cache》
這裡要說明的是兩點:
由於在根pom.xml檔案中將dev改成了伺服器啟動後預設使用的環境,所以在之後的測試中,不需要再修改環境了,但是實際上線時,一定要將prod改成預設環境才行
我想在上述URL中不輸入專案名ssmm0-userManagement也可以訪問相關資源,使用如下方式:run as-->run configurations..-->Context引數改為"/"即可
關於memcached的相關內容和Xmemcached的相關內容,請參看下邊連結或者我的"Java快取相關"的後續文章:
http://code.google.com/p/memcached/wiki/NewStart?tm=6
https://code.google.com/p/xmemcached/wiki/User_Guide_zh
免費領取驗證碼、內容安全、簡訊傳送、直播點播體驗包及雲伺服器等套餐
更多網易技術、產品、運營經驗分享請點選。
相關文章:
【推薦】 知物由學|AI時代,那些黑客正在如何打磨他們的“利器”?(二)