Dubbox 基本特性之結果快取
3.3 Dubbo結果快取
3.3.1結果快取
快取的好處不用多說,在傳統的業務開發中,引入快取可以幫助減輕資料庫的壓力,在分散式的系統中,引入快取有兩種方式,第一種是在呼叫者,也就是消費者端引入快取,如果能夠命中快取,則預設讀取快取中的內容,不需要再進行遠端呼叫,這樣就減少了一次IO 請求,也能減少服務提供者的壓力,第二種就是在服務提供者提供快取,同樣的請求,把對請求的結果快取在某個地方,比如Redis,或者java記憶體中,亦或者第三方的記憶體容器裡,當資料庫有更新的時候,同步更新記憶體,當新的請求在快取中沒有命中的時候,就會擊穿快取落到資料庫例項上。
以上就是快取設計的基本也是最簡單的實現方式,不過如何提高快取的命中率,有很多的演算法,有Least Frequently Used(LFU),LeastRecently User(LRU),First in First out(FIFO)等等的演算法。
Dubbo也支援快取,並且是在服務消費者實現了快取,因為Dubbo是一個純粹的服務呼叫框架,所以它並沒有實現高效能高命中的快取策略,其實也沒有辦法實現,因為沒有具體的業務場景,如何提高快取命中率,跟業務是息息相關的,哪些是熱點資料,在具體業務中才會知道,所以Dubbo只提供了三種快取方案
本小節,只對LRU的實現給出基本Demo,其他的演算法實現將在後面的章節再一起分析
3.3.2 LRU快取Demo的基本實現
因為剛才已經說了,Dubbo的快取是在服務消費者呼叫端進行配置的,所以服務提供者端,不需要做任何特殊的處理,我們按照慣例,先定義一個介面(服務消費者和服務提供者端同路徑下都要有
package org.bazinga.service;
public interface CacheService {
public String getResultByName(String name);
}
服務提供者給出具體的實現CacheServiceImpl.java:
服務提供者端的配置檔案也不要做什麼大改變,與普通的dubbo提供者配置檔案是一樣的spring-dubbo-provider-cache.xmlpackage org.bazinga.service.impl; import java.util.concurrent.atomic.AtomicInteger; import org.bazinga.service.CacheService; public class CacheServiceImpl implements CacheService { private AtomicInteger index = new AtomicInteger(); public String getResultByName(String name) { Integer callCount = index.getAndIncrement(); System.out.println("paramter is "+ name +" call time is "+ callCount); if(name == null){ return "hello hero"; }else if(name.equals("Lyn")){ return "hello Lyn"; }else{ return "hello War3"; } } }
<?xml version="1.1" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application owner="lyncc" name="bazinga-app" />
<!--zookeeper註冊中心 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>
<dubbo:protocol name ="dubbo" port="20880" />
<!-- 釋出這個服務 -->
<dubbo:service protocol="dubbo" timeout="4000" interface ="org.bazinga.service.CacheService" ref="cachaService"/>
<!-- 和本地bean一樣實現服務 -->
<bean id="cachaService" class="org.bazinga.service.impl.CacheServiceImpl" />
</beans>
測試類DubboxProviderCacheService.java:
package org.bazinga.service.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class DubboxProviderCacheService {
public static void main(String[] args) throws InterruptedException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"spring-dubbo-provider-cache.xml");
context.start();
Thread.sleep(2000000l);
}
}
服務提供者的配置與普通的dubbo配置是一致的,接下來就是服務消費者Demo的編寫,其實與上面的驗證或者非同步呼叫一樣,都很簡單,甚至更加簡單,只要在配置檔案中加入一個簡單的配置就可以輕鬆地完成快取的配置,我們在服務消費者端同package下引入的CacheService.java,然後就是配置檔案了spring-dubbo-consumer-cache.xml,其實比普通的配置檔案就多了一個標籤”cache=lru”:
<?xml version="1.1" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application owner="lyncc" name="bazinga-consumer" />
<!--zookeeper註冊中心 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/>
<!-- 增加對快取的支援 -->
<dubbo:reference id="cacheService" interface="org.bazinga.service.CacheService" cache="lru"/>
</beans>
就是這麼簡單的配置就可以完成這樣快取的功能了,編寫測試類:
package org.bazinga.service.test;
import org.bazinga.service.CacheService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class DubboConsumerCacheService {
public static void main(String[] args) throws InterruptedException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"spring-dubbo-consumer-cache.xml");
context.start();
CacheService cacheService = (CacheService)context.getBean("cacheService");
for(int i = 0;i <100;i++){
System.out.println(cacheService.getResultByName("Lyn"));
}
}
}
好了,到此為止,所有的配置檔案就已經完成了,我們進入測試環節,我們在CacheServiceImpl.java記錄了被呼叫的次數,服務消費者迴圈呼叫了100次,如果正常情況下,服務提供者的控制檯應該列印被呼叫了100次,引入快取之後,服務消費者快取了結果,所以呼叫的次數被大大減小
,我們先啟動DubboxProviderCacheService.java的main函式,然後再啟動DubboConsumerCacheService.java的main函式:
服務消費者的控制檯列印結果:
“Hello Lyn”這樣的欄位重複了100遍,我們再看看關鍵的服務提供端的控制檯列印訊息:
可以看到服務提供者只被消費了一次,這樣就說明快取生效了,雖然服務呼叫方呼叫了100次,但是真正請求傳送到服務提供者的只有一次,LRU快取演算法就是如此,把最近最少使用的快取物件給踢走,實現的策略就是把新的請求和對應的請求結果放在快取的頂部,當快取達到容量極限的時候,把底部物件剔除,所以經常被讀取的快取物件就會一直呆在快取池中。有兩種方法可以實現我,Array 或者是linked list
3.3.3 本章小結
本章只是簡單的介紹了一下Dubbo對快取的支援,簡單的寫了一個基於LRU的Demo,幫助大家入門對本模組的理解,更加詳細的快取,在下面的章節會再具體介紹。
相關推薦
Dubbox 基本特性之結果快取
3.3 Dubbo結果快取 3.3.1結果快取 快取的好處不用多說,在傳統的業務開發中,引入快取可以幫助減輕資料庫的壓力,在分散式的系統中,引入快取有兩種方式,第一種是在呼叫者,也就是消費者端引入快取,如果能夠命中快取,則預設讀取快取中的內容,不需要再進行遠端呼叫,
Dubbox 基本特性之泛化呼叫
Dubbo 是支援泛化呼叫的,什麼是泛化呼叫呢,泛化呼叫的好處是什麼呢,泛化呼叫說白一點就是服務消費者並沒有服務的介面,學了前面幾章的內容之後,你肯定會發現,在我們開發寫Demo的時候,必做的一件事情,就是在服務消費者和服務提供者兩端同路徑下有同樣的介面,只不過在服務提供者
Dubbox 基本特性之直接呼叫
Dubbo的原作者樑飛說過,其實對於遠端呼叫RPC來說,遠端呼叫的大白話理解就是服務消費者直接通過網路IO傳遞引數,傳遞方法名,服務提供者獲取到引數,方法名之後通過反射來呼叫本地的方法,執行完本地的方法之後,將結果再通過網路傳遞給呼叫方,這個過程就是RPC最最簡單也是最最精
Dubbo基本特性之泛化調用
string instance ava face 處理 eight long tle exceptio Dubbo 是支持泛化調用的,什麽是泛化調用呢?泛化調用的好處是什麽呢,泛化調用說白一點就是服務消費者並沒有服務的接口。 在《Dubbo入門—搭建一個最簡單的De
HTML5新特性之離線快取技術實戰
八、離線Web應用實戰。 通過一個簡單的記事本程式——PermaNote,來解釋如何使用。程式將使用者的文字儲存到localStorage中,並且在網路連線可用的時候, 將其上傳到伺服器,PermaNote只允許使用者編輯單個筆記。 PermaNote應用包含3個檔案,一個應用清單檔案、
HTML5新特性之離線快取技術
一、離線快取的起因。 HTML5之前的網頁,都是無連線,必須聯網才能訪問,這其實也是web的特色,這其實對於PC是時代問題並不大,但到了移動網際網路時代, 裝置終端位置不再固定,依賴無線訊號,網路的可靠性變得降低,比如坐在火車上,過了一個隧道(15分鐘),便無法訪
深入理解nandflash之基本特性
nandflash作為嵌入式中的”磁碟”, 被廣泛的應用, 以(K9F2G08U0B)為例,其他型號都差不多 nandflash的結構 nandflash的結構有頁(page), block(塊)的概念,其中頁是真實概念,而塊兒是虛擬概念(目的是為了更
dubbox的學習之路1(實現原理,特性、安裝部署、負載均衡)
1. Dubbo是什麼? Dubbo是一個分散式服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案,以及SOA服務治理方案。簡單的說,dubbo就是個服務框架,如果沒有分散式的需求,其實是不需要用的,只有在分散式的時候,才有dubbo這樣的分散式服務框架的需求,並且
Android 5.X新特性之RecyclerView基本解析及無限複用
說到RecyclerView,相信大家都不陌生,它是我們經典級ListView的升級版,升級後的RecyclerView展現了極大的靈活性。同時內部直接封裝了ViewHolder,不用我們自己定義ViewHolder就能實現item的回收和複用功能。當然它肯定不
Dubbo之旅--結果快取
在上篇文章中我們隊Dubbo的擴充套件進行了一些基本瞭解.這些擴充套件能夠很好的幫助我們在實際的專案中發揮作用,接下來對於dubbo的一些高階特徵,針對特殊情況而進行的處理進行進一步的介紹,這裡我們要說的是結果快取. 為什麼要用到結果快取,主要是用於加速熱門資
mysql 5.7 新特性之 json 型別 基本操作
近幾年來,nosql大行其道,json更是火的一塌糊塗,作為資料庫的元老,mysql在5.7版本中添加了對json資料的支援。這片部落格主要記錄對mysql json型別的學習筆記和總結心得。首先建立一個數據庫learnjson,並建立一張表json_start:create
oracle 12c 新特性之不可見字段
創建 oracl alt created 顯式 11g 不可見 插入數據 esc 在Oracle 11g R1中,Oracle以不可見索引和虛擬字段的形式引入了一些不錯的增強特性。繼承前者並發揚光大,Oracle 12c 中引入了不可見字段思想。在之前的版本中
ActiveMQ(19):Consumer高級特性之獨有消費者(Exclusive Consumer)
consumer高級特性之獨有消費者(exclusive consumer)一、簡介Queue中的消息是按照順序被分發到consumers的。然而,當你有多個consumers同時從相同的queue中提取消息時,你將失去這個保證。因為這些消息是被多個線程並發的處理。有的時候,保證消息按照順序處理是很重要的。如
ActiveMQ(20):Consumer高級特性之重新投遞(Redelivery Policy)
jms activemq 重新投遞 一、簡介ActiveMQ在接收消息的Client有以下幾種操作的時候,需要重新傳遞消息: 1:Client用了transactions,且在session中調用了rollback() 2:Client用了transactions,且在調用commit()之前關閉
JDK5新特性之線程同步工具類(三)
string 兩個人 exec random 主線程 一個人 exce print exchange 一. Semaphore Semaphore能夠控制同一時候訪問資源的線程個數, 比如: 實現一個文件同意的並發訪問數. Semaphore實現的功能就類似廁全部5個坑
Oracle 12C 新特性之擴展數據類型(extended data type)
stand 特性 standard ava dbm har sco stat rac Oracle 12C 新特性-擴展數據類型,在12c中,與早期版本相比,諸如VARCHAR2, NAVARCHAR2以及 RAW這些數據類型的大小會從4K以及2K字節擴展至32K字節。只要
ActiveMQ(23):Consumer高級特性之Message dispatche async、Consumer Priority與Message Selectors
jms activemq message dispatche async consumer priority message selectors 一、Message dispatche async(消息異步分發)在activemq4.0以後,你可以選擇broker同步或異步的把消息分發給消
ActiveMQ(22):Consumer高級特性之消息分組(Message Groups)
jms message groups activemq 一、簡介Message Groups就是對消息分組,它是Exclusive Consumer功能的增強。邏輯上,Message Groups 可以看成是一種並發的Exclusive Consumer。跟所有的消息都由唯一的consumer處理
ActiveMQ(24):Consumer高級特性之Slow Consumer Handling(慢消費者的處理)
jms activemq slow consumer handling 慢消費者的處理 一、Prefetch機制ActiveMQ通過Prefetch機制來提高性能,方式是在客戶端的內存裏可能會緩存一定數量的消息。緩存消息的數量由prefetch limit來控制。當某個consumer的pre
Oracle12c功能增強新特性之維護&升級&恢復&數據泵等
特點 back director spl 診斷 art 同步 value transform 1. 內容提要 1) 表分區維護的增強。 2) 數據庫升級改善。 3) 跨網絡還原/恢復數據文件。 4) 數據泵的增強。 5) 實時ADDM。 6)