1. 程式人生 > >ABP中使用Redis Cache(2)

ABP中使用Redis Cache(2)

     上一篇講解了如何在ABP中使用Redis Cache,雖然能夠正常的訪問Redis,但是Redis裡的資訊無法同步更新。本文將講解如何實現Redis Cache與實體同步更新。要實現資料的同步更新,我們能夠想到的最基本、最簡單、也是複雜的方法:在每一個增、刪、改的方法裡新增同步快取的程式碼,說它最簡單,是因為技術實現非常簡單,就是在每一個方法裡多加一句程式碼;說它複雜,是因為這樣的寫的話,會出現很多重複的程式碼,並且容易出現遺漏,維護起來很不方便。那麼有沒有一種更簡單的方式呢,在資料出現變化後,觸發一個事件,主動通知訂閱者執行相關操作呢?答案是肯定的,我們可以通過註冊領域事件來實現,在ABP中,實體增加、刪除、修改後會觸發相關事件,只要註冊就可以了。要註冊事件,有兩種方式可以實現,第一是自動註冊,實現IEventHandler就可以了,ABP會自動註冊;第二是通過IEventBus的Register方法手動註冊。ABP中推薦使用自動註冊的方式實現,本文也會採用第一種方式實現。下面我們就來看具體的實現方式,首先增加一個處理快取同步的介面ICacheSyncService,程式碼如下(本文的程式碼是在上一篇的基礎之上編寫的):

作者:loyldg 出處:http://www.cnblogs.com/loyldg/ 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線。如有問題,可以郵件:[email protected] 聯絡我,非常感謝。

ICacheSyncService.cs

 public interface ICacheSyncService
    {
        void Add<TEntity>(TEntity entity) where TEntity : class, IEntity<int>;
        
void Remove<TEntity>(int id) where TEntity : class, IEntity<int>; void Update<TEntity>(TEntity entity) where TEntity : class, IEntity<int>; }
View Code

CacheSyncService.cs

public class CacheSyncService : ICacheSyncService, ISingletonDependency
    {
        
public ICacheService CacheService { get; set; } public void Add<TEntity>(TEntity entity) where TEntity : class, IEntity<int> { CacheService.Set(entity.Id, entity); } public void Remove<TEntity>(int id) where TEntity : class, IEntity<int> { CacheService.Remove<int, TEntity>(id); } public void Update<TEntity>(TEntity entity) where TEntity : class, IEntity<int> { CacheService.Set(entity.Id, entity); } }

第二增加一個處理實體事件的泛型基類EntityChangedHandlerBase<TEntity>,程式碼如下:

public abstract class EntityChangedHandlerBase<TEntity>:
        ISingletonDependency,
        IEventHandler<EntityCreatedEventData<TEntity>>,
        IEventHandler<EntityDeletedEventData<TEntity>>,
        IEventHandler<EntityUpdatedEventData<TEntity>>
        where TEntity : class, IEntity<int>
    {
        public ICacheSyncService CacheSyncService { get; set; }

        public virtual void HandleEvent(EntityCreatedEventData<TEntity> eventData)
        {
            CacheSyncService.Add(eventData.Entity);
        }

        public virtual void HandleEvent(EntityDeletedEventData<TEntity> eventData)
        {
            CacheSyncService.Remove<TEntity>(eventData.Entity.Id);
        }

        public virtual void HandleEvent(EntityUpdatedEventData<TEntity> eventData)
        {
            CacheSyncService.Update(eventData.Entity);
        }
    }

第三,增加一個需要進行快取同步的實體類,繼承自EntityChangedHandlerBase<TEntity>就可以了,不需要編寫任何程式碼,如果有特殊情況,可以重新HandleEvent方法,程式碼如下:

public class ArticleChangedHandler : EntityChangedHandlerBase<Article>
    {
        
    }
View Code

至此,快取同步的全部程式碼已編寫完成,我們執行來看看效果:

我們新增文章後,什麼操作也不做,直接到Redis裡檢視是否有新增的資料,如果有新增的資料表示快取能夠自動更新了(刪除和修改是一樣的,這裡就不編寫相關程式碼了),直接看單元測試程式碼。

public class CacheSync_Tests : UsingRedisInAbpTestBase
    {
         [Fact]
        public void Test_Entity_Changed_Event()
        {
             LoginAsHostAdmin();
             var title = "unit_test";
             var articleId = 0;
             var service = Resolve<TestCacheSyncService>();
             service.IsCreatedEventFired.ShouldBeFalse();
             service.IsUpdatedEventFired.ShouldBeFalse();
             service.IsDeletedEventFired.ShouldBeFalse();
             
             //新增文章測試
             UsingDbContext(c =>c.Articles.Add(new Article {Title = title}));
             
             service.IsCreatedEventFired.ShouldBe(true);

             //更新文章測試
             UsingDbContext(c =>
             {
                 var article=c.Articles.First();
                 c.Articles.Attach(article);
                 article.Title = "new_title";
             });
             service.IsUpdatedEventFired.ShouldBe(true);

             //刪除文章測試
             UsingDbContext(c =>
             {
                 var article = c.Articles.First();
                 c.Articles.Remove(article);                 
             });
             service.IsDeletedEventFired.ShouldBe(true);
        }
    }

TestSyncCache.cs程式碼:

 public class TestCacheSyncService : ICacheSyncService
    {
        public bool IsCreatedEventFired { get; set; }
        public bool IsDeletedEventFired { get; set; }
        public bool IsUpdatedEventFired { get; set; }
        public void Add<TEntity>(TEntity entity) where TEntity : class, IEntity<int>
        {
            IsCreatedEventFired = true;
            
        }

        public void Remove<TEntity>(int id) where TEntity : class, IEntity<int>
        {
            IsDeletedEventFired = true;

        }

        public void Update<TEntity>(TEntity entity) where TEntity : class, IEntity<int>
        {
            IsUpdatedEventFired = true;
        }
    }  
View Code

通過以上方式已實現了ABP中Redis快取的讀取和設定,也實現了快取的同步更新,如果要在ABP中使用其他快取也是一樣的,只需要把快取實現部分換成其他快取就行。本文的所有原始碼下載地址:

作者:loyldg 出處:http://www.cnblogs.com/loyldg/ 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線。如有問題,可以郵件:[email protected] 聯絡我,非常感謝。

相關推薦

ABP使用Redis Cache(2)

     上一篇講解了如何在ABP中使用Redis Cache,雖然能夠正常的訪問Redis,但是Redis裡的資訊無法同步更新。本文將講解如何實現Redis Cache與實體同步更新。要實現資料的同步更新,我們能夠想到的最基本、最簡單、也是複雜的方法:在每一個增、刪、改的方法裡新增同步快取的程式碼,說它最簡

ABP module-zero +AdminLTE+Bootstrap Table+jQuery許可權管理系統第十五節--快取小結與ABP框架專案 Redis Cache的實現

快取 為什麼要用快取 為什麼要用快取呢,說快取之前先說使用快取的優點。 減少寄宿伺服器的往返呼叫(round-trips)。 如果快取在客戶端或是代理,將減少對伺服器的請求,減少頻寬。 減少對資料庫伺服器的往返呼叫(round-trips)。 當內容快取在web伺服器,能夠減輕對資料庫的請求。 減少網路

shiroCacheManager相關的類結構介紹,提供redis Cache實現

cache lob constrain manage alt session isempty debug arr cacheManager主要用於對shiro中的session、realm中的認證信息、授權信息進行緩存。 1.類結構 2.接口及類介紹 C

redis學習2redis的資料結構結構與物件

第1章 前言 redis這麼強大,那麼它底層是如何實現的呢?使用了哪些資料結構呢?本文就帶大家來剖析剖析 第2章 簡單動態字串(SDS)   redis的字串不是直接用c語言的字串,而是用了一種稱為簡單動態字串(SDS)的抽象型別,並將其作為預設字串。   redis中包含字串值的鍵

SpringbootSpring-cacheredis整合

也是在整合redis的時候偶然間發現spring-cache的。這也是一個不錯的框架,與spring的事務使用類似,只要新增一些註解方法,就可以動態的去操作快取了,減少程式碼的操作。如果這些註解不滿足專案的需求,我們也可以參考spring-cache的實現思想,使用AOP代理+快取操作來管理快取的使

SpringBoot 2.0 | SpringBoot 整合 Redis + Cache + 分散式 Session

簡介 1.Redis redis是一個key-value儲存系統。它支援儲存的value型別相對更多,包括string(字串)、list(連結串列)、set(集合) 和hash(雜湊型別)。這些資料型別都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,

dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(六)SpringRedis的快取的使用

前面已經寫了四篇關於dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合的文章: 快取(Caching)可以儲存經常會用到的資訊,這樣每次需要的時候,這些資訊都可以立即可用的。儘管Spr

Springboot 2.x Redis Cache 自定義key value序列化方式

Redis習慣使用 Json格式來儲存了,spring-data-redis 2.0 開始網上找的方法已經都不適用了,文件裡也沒說清楚,通過分析原始碼最後解決。 這裡簡單介紹一下我的解決方法 1、pom依賴 <dependency> <gr

Redis2、CentOS 7 上安裝 redis3.2.3安裝與配置

sync 倉庫 ace /var/ 發現 wan sudo base str 一、redis源碼安裝 【更正】現在最新穩定的版本已經到了3.2.8 截至到2016.8.11,redis最新穩定版本為3.2.3.本篇文章我們就以此版本為基礎,進行相關的講解。 下載redis源

Redis 3.2.8 安裝與配置

blog 裝包 ase dir edi useradd nging 執行文件 make 在本章中,您將了解和學習Redis的環境安裝設置。 一、RedHat 6.0 自定義安裝 1、創建redis用戶 Redis 默認的安裝路徑是/usr/local/redis,並且

Redis 3.2.8 配置文件

rand 開啟 size log 安裝包 默認 clas 一個 logs 一、Redis 配置文件 之前 Redis 3.2.8 安裝與配置 中說到了,在Redis安裝包中有一個名為redis.conf的文件,該文件就是啟動redis時所需的配置文件。 在配置文件中對每一個

Redis系列--2Redis配置

redis配置詳解1、Redis配置在Redis有配置文件(redis.conf)可在Redis的根目錄下找到。可以通過Redis的CONFIG命令設置所有Redis的配置。2、配置文件說明:1. Redis默認不是以守護進程的方式運行,可以通過該配置項修改,使用yes啟用守護進程 daemonize

redis client 2.0.0 pipeline 的list的rpop bug

edi resp response pub pop clas space finally void 描寫敘述: redis client 2.0.0 pipeline 的list的rpop 存在嚴重bug,rpop list的時候,假設list已經為空的時候,rpop出

老男孩教育每日一題-第84天-兩個文件,把第一個文件的第2、3行內容添加到第二個文件的第3行後面

每日一題兩個文件如下:[[email protected]/* */ ~]# cat 1.txt 111 222 333 [[email protected]/* */ ~]# cat 2.txt AAA bbb ccc ddd要求修改後的文件[[email protect

PHP分布式Redis實現Session

_id num log clas tcp 設置 rep pwd 文件 方法一:找到配置文件php.ini,修改為下面內容,保存並重啟服務 session.save_handler = redis session.save_path = "tcp://127.0.0.

【轉】CentOS 7.0 安裝Redis 3.2.1詳細過程和使用常見問題

nec count ges des useful 內存 warning before outside http://www.linuxidc.com/Linux/2016-09/135071.htm 環境:CentOS 7.0 Redis 3.2.1 Redis的安裝與啟動

<meta>標簽http-equiv屬性pragma cache-control expires三者的關系。

lan pro ont style rfc toc color control header 1 <meta http-equiv="pragma" content="no-cache"> 2 <meta http-equiv="cache-contro

Redis 3.2.4集群實戰

取數據 端口 value mod 測試 負責 log redis 集群 tar 一、Redis Cluster集群設計Redis集群搭建的方式有多種,例如使用zookeeper等,但從redis3.0之後版本支持Redis-Cluster集群,Redis-Cluster采用

梁勇(Danniel Liang) java教材例題:java程序購買額按稅率求營業稅 java數值保留2位小數的方法

can margin package ann pack ati sea static rate package com.swift; import java.util.Scanner; public class PurchaseTaxDecimalsTwo { public

redis系列01:源碼安裝redis-3.2.10

創建 好的 color netstat mon compress 手動 idf sta 前段時間安裝好的redis,今天用腳本安裝的時候突然出現版本異常的問題,所以更新一篇為大家提供參考 本次安裝在CentOS6.5,采用的redis-3.2.10,最新的redis-4.0