memcachedforjava
㈠ 用java做一個大流量,高並發的網站應該怎麼樣進行底層構架
JVM
JEE容器中運行的JVM參數配置參數的正確使用直接關繫到整個系統的性能和處理能力,JVM的調優主要是對內存管理方面的調優,優化的方向分為以下4點:
1.HeapSize 堆的大小,也可以說Java虛擬機使用內存的策略,這點是非常關鍵的。
2.GarbageCollector 通過配置相關的參數進行Java中的垃圾收集器的4個演算法(策略)進行使用。
3.StackSize 棧是JVM的內存指令區,每個線程都有他自己的Stack,Stack的大小限制著線程的數量。
4.DeBug/Log 在JVM中還可以設置對JVM運行時的日誌和JVM掛掉後的日誌輸出,這點非常的關鍵,根據各類JVM的日誌輸出才能配置合適的參數。
網上隨處可見JVM的配置技巧,但是我還是推薦閱讀Sun官方的2篇文章,可以對配置參數的其所依然有一個了解
1.Java HotSpot VM Options
Java HotSpot VM Options
2.Troubleshooting Guide for Java SE 6 with HotSpot VMTroubleshooting Guide for Java SE 6 with HotSpot VM
另外,我相信不是每個人攻城師都是天天對著這些JVM參數的,如果你忘記了那些關鍵的參數你可以輸入Java -X(大寫X)進行提示。
JDBC
針對MySQL的JDBC的參數在之前的文章中也有介紹過,在單台機器或者集群的環境下合理的使用JDBC中的配置參數對操作資料庫也有很大的影響。
一些所謂高性能的 Java ORM開源框架也就是打開了很多JDBC中的默認參數:
1.例如:autoReconnect、prepStmtCacheSize、cachePrepStmts、useNewIO、blobSendChunkSize 等,
2.例如集群環境下:roundRobinLoadBalance、failOverReadOnly、autoReconnectForPools、secondsBeforeRetryMaster。
具體內容可以參閱MySQL的JDBC官方使用手冊:
http://dev.mysql.com/doc/refman/5.1/zh/connectors.html#cj-jdbc-reference
資料庫連接池(DataSource)
應用程序與資料庫連接頻繁的交互會給系統帶來瓶頸和大量的開銷會影響到系統的性能,JDBC連接池負責分配、管理和釋放資料庫連接,它允許應用程序重復使用一個現有的資料庫連接,而再不是重新建立一個連接,因此應用程序不需要頻繁的與資料庫開關連接,並且可以釋放空閑時間超過最大空閑時間的資料庫連接來避免因為沒有釋放資料庫連接而引起的資料庫連接遺漏。這項技術能明顯提高對資料庫操作的性能。
在此我認為有一點需要說明:
連接池的使用也是需要關閉,因為在資料庫連接池啟動的時候就預先和資料庫獲得了相應的連接,之後不再需要應用程序直接的和資料庫打交道,因為應用程序使用資料庫連接池是一個「借」的概念,應用程序從資料庫連接池中獲得資源是「借出」,還需要還回去,就好比有20個水桶放在這里,需要拿水的人都可以使用這些木桶從水池裡面拿水,如果20個人都拿完水,不將水桶還回原地,那麼後面來的人再需要拿水,只能在旁邊等待有人將木桶還回去,之前的人用完後需要放回去,不然後面的人就會一直等待,造成資源堵塞,同理,應用程序獲取資料庫連接的時候Connection連接對象的時候是從「池」中分配一個資料庫連接出去,在使用完畢後,歸還這個資料庫連接,這樣才能保持資料庫的連接「有借有還」准則。
參考資料:
http://dev.mysql.com/doc/refman/5.1/zh/connectors.html#cj-connection-pooling
數據存取
資料庫伺服器的優化和數據的存取,什麼類型的數據放在什麼地方更好是值得去思考的問題,將來的存儲很可能是混用的,Cache,NOSQL,DFS,DataBase 在一個系統中都會有,生活的餐具和平日里穿衣服需要擺放在家裡,但是不會用同一種類型的傢具存放,貌似沒有那個人家把餐具和衣服放在同一個櫃子裡面的。這就像是系統中不同類型的數據一樣,對不同類型的數據需要使用合適的存儲環境。文件和圖片的存儲,首先按照訪問的熱度分類,或者按照文件的大小。強關系類型並且需要事務支持的採用傳統的資料庫,弱關系型不需要事務支持的可以考慮NOSQL,海量文件存儲可以考慮一下支持網路存儲的DFS,至於緩存要看你單個數據存儲的大小和讀寫的比例。
還有一點值得注意就是數據讀寫分離,無論在DataBase還是NOSQL的環境中大部分都是讀大於寫,因此在設計時還需考慮 不僅僅需要讓數據的讀分散在多台機器上,還需要考慮多台機器之間的數據一致性,MySQL的一主多從,在加上MySQL-Proxy或者借用JDBC中的一些參數(roundRobinLoadBalance、failOverReadOnly、autoReconnectForPools、secondsBeforeRetryMaster)對後續應用程序開發,可以將讀和寫分離,將大量讀的壓力分散在多台機器上,並且還保證了數據的一致性。
緩存
在宏觀上看緩存一般分為2種:本地緩存和分布式緩存
1.本地緩存,對於Java的本地緩存而言就是講數據放入靜態(static)的數據結合中,然後需要用的時候就從靜態數據結合中拿出來,對於高並發的環境建議使用 ConcurrentHashMap或者CopyOnWriteArrayList作為本地緩存。緩存的使用更具體點說就是對系統內存的使用,使用多少內存的資源需要有一個適當比例,如果超過適當的使用存儲訪問,將會適得其反,導致整個系統的運行效率低下。
2. 分布式緩存,一般用於分布式的環境,將每台機器上的緩存進行集中化的存儲,並且不僅僅用於緩存的使用范疇,還可以作為分布式系統數據同步/傳輸的一種手段,一般被使用最多的就是Memcached和Redis。
數據存儲在不同的介質上讀/寫得到的效率是不同的,在系統中如何善用緩存,讓你的數據更靠近cpu,下面有一張圖你需要永遠牢記在心裡,來自Google的技術大牛Jeff Dean(Ref)的傑作,如圖所示:
並發/多線程
在高並發環境下建議開發者使用JDK中自帶的並發包(java.util.concurrent),在JDK1.5以後使用java.util.concurrent下的工具類可以簡化多線程開發,在java.util.concurrent的工具中主要分為以下幾個主要部分:
1.線程池,線程池的介面(Executor、ExecutorService)與實現類(ThreadPoolExecutor、 ScheledThreadPoolExecutor),利用jdk自帶的線程池框架可以管理任務的排隊和安排,並允許受控制的關閉。因為運行一個線程需要消耗系統CPU資源,而創建、結束一個線程也對系統CPU資源有開銷,使用線程池不僅僅可以有效的管理多線程的使用,還是可以提高線程的運行效率。
2.本地隊列,提供了高效的、可伸縮的、線程安全的非阻塞 FIFO 隊列。java.util.concurrent 中的五個實現都支持擴展的 BlockingQueue 介面,該介面定義了 put 和 take 的阻塞版本:LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue 和 DelayQueue。這些不同的類覆蓋了生產者-使用者、消息傳遞、並行任務執行和相關並發設計的大多數常見使用的上下文。
㈡ 使用Memcached Java Client 如何遍歷緩存中的數據
這要看你的存儲是用的是什麼數據結構啊?不同的數據存儲數據結構遍歷方式肯定就不一樣啊。
比如說java常用的HashMap,HashSet和ArrayList等。
㈢ memcached java 哪個好
.載入commons-pool-1.5.6.jar、java_memcached-release_2.6.6.jar、slf4j-api-1.6.1.jar、slf4j-simple-1.6.1.jar 2.創建memcached工具類: 查看源碼 列印?
01 public class MemcachedUtil { 02
03 /**
04 * memcached客戶端單例 05 */ 06
private static MemCachedClient cachedClient = new MemCachedClient();
07 08 /**
09 * 初始化連接池 10 */ 11 static {
12 //獲取連接池的實例
13 SockIOPool pool = SockIOPool.getInstance(); 14
15 //伺服器列表及其權重
16 String[] servers = {"127.0.0.1:11211"}; 17 Integer[] weights = {3}
㈣ memcached java客戶端下載地址
https://github.com/gwhalin/Memcached-Java-Client/downloads
這里不是有下么?最新版的
㈤ memcached+tomcat+nginx負載均衡session共享, 信息: Could not delete session from memcached.
加一個memcached-2.5.jar
㈥ 請問java行業里說的大牛是什麼意思
1. 你需要精通面向對象分析與設計(OOA/OOD)、涉及模式(GOF,J2EEDP)以及綜合模式。你應該了解UML,尤其是class、object、interaction以及statediagrams。
2. 你需要學習Java語言 的基礎知識以及它的核心類庫(collections、serialization、streams、networking、multithreading、reflection、event、handling、NIO、localization以及其他)。
3. 你應該了解JVM 、classloaders、classreflect以及垃圾回收的基本工作 機制等。你應該有能力反編譯一個類文件並且明白一些基本的匯編指令。
4. 如果你將要寫客戶端程序,你需要學習Web的小應用程序(applet),必需掌握GUI 設計的思想和方法,以及桌面程序的SWING、AWT、SWT。你還應該對UI部件的JavaBEAN組件模式有所了解。JavaBEANS也被應用在JSP中以把業務邏輯從表現層中分離出來。
5. 你需要學習Java資料庫 技術,並且會使用至少一種persistence/ORM構架,例如Hibernate、JDO、CocoBase、TopLink、InsideLiberator(國產JDO紅工廠軟體)或者iBatis。
6. 你還應該了解對象關系的阻抗失配的含義以及它是如何影響業務對象與關系型資料庫的交互,和它的運行結果。還需要掌握不同的資料庫產品運用,比如Oracle、MySQL 、SQL server。
7. 你需要學習Servlets、JSP,以及JSTL(StandardTagLibraries)和可以選擇的第三方TagLibraries。
8. 你需要熟悉主流的網頁框架,例如JSF、Struts、Tapestry、Cocoon、WebWork,以及他們下面的涉及模式,如MVC/MODEL2。
9. 你需要學習如何使用及管理Web伺服器 ,例如tomcat、resin、Jrun,並且知道如何在其基礎上擴展和維護Web程序。
10. 你需要學習分布式對象以及遠程API,例如RMI和RMI/IIOP。
11. 你需要掌握各種流行中間件技術標准和與Java結合實現,比如Tuxedo、CROBA,當然也包括JavaEE本身。
12. 你需要學習最少一種的XMLAPI,例如JAXP(JavaAPIforXMLProcessing)、JDOM(JavaforXMLDocumentObjectModel)、DOM4J或JAXR(JavaAPIforXMLRegistries)。
13. 你應該學習如何利用Java的API和工具來構建WebService。例如JAX-RPC(JavaAPIforXML/RPC)、 SAAJ(SOAPwithAttachmentsAPIforJava)、JAXB(JavaArchitectureforXMLBinding)、 JAXM(JavaAPIforXMLMessaging)、JAXR(JavaAPIforXMLRegistries)或者 JWSDP(JavaWebServicesDeveloperPack)。
14. 你需要學習一門輕量級應用程序框架,例如Spring、PicoContainer、Avalon,以及它們的IoC/DI風格(setter,constructor,interfaceinjection)。
15. 你需要熟悉不同的J2EE技術,例如JNDI()、 JMS(JavaMessageService)、JTA/JTS(JavaTransactionAPI /JavaTransactionService)、JMX(JavaManagementeXtensions),以及JavaMail。
16. 你需要學習企業級JavaBeans(EJB)以及它們的不同組件模式:Stateless/StatefulSessionBeans、 EntityBeans(包含Bean-ManagedPersistence[BMP]或者Container- ManagedPersistence[CMP]和它的EJB-QL),或者Message-DrivenBeans(MDB)。
17. 你需要學習如何管理與配置一個J2EE應用程序伺服器,如WebLogic、JBoss等,並且利用它的附加服務,例如簇類,連接池以及分布式處理支援。你還需要了解如何在它上面封裝和配置應用程序並且能夠監控、調整它的性能。
18. 你需要熟悉面向方面的程序設計以及面向屬性的程序設計(這兩個都被很容易混淆的縮寫為AOP),以及他們的主流Java規格和執行。例如AspectJ和AspectWerkz。
19. 你需要熟悉對不同有用的API和frame work等來為你服務。例如Log4J(logging/tracing)、Quartz(scheling)、 JGroups(networkgroupcommunication)、JCache(distributedcaching)、 Lucene(full-textsearch)、JakartaCommons等等。
20. 你應該熟練掌握一種JavaIDE例如sunOne、netBeans、IntelliJIDEA或者Eclipse。(有些人更喜歡VI或EMACS來編寫文件。隨便你用什麼了)
21. Java(精確的說是有些配置)是冗長的,它需要很多的人工代碼 (例如EJB),所以你需要熟悉代碼生成工具,例如XDoclet。
22. 你需要熟悉一種單元測試體系(JNunit),並且學習不同的生成、部署工具(Ant,Maven)。
23. 你需要熟悉一些在Java開發 中經常用到的軟體工程過程。例如RUP(RationalUnifiedProcess)andAgilemethodologies。
24. 你還需要緊跟Java發展的步伐,比如現在可以深入的學習Webwork2.0。
25. 你必需要對實際項目的開發流程有所了解,至少要有兩個有實際應用價值的項目,而不是練習項目!因為現在企業看重的是你有沒有實際的開發經驗,真正開發經驗的體現就是你做的項目,也就是有實際應用的項目!
㈦ springmvc中引用了memcached-java-client為什麼在終端用telnet打不開memcache服務
首先可以在多台伺服器裝memcached,啟動時分別指定容量和埠
訪問時採用集群方式訪問,只需要spring配置文件裡面配置即可
value可以放任何對象,包括集合
每個鍵值的生命周期可以在放入時獨立設置
類庫可以用spymemcached
數據更新方式可以在後台的定時任務中執行
下面是spring mvc中配置:
<bean id="memcachedClient" class="net.spy.memcached.spring.MemcachedClientFactoryBean">
<property name="servers" value="伺服器A:埠,伺服器B:埠,伺服器C:埠" />
<property name="protocol" value="BINARY" />
<property name="transcoder">
<bean class="net.spy.memcached.transcoders.SerializingTranscoder">
<property name="compressionThreshold" value="1024" />
</bean>
</property>
<property name="opTimeout" value="2000" />
<property name="timeoutExceptionThreshold" value="1998" />
<property name="locatorType" value="CONSISTENT" />
<property name="hashAlg">
<value type="net.spy.memcached.DefaultHashAlgorithm">KETAMA_HASH</value>
</property>
<property name="failureMode" value="Redistribute" />
<property name="useNagleAlgorithm" value="false" />
</bean>
㈧ java中memcache怎麼用
1. memcached client for java客戶端API:memcached client for java
引入jar包:java-memcached-2.6.2.jar
package com.pcitc.memcached;
import com.danga.MemCached.*;
public class TestMemcached {
public static void main(String[] args) {
/* 初始化SockIOPool,管理memcached的連接池 */
String[] servers = { "192.168.1.111:11211" };
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(servers);
pool.setFailover(true);
pool.setInitConn(10);
pool.setMinConn(5);
pool.setMaxConn(250);
pool.setMaintSleep(30);
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setAliveCheck(true);
pool.initialize();
/* 建立MemcachedClient實例 */
MemCachedClient memCachedClient = new MemCachedClient();
for (int i = 0; i < 10; i++) {
/* 將對象加入到memcached緩存 */
boolean success = memCachedClient.set("" + i, "Hello!");
/* 從memcached緩存中按key值取對象 */
String result = (String) memCachedClient.get("" + i);
System.out.println(String.format("set( %d ): %s", i, success));
System.out.println(String.format("get( %d ): %s", i, result));
}
}
}
2. spymemcached客戶端API:spymemcached client
引入jar包:spymemcached-2.10.3.jar
package com.pcitc.memcached;
import java.net.InetSocketAddress;
import java.util.concurrent.Future;
import net.spy.memcached.MemcachedClient;
public class MClient {
public static void main(String[] args) {
setValue();
getValue();
}
// 用spymemcached將對象存入緩存
public static void setValue() {
try {
/* 建立MemcachedClient 實例,並指定memcached服務的IP地址和埠號 */
MemcachedClient mc = new MemcachedClient(new InetSocketAddress(
"192.168.1.111", 11211));
Future<Boolean> b = null;
/* 將key值,過期時間(秒)和要緩存的對象set到memcached中 */
b = mc.set("neead", 900, "someObject");
if (b.get().booleanValue() == true) {
mc.shutdown();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
// 用spymemcached從緩存中取得對象
public static void getValue() {
try {
/* 建立MemcachedClient 實例,並指定memcached服務的IP地址和埠號 */
MemcachedClient mc = new MemcachedClient(new InetSocketAddress(
"192.168.1.111", 11211));
/* 按照key值從memcached中查找緩存,不存在則返回null */
Object b = mc.get("neead");
mc.shutdown();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
3.兩種API比較
memcached client for java:較早推出的memcached JAVA客戶端API,應用廣泛,運行比較穩定。
spymemcached:A simple, asynchronous, single-threaded memcached client written in java. 支持非同步,單線程的memcached客戶端,用到了java1.5版本的concurrent和nio,存取速度會高於前者,但是穩定性不好,測試中常報timeOut等相關異常。
由於memcached client for java發布了新版本,性能上有所提高,並且運行穩定,所以建議使用memcached client for java
㈨ 我以前用linux安裝的memcached在java程序中是好用的現在我在windows上安裝memcached進程上已經有memcached
先用telnet連接一下windows所在電腦的memcached開放的監聽埠,看是否能夠聯通
㈩ MemCached Java Client 有API嗎
有的。下面是一些基礎的api。
1. 構造函數
public MemcachedClient(InetSocketAddress[] ia) throws IOException;
public MemcachedClient(List<InetSocketAddress> addrs) throws IOException;
public MemcachedClient(ConnectionFactory cf, List<InetSocketAddress> addrs) throws IOException;
其中最簡單的構造函數就是第一個,可以直接傳遞一個InetSocketAddress,也可以是InetSocketAddress的數組。其實InetSocketAddress也是被轉換成數組的。
比如:
MemcachedClient cache = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
2. 常用方法
一般緩存數據的常用操作有:set(add+replace)、get、replace、add
public Future<Boolean> set(String key, int exp, Object o)
第一個參數:鍵(key)
第二個參數:過期時間(單位是秒)
第三個參數:要設置緩存中的對象(value),如果沒有則插入,如果有則修改。
public Object get(String key)
第一個參數:鍵(key)
public Future<Boolean> replace(String key, int exp, Object o)
第一個參數:鍵(key)
第二個參數:過期時間(單位是秒)
第三個參數:該鍵的新值(new value),如果有則修改。
public Future<Boolean> add(String key, int exp, Object o)
第一個參數:鍵(key)
第二個參數:過期時間(單位是秒)
第三個參數:該鍵的值(value),如果沒有則插入。