1. 程式人生 > >Jfinal---模擬redis外掛寫一個連線多個memcahe的外掛

Jfinal---模擬redis外掛寫一個連線多個memcahe的外掛

因為專案需要,需要連線多個不同伺服器的memcahe服務,並進行相關操作。
由於Jfinal並未提供memcahe相關的外掛,所以這裡模仿其提供的redis外掛寫了一個人memcahe外掛,僅供參考,有不足或者錯誤的地方,歡迎指正。

  • 1、RedisPlugin —–>MemCachePlugin
import com.danga.MemCached.SockIOPool;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.IPlugin;

/**
 * @author daiwenjun
 * 2017年12月11日
 */
public class MemCachePlugin implements IPlugin { private String cacheName; private String host; private Integer port; public MemCachePlugin(String cacheNameParam,String hostParam, Integer portParam) { if (StrKit.isBlank(cacheNameParam)) throw new IllegalArgumentException("cacheNameParam can not be blank."
); if (StrKit.isBlank(hostParam)) throw new IllegalArgumentException("hostParam can not be blank."); this.cacheName = cacheNameParam.trim(); this.host = hostParam; this.port = portParam; } @Override public boolean start() { //伺服器監聽IP:埠 String [] addr ={host+":"
+port}; Integer [] weights = {3}; SockIOPool pool = SockIOPool.getInstance(cacheName); // 設定伺服器資訊 pool.setServers(addr); pool.setWeights(weights); // 設定初始連線數、最小和最大連線數以及最大處理時間 pool.setInitConn(50); pool.setMinConn(50); pool.setMaxConn(1000); pool.setMaxIdle(1000 * 60 * 60 * 6); // 設定主執行緒的睡眠時間 pool.setMaintSleep(30); // 設定TCP的引數,連線超時等 pool.setNagle(false); pool.setSocketTO(3000); pool.setSocketConnectTO(0); // 初始化連線池 pool.initialize(); MemCache.init(pool); MemCache.addPool(pool,cacheName); return true; } @Override public boolean stop() { return true; } }
  • 2、Redis ——> MemCache
import java.util.concurrent.ConcurrentHashMap;

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;

/**
 * @author daiwenjun
 * 2017年12月11日
 * TODO
 */
public class MemCache {

    private static volatile SockIOPool pool;
    private static final ConcurrentHashMap<String, SockIOPool> cacheMap = new ConcurrentHashMap<String, SockIOPool>();

    static synchronized void addPool(SockIOPool cache, String cacheName) {
        if (cache == null)
            throw new IllegalArgumentException("cache can not be null");
        if (cacheMap.containsKey(cacheName))
            throw new IllegalArgumentException("cache already exists");
        cacheMap.put(cacheName, cache);
    }

    static SockIOPool removeCache(String cacheName) {
        return cacheMap.remove(cacheName);
    }

    public static SockIOPool use(String cacheName) {
        return cacheMap.get(cacheName);
    }

    public static void init(SockIOPool poolParam) {
        MemCache.pool = poolParam;
    }

    public static MemCachedClient getMemCachedClient(String cacheName) {
        return new MemCachedClient(cacheName);
    }

    public static SockIOPool getSockIOPool() {
        return pool;
    }

}
  • 3、封裝工具類
import olo.qd.plugin.MemCache;

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
import com.jfinal.kit.StrKit;

public class MemCacheFactory {
    /**
     * 1分鐘過期
     * */
    public static final int ONE_MINUTE = 60;

    /**
     * 3分鐘過期
     * */
    public static final int THREE_MINUTE = 60 * 3;

    /**
     * 1小時過期
     * */
    public static final int ONE_HOUR = 60 * 60;
    /**
     * 1天過期
     * */
    public static final int ONE_DAY = 60 * 60 * 24;
    /**
     * 1周過期
     * */
    public static final int ONE_WEEK = 60 * 60 * 24 * 7;
    /**
     * 1月過期
     * */
    public static final int ONE_MONTH = 60 * 60 * 24 * 30; // 最大不能超過30天
    /**
     * 永不過期
     * */
    public static final int ALWAYS = 0;

    public static final String SERVER1 = "server1"; 
    public static final String SERVER2 = "server2";

    private static MemCachedClient cacheClient = null;

    private static SockIOPool pool = null;

    //傳參使用
    public static MemCachedClient getInstance(String name) {
        if (StrKit.isBlank(name)) {
            name = SERVER1 ;
        }
        if(pool == null) {
            pool = MemCache.use(name);
        }
        if (cacheClient == null) {
            cacheClient = MemCache.getMemCachedClient(name);
        }
        return cacheClient;
    }

    public static void setMemCachedClient(MemCachedClient cachedClient) {
        if (cachedClient != null) {
            cacheClient = cachedClient;
        }
    }

    /**
     * 快取物件 
     * */
    public static void add(String name,String key, Object obj, int time) {
        MemCachedClient memcache = getInstance(name);
        if (memcache != null) {
            memcache.add(key, obj, time);
        }
        memcache = null;
        System.out.println("*******新增: serverName="+name+"  key="+key+"  value="+obj +"  time="+time);
    }


    /**
     * 獲取物件
     * */
    public static Object get(String name,String key) {
        MemCachedClient memcache = getInstance(name);
        Object obj = null;
            if (memcache != null) {
                obj = memcache.get(key);
            }
        memcache = null;
        System.out.println("*******根據key查詢: serverName="+name+  "   key="+key+"  value="+obj);
        return obj;
    }


    /**
     * 刪除物件
     * */
    public static void delete(String name,String key) {
        MemCachedClient memcache = getInstance(name);
            if (memcache != null) {
                memcache.delete(key);
            }
            System.out.println("*******根據key刪除: serverName="+name+  "   key="+key);
    }


    /**
     * 清空快取
     * */
    public static void flushAll(String name) {
        MemCachedClient memcache = getInstance(name);
            if (memcache != null) {
                memcache.flushAll();
            }
            System.out.println("*******清空memcahe      serverName="+name);
    }

}
  • 4、在Jfinal的MainConfig中的configPlugin配置中新增外掛配置:
MemCachePlugin SERVER1= new MemCachePlugin("server1", ip, port);
me.add(SERVER1);
MemCachePlugin SERVER2= new MemCachePlugin("server2", ip, port);
me.add(SERVER2);
  • 5、程式碼中的具體使用示例:
//新增
MemCacheFactory.add(MemCacheFactory.ZHMOBIADMIN, DEMO_KEY, list, MemCacheFactory.ONE_DAY);
//取值
MemCacheFactory.get(MemCacheFactory.ZHMOBIADMIN, DEMO_KEY);
//刪除
MemCacheFactory.delete(MemCacheFactory.ZHMOBIADMIN, DEMO_KEY);

相關推薦

Jfinal---模擬redis外掛一個連線memcahe外掛

因為專案需要,需要連線多個不同伺服器的memcahe服務,並進行相關操作。 由於Jfinal並未提供memcahe相關的外掛,所以這裡模仿其提供的redis外掛寫了一個人memcahe外掛,僅供參考,有不足或者錯誤的地方,歡迎指正。 1、RedisPlug

JFinal一個Controller 方法配置

一、首先什麼是JFinal? JFinal 是基於Java 語言的極速 web 開發框架,其核心設計目標是迅速開發、程式碼量少、學習簡單、功能強大、輕量級、易擴充套件、Restful設計。 二、JFinal核心控制器Controller Controller是JFinal的核心類之一,也是主要開發MVC模

動手一個簡單的瀏覽器擴充套件外掛

平時寫文件的時候,一些簡單的文件都用 markdown來寫,編輯工具自然是隨便用的,記事本、vs code或者專門的 md編輯器都可以,但是想要預覽的時候,卻有一定的限制,例如我想用 vs code預覽 md檔案,就必須裝一個專門的外掛,或者乾脆就要開啟一個 m

linux下socket程式設計實現一個伺服器連線客戶端

使用socekt通訊一般步驟     1)伺服器端:socker()建立套接字,繫結(bind)並

【C#】一個支援人聊天的TCP程式

碎碎念 先談談我們要實現的效果:客戶端可以選擇要聊天的物件,或者直接廣播訊息(類似QQ的私聊和群訊息) 那麼,該如何實現呢? 首先明確的是,要分客戶端和伺服器端兩個部分(廢話) 客戶端:選擇要傳送的物件,傳送資訊。同時有一個執行緒在監聽是否收到新的資訊。 伺服器端:負責轉發收到的訊息,並負責管理所有接入的連線

fatal error LNK1169:找到一個重定義的符號

ava 文件中 程序 bsp 由於 nbsp .cn 引用 error 這個算是個比較基礎的問題,由於我不是C程序員,本行java,臨時拉來做的,所以有些坑還得自己走出來。 這個問題是由於,全局變量在a.h中定義,在兩個源文件a.cpp和b.cpp中引用,之後被編譯器

一個實體的驗證失敗。有關詳細信息,請參閱“EntityValidationErrors”屬性。

sys date 錯誤 onerror conf erro fig 站點 更新 問題原因可能是: 1. 非空列未插入值錯誤 2. 多個表間外鍵列長度不一樣 3. ef上下文對象db為空 4. ef上下文設置屬性為 db.Configurat

jquery 實現一個頁面tab頁

無法 text mage solid 出現 none poi code tle <!DOCTYPE html ><html ><head><meta http-equiv="Content-Type" content="text/h

導出Excel工具類(一個主表明細表)

導出 excel 選擇 ①ExcelData.java(Excel數據封裝類)package com.kentra.util; import java.util.List; import java.util.Map; /** * * 描述:為導出Excel文件封裝數據 * 封裝Excel

一個頁面tab選項卡效果

結果 菜鳥 提升 ref -a 搜索引擎 flow .cn www. 新整理同一個頁面多個tab選項卡,由於不會自己些代碼,只能從網上找現成的來改。留著備用。 共3部分,HTML、CSS、JS 暫時沒有演示地址和下載地址,以後會補上。 HTML部分 <!DOCTY

js 獲取url的參數值 一個參數

run -c www cno spl http 獲取url參數 strong ear 以下JS函數用於獲取url參數: 1 function getQueryVariable(variable) 2 { 3 var query = window.loc

fatal error LNK1169: 找到一個多重定義的符號

編譯 gpo .cpp post 多重 print use 控制 包含 在vs中,使用c時,由編譯-鏈接,cpp之間是自動的,如: 1,頭文件 x.h: 1 int f(); 2,實現 impl.cpp: 1 #include "stdafx.h" 2 3 int

Object.assign() 從一個源對象復制到目標對象

bject 待完善 示例 ces sign java script {} clas Object.assign()方法用於將所有可枚舉屬性的值從一個或多個源對象復制到目標對象。它將返回目標對象。 1、語法: Object.assign(target, ... , sourc

js將數組中一個字段相同的子元素中合並

++ body 遇到 return json 合並 arr 可能 var 最近js中遇到js將數組中一個或多個字段相同的子元素中合並,相信很多朋友也有遇到,大家可能有多種方法,我在這裏記錄一個相對簡單的方法,當然大家如有其它更好的方法,請提出來大家共同學習。 //將經濟事

js 一個一維數組,算出元素之間相互組合的所有情況

urn each pre 相互 get function post data nta // 數據源 var target = { state1: [‘1‘, ‘2‘], state2: [‘01‘, ‘02‘, ‘03‘],

Windows無法安裝到這個磁盤下,分區包含一個不支持安裝的動態卷

windows安裝 動態磁盤 解決方案:1.系統安裝盤 2.WinPE 基本操作如下: shift+F10 # 進入命令行環境diskpart # 進入diskpart命令環境list diskpart #顯示基本磁盤信息select disk n(磁盤號)

一個頁面ng-app指令

多個ng-app 指令啟動第二個ng-app指令 需要用到angular.bootstrap()方法一個頁面多個ng-app指令

一例對一個實體的驗證失敗。有關詳細信息,請參閱“EntityValidationErrors”屬性的解決

tro https span cep 實例 tps lte .data 防止 這個問題相信只要是做MVC的,都碰到過,也都知道錯誤的原因,就是觸發了定義的實例字段校驗規則。比如定義的不為空,但是為空了,或者定義的字段長度為50,但是超過50了。 可是有時雖然知道是這樣,

用單進程、線程並發、線程分別實現爬一個網站的所有鏈接,用瀏覽器打開所有鏈接並保存截圖 python

app imp mat 並發執行 cut h+ chrome 鏈接 目錄 #coding=utf-8import requestsimport re,os,time,ConfigParserfrom selenium import webdriverfrom multipr

Map之一個Key存Value的MultiValueMap(一個值)

arrays set for get work article () buffer 很好 原鏈接:https://blog.csdn.net/yanzhenjie1003/article/details/51550264 MultiValueMap可以讓一個key對應多個v