ABP中使用Redis Cache(2)
上一篇讲解了如何在ABP中使用Redis Cache,虽然能够正常的访问Redis,但是Redis里的信息无法同步更新。本文将讲解如何实现Redis Cache与实体同步更新。要实现数据的同步更新,我们能够想到的最基本、最简单、也是复杂的方法:在每一个增、删、改的方法里添加同步缓存的代码,说它最简单,是因为技术实现非常简单,就是在每一个方法里多加一句代码;说它复杂,是因为这样的写的话,会出现很多重复的代码,并且容易出现遗漏,维护起来很不方便。那么有没有一种更简单的方式呢,在数据出现变化后,触发一个事件,主动通知订阅者执行相关操作呢?答案是肯定的,我们可以通过注册领域事件来实现,在ABP中,实体增加、删除、修改后会触发相关事件,只要注册就可以了。要注册事件,有两种方式可以实现,第一是自动注册,实现IEventHandler就可以了,ABP会自动注册;第二是通过IEventBus的Register方法手动注册。ABP中推荐使用自动注册的方式实现,本文也会采用第一种方式实现。下面我们就来看具体的实现方式,首先增加一个处理缓存同步的接口ICacheSyncService,代码如下(本文的代码是在上一篇的基础之上编写的):
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>;
}
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>
{ }
至此,缓存同步的全部代码已编写完成,我们运行来看看效果:


我们添加文章后,什么操作也不做,直接到Redis里查看是否有新增的数据,如果有新增的数据表示缓存能够自动更新了(删除和修改是一样的,这里就不编写相关代码了),直接看单元测试代码。
public class CacheSync_Tests : UsingRedisInAbpTestBase
{
[Fact]
public void Test_Entity_Changed_Event()
{
LoginAsHostAdmin();
var title = "unit_test";
var articleId = ;
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;
}
}
通过以上方式已实现了ABP中Redis缓存的读取和设置,也实现了缓存的同步更新,如果要在ABP中使用其他缓存也是一样的,只需要把缓存实现部分换成其他缓存就行。本文的所有源代码下载地址:
http://files.cnblogs.com/files/loyldg/UsingRedisInAbp_2.src.rar
ABP中使用Redis Cache(2)的更多相关文章
- ABP中使用Redis Cache(1)
本文将讲解如何在ABP中使用Redis Cache以及使用过程中遇到的各种问题.下面就直接讲解使用步骤,Redis环境的搭建请直接网上搜索. 使用步骤: 一.ABP环境搭建 到http://www.a ...
- Azure Redis Cache
将于 2014 年 9 月 1 日停止Azure Shared Cache服务,因此你需要在该日期前迁移到 Azure Redis Cache.Azure Redis Cache包含以下两个层级的产品 ...
- Spring Boot 揭秘与实战(二) 数据缓存篇 - Redis Cache
文章目录 1. Redis Cache 集成 2. 源代码 本文,讲解 Spring Boot 如何集成 Redis Cache,实现缓存. 在阅读「Spring Boot 揭秘与实战(二) 数据缓存 ...
- ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十五节--缓存小结与ABP框架项目中 Redis Cache的实现
返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 缓存 为什么要用缓存 为什么要用缓存呢,说缓存之前先说使用缓存的优点. 减少寄宿服务器的往返调用(round-tr ...
- 缓存与ABP Redis Cache
缓存与ABP Redis Cache 为什么要用缓存 为什么要用缓存呢,说缓存之前先说使用缓存的优点. 减少寄宿服务器的往返调用(round-trips). 如果缓存在客户端或是代理,将减少对服务器的 ...
- 使用abp的 redis cache
top 使用abp的 redis cache -1. 在微软维护的github项目的release里找到redis的windows版本 64位 大约5M,安装,安装,然后在安装目录找到redis.wi ...
- .NET中使用Redis (二)
很久以前写了一篇文章 .NET中使用Redis 介绍了如何安装Redis服务端,以及如何在.NET中调用Redis读取数据.本文简单介绍如何设计NoSQL数据库,以及如何使用Redis来存储对象. 和 ...
- 如何在ASP.NET Core中使用Redis
注:本文提到的代码示例下载地址> https://code.msdn.microsoft.com/How-to-use-Redis-in-ASPNET-0d826418 Redis是一个开源的内 ...
- Azure Redis Cache (1) 入门
<Windows Azure Platform 系列文章目录> Microsoft Azure Redis Cache基于流行的开源Redis Cache. 1.功能 Redis 是一种高 ...
随机推荐
- Ubuntu上安装Robomongo及添加到启动器
到目前为止,Robomongo仍是MongoDB最好的客户端管理工具,如需在Ubuntu上安装Robomongo,可直接从官网下载.tar.gz压缩包进行解压,然后直接运行bin目录下的robomon ...
- SSH实战 · JAVA发送邮件相关
发送激活邮件 电子邮箱:邮件服务器上的一块空间: 邮件服务器:类比于web服务器(tomcat),有相应的服务器软件: 邮件协议:大公司发送和接收服务器分开,也可以都用一个服务器. ...
- linux java 版本
之前linux已经安装了1.6的版本, 我想要升级,于是安装了1.7, /etc/profile 的最后几行是这么写的: JAVA_HOME=/usr/java/jdk1.7.0_79JRE_HOME ...
- Spring学习记录(五)---bean的作用域scope
作用域:singleton:单例,整个应用中只创建一个实例(默认) prototype:原型,每次注入时都新建一个实例 session:会话,每个会话创建一个实例 request:请求,每个请求创建一 ...
- UIViewController 生命周期
创建: 1. alloc 创建对象,分配空间 2.init (initWithNibName) 初始化对象,初始化数据 3.loadView 从nib载入视图 ,通常这一步不需要去干涉.除非你没有使用 ...
- 轻量级前端MVVM框架avalon - 执行流程1
基本上确定了avalon的几个重要元素的关系: M,即model,一个普通的JS对象,可能是后台传过来的,也可能是直接从VM中拿到,即VM.$json.有关的这个$json的名字还在商讨 V,即Vie ...
- 12款非常精致的免费 HTML5 & CSS3 网站模板
01. Joefrey Mahusay 很炫的单页网站模板,基于 HTML5 & CSS3 制作,适合用于设计师个人简历.摄影师和平面设计师的个人作品展示. 演示 下载 02. Folder ...
- 深入理解DOM节点类型第七篇——文档节点DOCUMENT
× 目录 [1]特征 [2]快捷访问 [3]文档写入 前面的话 文档节点document,隶属于表示浏览器的window对象,它表示网页页面,又被称为根节点.本文将详细介绍文档节点document的内 ...
- 一起学微软Power BI系列-官方文档-入门指南(3)Power BI建模
我们前2篇文章:一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍 和一起学微软Power BI系列-官方文档-入门指南(2)获取源数据 中,我们介绍了官方入门文档与获取 ...
- Android图片缓存之Glide进阶
前言: 前面学习了Glide的简单使用(Android图片缓存之初识Glide),今天来学习一下Glide稍微复杂一点的使用. 图片缓存相关博客地址: Android图片缓存之Bitmap详解 And ...