ehcache memcache redis 區別

来源:http://www.cnblogs.com/Mao-admin/archive/2017/03/15/6552973.html
-Advertisement-
Play Games

之前用過redis 和 memcache ,沒有ehcache 的開發經驗,最近也查閱不少文檔和博客,寫一些總結,也有不少內容總結與諸多博客中的博主總結: Ehcache EhCache 是一個純Java的進程內緩存框架,具有快速、精幹等特點,是Hibernate中預設的CacheProvider, ...


之前用過redis 和 memcache ,沒有ehcache 的開發經驗,最近也查閱不少文檔和博客,寫一些總結,也有不少內容總結與諸多博客中的博主總結:

 Ehcache

EhCache 是一個純Java的進程內緩存框架,具有快速、精幹等特點,是Hibernate中預設的CacheProvider,所以被用於大型複雜分散式web application的各個節點中。Ehcache是一種廣泛使用的開源Java分散式緩存。主要面向通用緩存,Java EE和輕量級容器。它具有記憶體和磁碟存儲,緩存載入器,緩存擴展,緩存異常處理程式,一個gzip緩存servlet過濾器,支持REST和SOAP api等特點。

主要的特性有:

1.  快速

Ehcache的發行有一段時長了,經過幾年的努力和不計其數的性能測試,Ehcache終被設計於large, high concurrency systems.

2. 簡單

開發者提供的介面非常簡單明瞭,從Ehcache的搭建到運用運行僅僅需要的是你寶貴的幾分鐘。其實很多開發者都不知道自己用在用Ehcache,Ehcache被廣泛的運用於其他的開源項目

比如:hibernate

3.夠輕量

核心程式僅僅依賴slf4j這一個包,沒有之一!一般Ehcache的發佈版本不會到2M,V 2.2.3  才 668KB。

4.多種緩存策略

Ehcache提供了對大數據的記憶體和硬碟的存儲,緩存數據會在虛擬機重啟的過程中寫入磁碟。最近版本允許多實例、保存對象高靈活性、提供LRU、LFU、FIFO淘汰演算法,基礎屬性支持熱配置、支持的插件多

5.具有緩存和緩存管理器的偵聽介面

緩存管理器監聽器 (CacheManagerListener)和 緩存監聽器(CacheEvenListener),做一些統計或數據一致性廣播挺好用的

6.可以通過RMI、可插入API等方式進行分散式緩存;

如何使用?

夠簡單就是Ehcache的一大特色,自然用起來just so easy!

集成使用(Spring項目):

  a.加入ehcache-core-2.6.5.jar和mybatis-ehcache-1.0.2.jar

      b.整合ehcache:

    配置mappercache中的typeehcachecache介面的實現類型  

SqlMapConfig.xml:

<!-- 開啟二級緩存 -->

 <setting name="cacheEnabled" value="true"/>

UserMapper.xml:

 <mapper namespace="cn.itcast.mybatis.mapper.UserMapper">

 <!-- 開啟本mapper的namespace下的二緩存
    type:指定cache介面的實現類的類型,mybatis預設使用PerpetualCache
    要和ehcache整合,需要配置type為ehcache實現cache介面的類型
 -->
 <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

 

 

    在classpath下配置ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
  <diskStore path="F:\develop\ehcache" />
  <defaultCache
    maxElementsInMemory="1000"
    maxElementsOnDisk="10000000"
    eternal="false"
    overflowToDisk="false"
    timeToIdleSeconds="120"
    timeToLiveSeconds="120"
    diskExpiryThreadIntervalSeconds="120"
    memoryStoreEvictionPolicy="LRU">
  </defaultCache>
</ehcache>

 

 

 

代碼中有個ehcache.xml文件,現在來介紹一下這個文件中的一些屬性
  1.        name:緩存名稱。
  2.        maxElementsInMemory:緩存最大個數。
  3.        eternal:對象是否永久有效,一但設置了,timeout將不起作用。
  4.        timeToIdleSeconds:設置對象在失效前的允許閑置時間(單位:秒)。僅當eternal=false對象不是永久有效時使用,可選屬性,預設值是0,也就是可閑置時間無窮大。
  5.        timeToLiveSeconds:設置對象在失效前允許存活時間,最大時間介於創建時間和失效時間之間。僅當eternal=false對象不是永久有效時使用,預設是0.,也就是對象存活時 間無窮大。
  6.        overflowToDisk:當記憶體中對象數量達到maxElementsInMemory時,Ehcache將會對象寫到磁碟中。
  7.        diskSpoolBufferSizeMB:這個參數設置DiskStore(磁碟緩存)的緩存區大小。預設是30MB。每個Cache都應該有自己的一個緩衝區。
  8.        maxElementsOnDisk:硬碟最大緩存個數。
  9.        diskPersistent:是否緩存數據在虛擬機重啟的過程中寫入磁碟據 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
  10.        diskExpiryThreadIntervalSeconds:磁碟失效線程運行時間間隔,預設是120秒。
  11.        memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理記憶體。預設策略是LRU。你可以設置為 FIFO或是LFU。
  12.        clearOnFlush:記憶體數量最大時是否清除。

memcache :

  memcache是一套分散式的高速緩存系統

    通過在記憶體里維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像視頻文件以及資料庫檢索的結果等。簡單的說就是將數據調用到記憶體中,然後從記憶體中讀取,從而大大提高讀取速度。

  MemCache的工作機制:

    先檢查客戶端的請求數據是否在memcached中,如有,直接把請求數據返回,不再對資料庫進行任何操作;如果請求的數據不在memcached中,就去查資料庫,把從資料庫中獲取的數據返回給客戶端,同時把數據緩存一份到memcached中(memcached客戶端不負責,需要程式明確實現);每次更新資料庫的同時更新memcached中的數據,保證一致性;當分配給memcached記憶體空間用完之後,會使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效數據首先被替換,然後再替換掉最近未使用的數據

  Memcached是以守護程式(監聽)方式運行於一個或多個伺服器,隨時會接收客戶端連接和操作.

  Memcached使用:

    memcache C語言所編寫,依賴於最新版本的GCC和libevent。

    安裝使用:(下載memcached和libevent),自定義安裝目錄:/usr/local/memcached

 

#mkdir /usr/local/memcached

      #cd /usr/local/memcached

      使用如下命令下載,需聯網:

      # wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz

      # wget http://www.monkey.org/~provos/libevent-1.2.tar.gz

      通過ls查看是否下載完成,下載完成會有兩個包:libevent-1.2.tar.gz和memcached-1.2.0.tar.gz

      先安裝libevent(確認已安裝GCC,如未安裝就先安裝GCC)  

      # tar zxvf libevent-1.2.tar.gz

      # cd libevent-1.2

      # ./configure -prefix=/usr

      # make (如果遇到提示gcc 沒有安裝則先安裝gcc)

      # make install

      測試libevent是否安裝成功:

      lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3

      -rwxr-xr-x 1 root root 263546 11?? 12 17:38 libevent-1.2.so.1.0.3

      -rw-r-r- 1 root root 454156 11?? 12 17:38 libevent.a

      -rwxr-xr-x 1 root root 811 11?? 12 17:38 libevent.la

      lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent.so -> libevent-1.2.so.1.0.3

      安裝成功

安裝memcached,同時需要安裝中指定libevent的安裝位置:

# cd /tmp

# tar zxvf memcached-1.2.0.tar.gz

# cd memcached-1.2.0

# ./configure -with-libevent=/usr

# make

# make install

如果中間出現報錯,請仔細檢查錯誤信息,按照錯誤信息來配置或者增加相應的庫或者路徑。

安裝完成後會把memcached放到 /usr/local/bin/memcached ,

測試是否成功安裝memcached:

# ls -al /usr/local/bin/mem*

-rwxr-xr-x 1 root root 137986 11?? 12 17:39 /usr/local/bin/memcached

-rwxr-xr-x 1 root root 140179 11?? 12 17:39 /usr/local/bin/memcached-debug

啟動Memcached服務:

 1.啟動Memcache的伺服器端:

# /usr/local/bin/memcached -d -m 8096 -u root -l 192.168.77.105 -p 12000 -c 256 -P /tmp/memcached.pid

-d選項是啟動一個守護進程,

-m是分配給Memcache使用的記憶體數量,單位是MB,我這裡是8096MB,

-u是運行Memcache的用戶,我這裡是root,

-l是監聽的伺服器IP地址,如果有多個地址的話,我這裡指定了伺服器的IP地址192.168.77.105,

-p是設置Memcache監聽的埠,我這裡設置了12000,最好是1024以上的埠,

-c選項是最大運行的併發連接數,預設是1024,我這裡設置了256,按照你伺服器的負載量來設定,

-P是設置保存Memcache的pid文件,我這裡是保存在 /tmp/memcached.pid,

 

2.如果要結束Memcache進程,執行:

# cat /tmp/memcached.pid 或者 ps -aux | grep memcache   (找到對應的進程id號)

# kill 進程id號

也可以啟動多個守護進程,不過埠不能重覆。

 memcache 的連接

telnet  ip   port 

註意連接之前需要再memcache服務端把memcache的防火牆規則加上

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT 

重新載入防火牆規則

service iptables restart

OK ,現在應該就可以連上memcache了

在客戶端輸入stats 查看memcache的狀態信息

 

pid              memcache伺服器的進程ID

uptime      伺服器已經運行的秒數

time           伺服器當前的unix時間戳

version     memcache版本

pointer_size         當前操作系統的指針大小(32位系統一般是32bit)

rusage_user          進程的累計用戶時間

rusage_system    進程的累計系統時間

curr_items            伺服器當前存儲的items數量

total_items           從伺服器啟動以後存儲的items總數量

bytes                       當前伺服器存儲items占用的位元組數

curr_connections        當前打開著的連接數

total_connections        從伺服器啟動以後曾經打開過的連接數

connection_structures          伺服器分配的連接構造數

cmd_get get命令          (獲取)總請求次數

cmd_set set命令          (保存)總請求次數

get_hits          總命中次數

get_misses        總未命中次數

evictions     為獲取空閑記憶體而刪除的items數(分配給memcache的空間用滿後需要刪除舊的items來得到空間分配給新的items)

bytes_read    讀取位元組數(請求位元組數)

bytes_written     總發送位元組數(結果位元組數)

limit_maxbytes     分配給memcache的記憶體大小(位元組)

threads         當前線程數

redis:

1.1. 什麼是redis

Redis是用C語言開發的一個開源的高性能鍵值對(key-value)資料庫。它通過提供多種鍵值數據類型來適應不同場景下的存儲需求,目前為止Redis支持的鍵值數據類型如下:

  字元串類型

  散列類型

  列表類型

  集合類型

  有序集合類型。

2.2. redis的應用場景

  緩存(數據查詢、短連接、新聞內容、商品內容等等)。(最多使用)

  分散式集群架構中的session分離。

  聊天室的線上好友列表。

  任務隊列。(秒殺、搶購、12306等等)

  應用排行榜。

  網站訪問統計。

  數據過期處理(可以精確到毫秒)

 1.1. Redis的安裝

  redisC語言開發,建議在linux上運行,本此使用Centos6.4作為安裝環境。安裝redis需要先將官網下載的源碼進行編譯,編譯依賴gcc環境,如果沒有gcc環境;

  需要安裝gccyum install gcc-c++

  從官網下載 http://download.redis.io/releases/redis-3.0.0.tar.gz

  將redis-3.0.0.tar.gz拷貝到/usr/local

 解壓源碼

   #tar -zxvf redis-3.0.0.tar.gz

進入解壓後的目錄進行編譯 

  #cd /usr/local/redis-3.0.0

  #make

安裝到指定目錄,/usr/local/redis

  #cd /usr/local/redis-3.0.0 

  #make PREFIX=/usr/local/redis install

 redis.conf

  redis.confredis的配置文件,redis.confredis源碼目錄。

  註意修改port作為redis進程的埠,port預設6379

拷貝配置文件到安裝目錄下

  進入源碼目錄,裡面有一份配置文件 redis.conf,然後將其拷貝到安裝路徑下

 

  #cd /usr/local/redis

 

  #mkdir conf

 

  #cp /usr/local/redis-3.0.0/redis.conf  /usr/local/redis/bin

 

安裝目錄bin下的文件夾列表

redis3.0新增的redis-sentinel是redis集群管理工具可實現高可用

1.1. redis啟動

1.1.1. 前端模式啟動

直接運行bin/redis-server將以前端模式啟動,前端模式啟動的缺點是ssh命令視窗關閉則redis-server程式結束,不推薦使用此方法。如下圖:

1.1.2. 後端模式啟動

修改redis.conf配置文件, daemonize yes 以後端模式啟動。

 執行如下命令啟動redis

cd /usr/local/redis

./bin/redis-server ./redis.conf

redis預設使用6379埠。

1.1. 通過jedis連接redis單機

1.1.1. jar包如果是通過maven管理的項目,則在pom.xml文件中添加

pom.xml

<dependency>

     <groupId>redis.clients</groupId>

     <artifactId>jedis</artifactId>

     <version>2.7.0</version>

</dependency>

如果不是maven管理。手動添加jia包 (commons-pool2-2-.3.jar和jedis-2.7.0.jar)

通過創建單實例jedis對象連接redis服務,如下代碼

 

// 實例連接redis

 

@Test

 

public void testJedisSingle() {

 

   Jedis jedis = new Jedis("192.168.101.3", 6379);

 

  jedis.set("name", "bar");

 

  String name = jedis.get("name");

 

  System.out.println(name);

 

  jedis.close();

 

}

 

 使用連接池連接

 

通過單實例連接redis不能對redis連接進行共用,可以使用連接池對redis連接進行共用,提高資源利用率,使用jedisPool連接redis服務,如下代碼:

 

@Test

 

public void pool() {

 

  JedisPoolConfig config = new JedisPoolConfig();

 

  //最大連接數

 

  config.setMaxTotal(30);

 

  //最大連接空閑數

 

  config.setMaxIdle(2);

 

  JedisPool pool = new JedisPool(config, "192.168.101.3", 6379);

 

  Jedis jedis = null;

 

  try  {

 

    jedis = pool.getResource();

 

    jedis.set("name", "lisi");

 

    String name = jedis.get("name");

 

    System.out.println(name);

 

  }catch(Exception ex){

 

    ex.printStackTrace();

 

  }finally{

 

    if(jedis != null){

 

    //關閉連接

 

    jedis.close();

 

    }

 

  }

 

}

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 好久沒有進來了,之前勵志堅持寫博客,記錄自己在做代碼搬運工這段歷程中點滴,可是僅僅只堅持了幾天,就放棄了!果然是,世上無難事,只要肯放棄!哈哈……閑話不多說,開始進入正題,給自己留點筆記,避免將來老了,沒有記憶了,還能翻開看看。也為了能給看到這篇文章的人,需要這點幫助的人一點提示,當然這篇文章也許不 ...
  • 寫博客是一件很偉大的事情,尤其是也牛逼的博客,因為它能幫助需要的人,更能使自己對知識有一個更為深刻的理解! 歡迎關註我的博客! 字元串操作(取當前時間) string time=convert.tostring(DateTime.Today).split( new char []{' '}); te ...
  • 近期寫了個掃描IIS托管站點然後定期註冊到Consul的小工具,隨意網上拷貝了個幫助類,搞完本機測試沒問題,扔到伺服器發現碩大的一個異常。。 System.Runtime.InteropServices.COMException (0x80005000): 未知錯誤(0x80005000) 在 Sy ...
  • 在安裝rabbitmq過程中,發現使用比較新的erlang環境安裝包不能成功安裝到server 2003上,沒有辦法,只能一個版本一個版本去嘗試,發現erlang 17.5版本可以成功安裝到server 2003上,並且rabbitmq使用的是3.6.6版本。 ...
  • 公司業務量比較大,接了很多項目,為了縮短開發周期老闆讓我牽頭搭建了一個快速開發平臺。 我們主要的業務是做OA、CRM、ERP一類的管理系統,一個通用的後臺搭出來,再配合一些快速開發的組件開發效率能提高很多。 另外老闆一再強調要支持APP開發,一次開發能部署到安卓和IOS上。 作為開篇之作,先介紹一下 ...
  • 應甲方要求,需要把高拍儀集成到B/S系統中來,在集成過程中遇到的幾點問題做為總結,以備查找。 1、甲方送來的高拍儀是淘寶上買來的,型號是XY530,功能非常簡單,成像效果也很一般。如果沒有其它要求,可以嘗試用一下。 (PS,捷宇的400客戶妹子服務態度挺好,晚上8點多還沒下班,贊一個!) ,這貨長這 ...
  • 部署環境:windows server 2012 R2,伺服器在AD域中 參考網址: https://msdn.microsoft.com/zh-cn/magazine/jj219455(office.15).aspx http://www.cnblogs.com/yanweidie/p/45161 ...
  • Python自動化開發(三):迴圈次數控制、常用數據類型、字元串格式化、列表常用操作、列表的後續操作 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...