1. 程式人生 > >企業專案開發--分散式快取memcached(3)

企業專案開發--分散式快取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時代,那些黑客正在如何打磨他們的“利器”?(二)