springboot使用memcache緩存


Memcached簡介

  Memcached 是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護進程通信。

  Memcached 的守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護進程通信。但是它並不提供冗余(例如,復制其hashmap條目);當某個服務器S停止運行或崩潰了,所有存放在S上的鍵/值對都將丟失。  

存儲方式

  為了提高性能,memcached中保存的數據都存儲在memcached內置的內存存儲空間中。由於數據僅存在於內存中,因此重啟memcached、重啟操作系統會導致全部數據消失。另外,內容容量達到指定值之后,就基於LRU(Least Recently Used)算法自動刪除不使用的緩存。memcached本身是為緩存而設計的服務器,因此並沒有過多考慮數據的永久性問題。

Memcached 安裝

  我是在windows下安裝使用的。

  32位請下載這里: 鏈接: https://pan.baidu.com/s/1qPxMDPEtsCFBWaG3bsVT6Q 密碼: hrih

  下載之后解壓就行。

  64位先下載32位,進行解壓,接着下載這里:鏈接: https://pan.baidu.com/s/1X3MeLgB5QObksm35LKZ-eg 密碼: xbn4  

  解壓之后,把里面的三個文件復制到32位的里面,覆蓋即可。

  我解壓之后放在E盤:

  使用管理員權限運行以下命令

  E:\memcache\memcached.exe -d install

啟動關閉卸載memcache

  啟動: E:\memcache\memcached.exe -d start

  關閉: E:\memcache\memcached.exe -d stop

  卸載: E:\memcache\memcached.exe -d uninstall

在spring boot中使用memcache作為緩存

  1.pom.xml依賴

  

        <!--memcache-->
        <dependency>
            <groupId>commons-pool</groupId>
            <artifactId>commons-pool</artifactId>
            <version>1.5.6</version>
        </dependency>
        <dependency>
            <groupId>com.whalin</groupId>
            <artifactId>Memcached-Java-Client</artifactId>
            <version>3.0.2</version>
        </dependency>

  2.application.properties

  

memcache.servers=127.0.0.1:11211
memcache.failover=true
memcache.initConn=10
memcache.minConn=20
memcache.maxConn=1000
memcache.maintSleep=50
memcache.nagle=false
memcache.socketTO=3000
memcache.aliveCheck=true

  3.MemcacheConfiguration

@Configuration
public class MemcacheConfiguration {

    @Value("${memcache.servers}")
    private String[] servers;
    @Value("${memcache.failover}")
    private boolean failover;
    @Value("${memcache.initConn}")
    private int initConn;
    @Value("${memcache.minConn}")
    private int minConn;
    @Value("${memcache.maxConn}")
    private int maxConn;
    @Value("${memcache.maintSleep}")
    private int maintSleep;
    @Value("${memcache.nagle}")
    private boolean nagel;
    @Value("${memcache.socketTO}")
    private int socketTO;
    @Value("${memcache.aliveCheck}")
    private boolean aliveCheck;

    @Bean
    public SockIOPool sockIOPool () {
        SockIOPool pool = SockIOPool.getInstance();
        pool.setServers(servers);
        pool.setFailover(failover);
        pool.setInitConn(initConn);
        pool.setMinConn(minConn);
        pool.setMaxConn(maxConn);
        pool.setMaintSleep(maintSleep);
        pool.setNagle(nagel);
        pool.setSocketTO(socketTO);
        pool.setAliveCheck(aliveCheck);
        pool.initialize();
        return pool;
    }

    @Bean
    public MemCachedClient memCachedClient(){
        return new MemCachedClient();
    }

}

  4.MemcacheController

  

@Controller
public class MemcacheController {

    @Autowired
    private MemCachedClient memCachedClient;

    /**
     * memcache緩存
     */
    @RequestMapping("/memcache")
    @ResponseBody
    public String memcache() throws InterruptedException{
        // 放入緩存
        boolean flag = memCachedClient.set("mem", "name");
        // 取出緩存
        Object value = memCachedClient.get("mem");
        System.out.println(value);
        // 3s后過期
        memCachedClient.set("num", "666", new Date(3000));
        /*memCachedClient.set("num", "666", new Date(System.currentTimeMillis()+3000));與上面的區別是當設置了這個時間點
        之后,它會以服務端的時間為准,也就是說如果本地客戶端的時間跟服務端的時間有差值,這個值就會出現問題。
        例:如果本地時間是20:00:00,服務端時間為20:00:10,那么實際上會是40秒之后這個緩存key失效*/
        Object key = memCachedClient.get("num");
        System.out.println(key);
        //多線程睡眠3s
        Thread.sleep(3000);
        key  = memCachedClient.get("num");
        System.out.println(value);
        System.out.println(key );
        return "success";
    }
}

  5.控制台輸出:

  name 

  666

  name

  null

 

  總結:memcache通過set方法把值存入都memcache緩存中;通過get方法把值取出來;通過設置過期時間,使其失效。

 

* Memcache:不支持持久化、只支持key-value鍵值、多線程 、集群分布式
* Redis:支持持久化、豐富的數據類型、單線程 、集群分布式
* Ehcache:直接在jvm虛擬機中緩存,速度快,效率高,單個應用或者對緩存訪問要求很高的應用,用ehcache。核心程序僅僅依賴slf4j。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM