本文目錄一覽:
- 1、JAVA幾種緩存技術介紹說明
- 2、JAVA緩存框架有哪些意義呢?
- 3、JAVA緩存框架有哪些意義
- 4、java 目前市面上比較火的框架有哪些?
- 5、java 分佈式緩存框架有哪些
- 6、Spring本地緩存的使用方法
JAVA幾種緩存技術介紹說明
1、OSCache
OSCache是個一個廣泛採用的高性能的J2EE緩存框架,OSCache能用於任何java應用程序的普通的緩存解決方案。
OSCache有以下特點:
(1)緩存任何對象,你可以不受限制的緩存部分jsp頁面或HTTP請求,任何java對象都可以緩存。
永久緩存–緩存能隨意的寫入硬盤,因此答應昂貴的創建(eXPensive-to-create)數據來保持緩存,甚至能讓應用重啟。
(2)支持集群–集群緩存數據能被單個的進行參數配置,不需要修改代碼。
緩存記錄的過期–你可以有最大限度的控制緩存對象的過期,包括可插入式的刷新策略(假如默認性能不需要時)。
2、Java Caching System
JSC(Java Caching System)是一個用分佈式的緩存系統,是基於服務器的java應用程序。它是通過提供治理各種動態緩存數據來加速動態web應用。
JCS和其他緩存系統一樣,也是一個用於高速讀取,低速寫入的應用程序。
動態內容和報表系統能夠獲得更好的性能。
假如一個網站,有重複的網站結構,使用間歇性更新方式的數據庫(而不是連續不斷的更新數據庫),被重複搜索出相同結果的,就能夠通過執行緩存方式改進其性能和伸縮性。
3、EHCache
EHCache 是一個純java的在進程中的緩存,它具有以下特性:快速,簡單,為Hibernate2.1充當可插入的緩存,最小的依靠性,全面的文檔和測試。
4、JCache
JCache是個開源程序,正在努力成為JSR-107開源規範,JSR-107規範已經很多年沒改變了。這個版本仍然是構建在最初的功能定義上。
5、ShiftOne
ShiftOne Java Object Cache是一個執行一系列嚴格的對象緩存策略的Java lib,就像一個輕量級的配置緩存工作狀態的框架。
6、SwarmCache
SwarmCache是一個簡單且有效的分佈式緩存,它使用ip multicast與同一個局域網的其他主機進
行通訊,是非凡為集群和數據驅動web應用程序而設計的。
SwarmCache能夠讓典型的讀操作大大超過寫操作的這類應用提供更好的性能支持。
SwarmCache使用JavaGroups來治理從屬關係和分佈式緩存的通訊。
擴展資料
Java中緩存存在的原因:
一 般情況下,一個網站,或者一個應用,它的一般形式是,瀏覽器請求應用服務器,應用服務器做一堆計算後再請求數據庫,數據庫收到請求後再作一堆計算後把數據 返回給應用服務器。
應用服務器再作一堆計算後把數據返回給瀏覽器,這個是一個標準流程。但是隨着互連網的普及,上網的人越來越多,網上的信息量也越來越多。
數據庫每秒中接受請求的次數也是有限的,如果利用有限的資源來提供儘可能大的吞吐量呢。一個辦法:減少計算量,縮短請求流程(減少網絡io或者硬盤io),這時候緩存就可以大展手腳了。
緩存的基本原理就是打破上圖中所描繪的標準流程,在這個標準流程中,任何 一個環節都可以被切斷.請求可以從緩存里取到數據直接返回。
JAVA緩存框架有哪些意義呢?
OSCache或者EHCache這種,主要的應用場景大多是應用內緩存。也就是這一個程序里使用的緩存。所有的緩存在自己寫的這個程序裏面。
而memcache是獨立的另一個進程,是獨立的緩存,緩存的數據保存的另一個進程的內存中。區別有兩點:
EHCache這種應用中的緩存,不太容易實現多實例應用間共享。對於常見的Web型應用,需要通過啟動多個實例來增強處理能力的情況下,緩存不能共享就不利於緩存命中。
memcache這種獨立的緩存,不會受到應用的啟動、停止的影響。在Web應用中,程序重啟是一個很常見的事情,如果使用應用內的緩存,一旦程序重啟,緩存就全部丟失了(當然默認指沒有開啟持久化支持的情況下)。
JAVA緩存框架有哪些意義
(1100)(0)一、什麼是緩存1、Cache是高速緩衝存儲器一種特殊的存儲器子系統,其中複製了頻繁使用的數據以利於快速訪問2、凡是位於速度相差較大的兩種硬件/軟件之間的,用於協調兩者數據傳輸速度差異的結構,均可稱之為Cache二、緩存的分類1、基於web應用的系統架構圖2、在系統架構的不同層級之間,為了加快訪問速度,都可以存在緩存操作系統磁盤緩存-減少磁盤機械操作數據庫緩存-減少文件系統I/O應用程序緩存-減少對數據庫的查詢Web服務器緩存-減少應用服務器請求客戶端瀏覽器緩存-減少對網站的訪問三、操作系統緩存1、文件系統提供的DiskCache:操作系統會把經常訪問到的文件內容放入到內存當中,由文件系統來管理2、當應用程序通過文件系統訪問磁盤文件的時候,操作系統從DiskCache當中讀取文件內容,加速了文件讀取速度3、DiskCache由操作系統來自動管理,一般不用人工干預,但應當保證物理內存充足,以便於操作系統可以使用盡量多的內存充當DiskCache,加速文件讀取速度4、特殊的應用程序對文件系統DiskCache有很高的要求,會繞開文件系統DiskCache,直接訪問磁盤分區,自己實現Disk5、Cache策略Oracle的rawdevice(裸設備)–直接拋棄文件系統MySQL的InnoDB:innodb_flush_method=O_DIRECT四、數據庫緩存1、重要性數據庫通常是企業應用系統最核心的部分數據庫保存的數據量通常非常龐大數據庫查詢操作通常很頻繁,有時還很複雜以上原因造成數據庫查詢會引起非常頻繁的磁盤I/O讀取操作,迫使CPU掛起等待,數據庫性能極度低下2、緩存策略a、QueryCache以SQL作為key值緩存查詢結果集一旦查詢涉及的表記錄被修改,緩存就會被自動刪除設置合適的QueryCache會極大提高數據庫性能QueryCache並非越大越好,過大的QqueryCache會浪費內存。MySQL:query_cache_size=128Mb、DataBufferdatabuffer是數據庫數據在內存中的容器databuffer的命中率直接決定了數據庫的性能databuffer越大越好,多多益善MySQL的InnoDBbuffer:innodb_buffer_pool_size=2GMySQL建議bufferpool開大到服務器物理內存60-80%五、應用程序緩存1、對象緩存由O/RMapping框架例如Hibernate提供,透明性訪問,細顆粒度緩存數據庫查詢結果,無需業務代碼顯式編程,是最省事的緩存策略當軟件結構按照O/RMapping框架的要求進行針對性設計,使用對象緩存將會極大降低Web系統對於數據庫的訪問請求良好的設計數據庫結構和利用對象緩存,能夠提供極高的性能,對象緩存適合OLTP(聯機事務處理)應用2、查詢緩存對數據庫查詢結果集進行緩存,類似數據庫的QueryCache適用於一些耗時,但是時效性要求比較低的場景。查詢緩存和對象緩存適用的場景不一樣,是互為補充的當查詢結果集涉及的表記錄被修改以後,需要注意清理緩存3、頁面緩存a、作用針對頁面的緩存技術不但可以減輕數據庫服務器壓力,還可以減輕應用服務器壓力好的頁面緩存可以極大提高頁面渲染速度頁面緩存的難點在於如何清理過期的緩存b、分類I、動態頁面靜態化利用模板技術將訪問過一次的動態頁面生成靜態html,同時修改頁面鏈接,下一次請求直接訪問靜態鏈接頁面動態頁面靜態化技術的廣泛應用於互聯網CMS/新聞類Web應用,但也有BBS應用使用該技術,例如Discuz!無法進行權限驗證,無法顯示個性化信息可以使用AJAX請求彌補動態頁面靜態化的某些缺點II、Servlet緩存針對URL訪問返回的頁面結果進行緩存,適用於粗粒度的頁面緩存,例如新聞發佈可以進行權限的檢查OScache提供了簡單的Servlet緩存(通過web.xml中的配置)也可以自己編程實現Servlet緩存III、頁面內部緩存針對動態頁面的局部片斷內容進行緩存,適用於一些個性化但不經常更新的頁面(例如博客)OSCache提供了簡單的頁面緩存可以自行擴展JSPTag實現頁面局部緩存六、web服務器端緩存基於代理服務器模式的Web服務器端緩存,如squid/nginxWeb服務器緩存技術被用來實現CDN(內容分髮網絡contentdeliverynetwork)被國內主流門戶網站大量採用不需要編程,但僅限於新聞發佈類網站,頁面實時性要求不高七、基於ajax的瀏覽器緩存使用AJAX調用的時候,將數據庫在瀏覽器端緩存只要不離開當前頁面,不刷新當前頁面,就可以直接讀取緩存數據只適用於使用AJAX技術的頁面
java 目前市面上比較火的框架有哪些?
Java 始終排在第一位,這使它成為有史以來最著名的軟件編程語言之一。及時的更新和新版本發佈使它成為一種充滿活力的、有競爭力的編程語言。
2020年最常用的java框架
十大常用框架:
一、SpringMVC
二、Spring
三、Mybatis
四、Dubbo
五、Maven
六、RabbitMQ
七、Log4j
八、Ehcache
九、Redis
十、Shiro
一、SpringMVC
Spring Web MVC是一種基於Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將web層進行職責解耦,基於請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發,Spring Web MVC也是要簡化我們日常Web開發的。
模型(Model )封裝了應用程序的數據和一般他們會組成的POJO。
視圖(View)是負責呈現模型數據和一般它生成的HTML輸出,客戶端的瀏覽器能夠解釋。
控制器(Controller )負責處理用戶的請求,並建立適當的模型,並把它傳遞給視圖渲染。
Spring的web模型 – 視圖 – 控制器(MVC)框架是圍繞着處理所有的HTTP請求和響應的DispatcherServlet的設計。
Spring Web MVC處理請求的流程
請點擊輸入圖片描述
具體執行步驟如下:
1、 首先用戶發送請求————前端控制器,前端控制器根據請求信息(如URL)來決定選擇哪一個頁面控制器進行處理並把請求委託給它,即以前的控制器的控制邏輯部分;圖2-1中的1、2步驟;
2、 頁面控制器接收到請求後,進行功能處理,首先需要收集和綁定請求參數到一個對象,這個對象在Spring Web MVC中叫命令對象,並進行驗證,然後將命令對象委託給業務對象進行處理;處理完畢後返回一個ModelAndView(模型數據和邏輯視圖名);圖2-1中的3、4、5步驟;
3、 前端控制器收回控制權,然後根據返回的邏輯視圖名,選擇相應的視圖進行渲染,並把模型數據傳入以便視圖渲染;圖2-1中的步驟6、7;
4、 前端控制器再次收回控制權,將響應返回給用戶,圖2-1中的步驟8;至此整個結束。
二、Spring
2.1、IOC容器:
IOC容器就是具有依賴注入功能的容器,IOC容器負責實例化、定位、配置應用程序中的對象及建立這些對象間的依賴。應用程序無需直接在代碼中new相關的對象,應用程序由IOC容器進行組裝。在Spring中BeanFactory是IOC容器的實際代表者。
2.2、AOP:
簡單地說,就是將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任封裝起來,便於減少系統的重複代碼,降低模塊間的耦合度,並有利於未來的可操作性和可維護性。AOP代表的是一個橫向的關係
AOP用來封裝橫切關注點,具體可以在下面的場景中使用:
Authentication 權限
Caching 緩存
Context passing 內容傳遞
Error handling 錯誤處理
Lazy loading 懶加載
Debugging 調試
logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準
Performance optimization 性能優化
Persistence 持久化
Resource pooling 資源池
Synchronization 同步
Transactions 事務
三、Mybatis
MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
總體流程:
(1)加載配置並初始化
觸發條件:加載配置文件
將SQL的配置信息加載成為一個個MappedStatement對象(包括了傳入參數映射配置、執行的SQL語句、結果映射配置),存儲在內存中。
(2)接收調用請求
觸發條件:調用Mybatis提供的API
傳入參數:為SQL的ID和傳入參數對象
處理過程:將請求傳遞給下層的請求處理層進行處理。
(3)處理操作請求
觸發條件:API接口層傳遞請求過來
傳入參數:為SQL的ID和傳入參數對象
處理過程:
(A)根據SQL的ID查找對應的MappedStatement對象。
(B)根據傳入參數對象解析MappedStatement對象,得到最終要執行的SQL和執行傳入參數。
©獲取數據庫連接,根據得到的最終SQL語句和執行傳入參數到數據庫執行,並得到執行結果。
(D)根據MappedStatement對象中的結果映射配置對得到的執行結果進行轉換處理,並得到最終的處理結果。
(E)釋放連接資源。
(4)返回處理結果將最終的處理結果返回
MyBatis 最強大的特性之一就是它的動態語句功能。如果您以前有使用JDBC或者類似框架的經歷,您就會明白把SQL語句條件連接在一起是多麼的痛苦,要確保不能忘記空格或者不要在columns列後面省略一個逗號等。動態語句能夠完全解決掉這些痛苦。
四、Dubbo
Dubbo是一個分佈式服務框架,致力於提供高性能和透明化的RPC(遠程過程調用協議)遠程服務調用方案,以及SOA服務治理方案。簡單的說,dubbo就是個服務框架,如果沒有分佈式的需求,其實是不需要用的,只有在分佈式的時候,才有dubbo這樣的分佈式服務框架的需求,並且本質上是個服務調用的東東,說白了就是個遠程服務調用的分佈式框架。
1、透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵入。
2、軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點。
3、 服務自動註冊與發現,不再需要寫死服務提供方地址,註冊中心基於接口名查詢服務提供者的IP地址,並且能夠平滑添加或刪除服務提供者。
節點角色說明:
Provider: 暴露服務的服務提供方。
Consumer: 調用遠程服務的服務消費方。
Registry: 服務註冊與發現的註冊中心。
Monitor: 統計服務的調用次調和調用時間的監控中心。
Container: 服務運行容器。
五、Maven
Maven這個個項目管理和構建自動化工具,越來越多的開發人員使用它來管理項目中的jar包。但是對於我們程序員來說,我們最關心的是它的項目構建功能。
六、RabbitMQ
消息隊列一般是在項目中,將一些無需即時返回且耗時的操作提取出來,進行了異步處理,而這種異步處理的方式大大的節省了服務器的請求響應時間,從而提高了系統的吞吐量。
RabbitMQ是用Erlang實現的一個高並發高可靠AMQP消息隊列服務器。
Erlang是一門動態類型的函數式編程語言。對應到Erlang里,每個Actor對應着一個Erlang進程,進程之間通過消息傳遞進行通信。相比共享內存,進程間通過消息傳遞來通信帶來的直接好處就是消除了直接的鎖開銷(不考慮Erlang虛擬機底層實現中的鎖應用)。
AMQP(Advanced Message Queue Protocol)定義了一種消息系統規範。這個規範描述了在一個分佈式的系統中各個子系統如何通過消息交互。
七、Log4j
日誌記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。
八、Ehcache
EhCache 是一個純Java的進程內緩存框架,具有快速、精幹等特點,是Hibernate中默認的CacheProvider。Ehcache是一種廣泛使用的開源Java分佈式緩存。主要面向通用緩存,Java EE和輕量級容器。它具有內存和磁盤存儲,緩存加載器,緩存擴展,緩存異常處理程序,一個gzip緩存servlet過濾器,支持REST和SOAP api等特點。
優點:
1、 快速
2、 簡單
3、 多種緩存策略
4、緩存數據有兩級:內存和磁盤,因此無需擔心容量問題
5、 緩存數據會在虛擬機重啟的過程中寫入磁盤
6、可以通過RMI、可插入API等方式進行分佈式緩存
7、 具有緩存和緩存管理器的偵聽接口
8、支持多緩存管理器實例,以及一個實例的多個緩存區域
9、提供Hibernate的緩存實現
缺點:
1、使用磁盤Cache的時候非常佔用磁盤空間:這是因為DiskCache的算法簡單,該算法簡單也導致Cache的效率非常高。它只是對元素直接追加存儲。因此搜索元素的時候非常的快。如果使用DiskCache的,在很頻繁的應用中,很快磁盤會滿。
2、不能保證數據的安全:當突然kill掉java的時候,可能會產生衝突,EhCache的解決方法是如果文件衝突了,則重建cache。這對於Cache數據需要保存的時候可能不利。當然,Cache只是簡單的加速,而不能保證數據的安全。如果想保證數據的存儲安全,可以使用Bekeley DB Java Edition版本。這是個嵌入式數據庫。可以確保存儲安全和空間的利用率。
九、Redis
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set –有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
Redis數據庫完全在內存中,使用磁盤僅用於持久性。相比許多鍵值數據存儲,Redis擁有一套較為豐富的數據類型。Redis可以將數據複製到任意數量的從服務器。
1.2、Redis優點:
(1)異常快速:Redis的速度非常快,每秒能執行約11萬集合,每秒約81000+條記錄。
(2)支持豐富的數據類型:Redis支持最大多數開發人員已經知道像列表,集合,有序集合,散列數據類型。這使得它非常容易解決各種各樣的問題,因為我們知道哪些問題是可以處理通過它的數據類型更好。
(3)操作都是原子性:所有Redis操作是原子的,這保證了如果兩個客戶端同時訪問的Redis服務器將獲得更新後的值。
(4)多功能實用工具:Redis是一個多實用的工具,可以在多個用例如緩存,消息,隊列使用(Redis原生支持發佈/訂閱),任何短暫的數據,應用程序,如Web應用程序會話,網頁命中計數等。
1.3、Redis缺點:
(1)單線程
(2)耗內存
十、Shiro
Apache Shiro是Java的一個安全框架,旨在簡化身份驗證和授權。Shiro在JavaSE和JavaEE項目中都可以使用。它主要用來處理身份認證,授權,企業會話管理和加密等。Shiro的具體功能點如下:
(1)身份認證/登錄,驗證用戶是不是擁有相應的身份;
(2)授權,即權限驗證,驗證某個已認證的用戶是否擁有某個權限;即判斷用戶是否能做事情,常見的如:驗證某個用戶是否擁有某個角色。或者細粒度的驗證某個用戶對某個資源是否具有某個權限;
(3)會話管理,即用戶登錄後就是一次會話,在沒有退出之前,它的所有信息都在會話中;會話可以是普通JavaSE環境的,也可以是如Web環境的;
(4)加密,保護數據的安全性,如密碼加密存儲到數據庫,而不是明文存儲;
(5)Web支持,可以非常容易的集成到Web環境;
Caching:緩存,比如用戶登錄後,其用戶信息、擁有的角色/權限不必每次去查,這樣可以提高效率;
(6)shiro支持多線程應用的並發驗證,即如在一個線程中開啟另一個線程,能把權限自動傳播過去;
(7)提供測試支持;
(8)允許一個用戶假裝為另一個用戶(如果他們允許)的身份進行訪問;
(9)記住我,這個是非常常見的功能,即一次登錄後,下次再來的話不用登錄了。
文字描述可能並不能讓猿友們完全理解具體功能的意思。下面我們以登錄驗證為例,向猿友們介紹Shiro的使用。至於其他功能點,猿友們用到的時候再去深究其用法也不遲。
十一、設計模式
這個算不上框架,可自行忽略,不過我認為設計模式的思想很有必要了解一下。
思想:
開閉原則:
開閉原則就是說對擴展開放,對修改關閉。在程序需要進行拓展的時候,不能去修改原有的代碼。
針對接口編程,針對接口編程,依賴於抽象而不依賴於具體。
盡量使用合成/聚合的方式,而不是使用繼承。
一個實體應當盡量少的與其他實體之間發生相互作用,使得系統功能模塊相對獨立。
使用多個隔離的接口,比使用單個接口要好。
里氏代換原則:
(1)子類的能力必須大於等於父類,即父類可以使用的方法,子類都可以使用。
(2)返回值也是同樣的道理。假設一個父類方法返回一個List,子類返回一個ArrayList,這當然可以。如果父類方法返回一個ArrayList,子類返回一個List,就說不通了。這裡子類返回值的能力是比父類小的。
(3)還有拋出異常的情況。任何子類方法可以聲明拋出父類方法聲明異常的子類。 而不能聲明拋出父類沒有聲明的異常。
java 分佈式緩存框架有哪些
Ehcache
Ehcache 是一個Java實現的開源分佈式緩存框架,EhCache 可以有效地減輕數據庫的負載,可以讓數據保存在不同服務器的內存中,在需要數據的時候可以快速存取。同時EhCache 擴展非常簡單,官方提供的Cache配置方式有好幾種。你可以通過聲明配置、在xml中配置、在程序里配置或者調用構造方法時傳入不同的參數。
特點:
存取速度非常快,性能很不錯。
可以應用多種緩存策略。
分級緩存,用戶可以指定哪些數據在硬盤中緩存,哪些數據在內存中緩存。
可以通過RMI、可插入API等方式進行分佈式緩存。
具有緩存和緩存管理器的偵聽接口。
支持多緩存管理器實例,以及一個實例的多個緩存區域。
默認提供Hibernate的緩存實現
Spring本地緩存的使用方法
我們現在在用的Spring Cache,可以直接看Spring Boot提供的緩存枚舉類,有如下這些:
EhCache:一個純Java的進程內緩存框架,所以也是基於本地緩存的。(注意EhCache2.x和EhCache3.x相互不兼容)。
Redis:分佈式緩存,只有Client-Server(C\S)模式,Java一般使用Jedis/Luttuce來操縱。
Hazelcast:基於內存的數據網格。雖然它基於內存,但是分佈式應用程序可以使用Hazelcast進行分佈式緩存、同步、集群、處理、發佈/訂閱消息等。
Guava:它是Google Guava工具包中的一個非常方便易用的本地化緩存實現,基於LRU(最近最少使用)算法實現,支持多種緩存過期策略。在Spring5.X以後的版本已經將他標記為過期了。
Caffeine:是使用Java8對Guava緩存的重寫版本,在Spring5中將取代了Guava,支持多種緩存過期策略。
SIMPLE:使用ConcurrentMapCacheManager,因為不支持緩存過期時間,所以做本地緩存基本不考慮該方式。
關於分佈式緩存,我們需要後面會專門討論Redis的用法,這裡只看本地緩存。性能從高到低,依次是Caffeine,Guava,ConcurrentMapCacheManager,其中Caffeine在讀寫上都快了Guava近一倍。
這裡我們只討論在Spring Boot裏面怎麼整合使用Caffeine和EhCache。
主要有以下幾個步驟:
1)加依賴包:
2)配置緩存:
這裡有兩種方法,通過文件配置或者在配置類裏面配置,先看一下文件配置,我們可以寫一個properties文件,內容像這樣:
然後還要在主類中加上@EnableCaching註解:
另外一種更靈活的方法是在配置類中配置:
應用類:
測試類:
導入依賴包,分為2.x版本和3.x版本。
其中2.x版本做如下導入:
3.x版本做如下導入:
導包完成後,我們使用JCacheManagerFactoryBean + ehcache.xml的方式配置:
參考資料:
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/301398.html