memcached真實項目中的應用

上一篇memcached基本配置與使用http://blog.csdn.net/sup_heaven/article/details/32337711介紹了memcached的一些基本概念和一個範例。java

這一篇將以介紹一個memcached在項目中的應用。假設咱們有一個web應用,裏面有商品信息,文章信息,評論信息,其餘信息,咱們但願對其作緩存,那麼咱們在ServiceImpl層就不在調用DAOmpl層,而是調用CacheImpl層,在CacheImpl層中判斷要取出的商品信息是否已經在緩存中,若是在了,那麼直接從緩存中去,若是沒有這個時候仍是從數據庫中取,同時將它放到緩存中,以便下次使用。mysql

第一步、新建一個常量類,用於上面的四種信息的在數組中的索引。web

[java]  view plain  copy
  在CODE上查看代碼片 派生到個人代碼片
  1. public class MemcachedConstant {  
  2.     public static final int MEMCACHED_GOODSDETAIL = 0;  
  3.     public static final int MEMCACHED_ARTICLEDETAIL = 1;  
  4.     public static final int MEMCACHED_COMMENTDETAIL = 2;  
  5.     public static final int MEMCACHED_OTHERDETAIL = 3;  
  6. }  

第二步、因爲有大量的商品信息,咱們在放入緩存時必須給定一個key,那麼咱們最好規範的命名不一樣類別的key,如商品的key就是商品的前綴加上商品的編號。

[java]  view plain  copy
  在CODE上查看代碼片 派生到個人代碼片
  1. public class MemcachedKeyUtil {  
  2.     private static final String GOODS_KEY_PREFIX = "goods_";  
  3.       
  4.     public static String getGoodsKey(long goodsId) {  
  5.         return GOODS_KEY_PREFIX + goodsId;  
  6.     }  
  7. }  

第三步、咱們建一個和上一篇文章中同樣的工具類,用於新建pool、client,操做緩存等。這裏再強調一下,一個pool關聯多個server(就是會根據權重將緩存放在這些servers上),一個client會經過poolName關聯具體的pool。

[java]  view plain  copy
  在CODE上查看代碼片 派生到個人代碼片
  1. public class MemcachedUtil {  
  2.     private int MEMCACHED_SERVER_NUM = 4;  
  3.     private SockIOPool[] pools = new SockIOPool[MEMCACHED_SERVER_NUM];  
  4.     private MemCachedClient[] mcs = new MemCachedClient[MEMCACHED_SERVER_NUM];  
  5.     private final String[] poolNames = new String[] { "GOODSDETAIL_POOL""""""" };  
  6.     private static MemcachedUtil instance;  
  7.     private MemcachedUtil() {  
  8.         this.init();  
  9.     }  
  10.     // 單例  
  11.     public static MemcachedUtil getInstance() {  
  12.         if (MemcachedUtil.instance == null) {  
  13.             synchronized (MemcachedUtil.class) {  
  14.                 if (MemcachedUtil.instance == null) {  
  15.                     MemcachedUtil.instance = new MemcachedUtil();  
  16.                 }  
  17.             }  
  18.         }  
  19.         return MemcachedUtil.instance;  
  20.     }  
  21.       
  22.     public Object get(int index, String key) {  
  23.         return this.mcs[index].get(key);  
  24.     }  
  25.       
  26.     public boolean set(int index, String key, Object value) {  
  27.         return this.mcs[index].set(key, value);  
  28.     }  
  29.       
  30.     public boolean delete(String key) {  
  31.         return this.mcs[index].delete(key);  
  32.     }  
  33.     public MemCachedClient getMemCachedClient(int index) {  
  34.         return this.mcs[index];  
  35.     }  
  36.       
  37.     public void init() {  
  38.         for (int i = 0; i < MEMCACHED_SERVER_NUM; ++i) {  
  39.             this.pools[i] = SockIOPool.getInstance(poolNames[i]);  
  40.             this.pools[i].setServers(servers);  
  41.             this.pools[i].setWeights(weights);  
  42.             this.pools[i].setInitConn(initConn);  
  43.             this.pools[i].setMinConn(minConn);  
  44.             this.pools[i].setMaxConn(maxConn);  
  45.             this.pools[i].setMaxIdle(maxIdle);  
  46.             this.pools[i].setMaxBusyTime(maxBusyTime);  
  47.             this.pools[i].setMaintSleep(maintSleep);  
  48.             this.pools[i].setNagle(ifNagle);  
  49.             this.pools[i].setSocketTO(socketTO);  
  50.             this.pools[i].setSocketConnectTO(socketConnectTO);  
  51.             this.pools[i].setFailover(ifFailOver);  
  52.             this.pools[i].setFailback(ifFailback);  
  53.             this.pools[i].setAliveCheck(ifAliveCheck);  
  54.             this.pools[i].initialize();  
  55.             this.mcs[i] = new MemCachedClient(poolNames[i]);  
  56.         }  
  57.     }  
  58. }  

第四步、新建一個基類以供所用繼承它的CacheImpl直接調用MemcachedUtil裏的方法,若是不寫該類那麼在CacheImpl中會有不少重複的操做MemcachedUtil的代碼。

[java]  view plain  copy
  在CODE上查看代碼片 派生到個人代碼片
  1. public class MemcachedSupport {  
  2.     public boolean setDetailData(String key, Object value) {  
  3.         return MemcachedUtil.getInstance().set(MemcachedConstant.MEMCACHED_DETAIL, key, value);  
  4.     }  
  5.       
  6.     public Object getDetailData(String key) {  
  7.         return MemcachedUtil.getInstance().get(MemcachedConstant.MEMCACHED_DETAIL, key);  
  8.     }  
  9.       
  10.     public boolean deleteDetailData(String key) {  
  11.         return MemcachedUtil.getInstance().delete(MemcachedConstant.MEMCACHED_DETAIL);  
  12.     }  
  13. }  

第五步、新建一個GoodsCacheImpl,該類的做用就是一開始所說的,娶不到緩存,就調用DAO查詢並放入緩存,若是緩存中有就直接從緩存中拿。

[java]  view plain  copy
  在CODE上查看代碼片 派生到個人代碼片
  1. public class GoodsCacheImpl extends MemcachedSupport{  
  2.     @Resource (name = "goodsDaoImpl")  
  3.     private GoodsDao goodsDao;  
  4.       
  5.     public Goods selectGoodsById(long goodsId) {  
  6.         Goods goods = null;  
  7.         String goodsKey = MemcachedKeyUtil.getGoodsKey(goodsId);  
  8.         goods = (Goods) getDetailData(goodsKey);  
  9.         if (goods == null) {  
  10.             goods = goodsDao.selectGoodsById(goodsId, false);  
  11.             if (goods != null) {  
  12.                 setDetailData(goodsKey, goods);  
  13.             }  
  14.         }  
  15.         return goods;  
  16.     }  
  17. }  

這樣就在你的應用中使用了memcached,不過上面的只是部分代碼,跑不起來的哦。
相關文章
相關標籤/搜索