利用订阅模式实现缓存更新

1. 引言

很多Web项目,都需要和数据库打交道,典型的就是CRUD(读,写,更新,删除)操作。无论是哪种数据库,Asp.Net MVC 作为后端框架的项目,都有很多操作数据库的类库。最近在一个Web项目中就用到了EntityFramework来存取Sql Server。相信很多人都懂得,如何利用EntityFramework存取数据,所以这方面不做详细的介绍。 今天给大家介绍一种如何利用订阅模式来实现缓存更新。

实现过程主要参照NopCommerce,它是一个开源的电商平台,里面有不少精妙的设计,值得每一个.Net程序员一看。

2. 实现

先来看看未采用Cache的设计,定义一个Service,这个Service主要是利用EntityFramework存取数据。

Service接口和默认实现

这个实现能够满足基本的需求,但是缺乏优化使得每次当Service调用GetAll 函数的时候,都会从数据库读取所有该类条目。如果没有Update,Create或者Delete每次GetAll返回的数据都是一样的。

因此可以在GetAll这里添加缓存,在Update,Create,Delete更新缓存。

首先我们利用.Net自带的System.Runtime.Caching.ObjectCache 类 定义缓存接口以及简单实现:

到此为止,已经可以实现缓存跟新了,只要在Insert,Update,Delete 函数里面添加 缓存更新即可。我们进一步利用订阅模式。

订阅模式 一般有三个对象,一个是Subject代表发送给所有订阅者的主题信息。一个是Consumer代表订阅者接受订阅的Subject, 另一个是Publisher代表发送Subject的实现。

这里我们定义几个Subject

定义Consumer接口和Cache相关的Consumer实现

定义publish接口和实现

最终的Service多了ICache 和 IEventPublish 两个对象:

最后通过Unity实现依赖注入

3. 总结

这是订阅模式的一种运用,在NopCommerce里面有很多设计模式都运用的非常巧妙,对于EntityFramework的优化远不止这些,以后再给大家分享。

Original: https://www.cnblogs.com/VectorZhang/p/5605901.html
Author: 禅宗花园…迷失的佛
Title: 利用订阅模式实现缓存更新

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/572564/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java8-Stream流

    Java8-Stream基础操作 JAVA技术交流群:737698533 在学习Stream之前必须有Lambda,的基础 Stream是Java8的新特性,可以进行对集合进行一些…

    Java 2023年6月6日
    086
  • MyBatis 多条件查询、动态SQL、多表操作、注解开发,应有尽有,一网打尽!

    来源:iyu77.blog.csdn.net/article/details/125761737 MyBatis封装了JDBC通过Mapper代理的方式,以前繁琐的操作通过&#82…

    Java 2023年6月15日
    085
  • Disruptor生产和消费模式详解及高级应用(并行模式)

    小伙伴们大家好,昨天的文章,带着大家扒开了Disruptor华丽的外衣,最重要的是我们知道了Disruptor高性能的原因几个重要的原因, 引入环形的数组结构:数组元素不会被回收,…

    Java 2023年6月15日
    056
  • Markdowm基础语法的使用(typora)

    Mackdown学习 一级标题:一个#加空格 回车 二级标题:两个#加空格 回车 以此类推… 一级标题(Ctrl+1) 二级标题(Ctrl+2) 三级标题(Ctrl+3…

    Java 2023年6月16日
    095
  • 好书推荐之《JAVA编程思想》

    名人推荐 真是一本透着编程思想的书。上面的书让你从微观角度了解 Java,而这本书则可以让你从一个宏观角度了解 Java。这本书和 Java 核心技术的厚度差不多,但这本书的信息密…

    Java 2023年6月15日
    076
  • 【原创】K8S环境下研发如何本地调试?kt-connect使用详解

    K8S环境下研发如何本地调试?kt-connect使用详解 背景 注:背景有点啰嗦,讲讲一路走来研发本地调试的变化,嫌烦的可以直接跳过,不影响阅读。 2019年 我在的公司当时是个…

    Java 2023年6月13日
    090
  • 设置颜色与画笔

    设置画笔 默认情况下,Graphics绘图类 使用的画笔属性是粗细为I个像素的正方形,而Graphics2D类可以调用 setStroke()方法 设置画笔的属性,如改变线条的粗细…

    Java 2023年6月9日
    089
  • @Async注解的坑,小心

    大家好,我是三友。 背景 前段时间,一个同事小姐姐跟我说她的项目起不来了,让我帮忙看一下,本着助人为乐的精神,这个忙肯定要去帮。 于是,我在她的控制台发现了如下的异常信息: jav…

    Java 2023年6月16日
    076
  • Leetcode栈&队列

    Leetcode栈&队列 题干: 思路: 栈是 FILO,队列是 FIFO,所以如果要用栈实现队列,目的就是要栈实现一个 FIFO的特性。 具体实现方法可以理解为,准备两个…

    Java 2023年6月7日
    084
  • Java实现求质数(素数)

    题目要求: 输出0-100以内的所&#x…

    Java 2023年6月9日
    078
  • springcloud2.0以上版本_eureka控制台显示_找不到${spring.cloud.client.ipAddress}_没有显示成IP地址

    一般会是 eureka.instance.prefer-ip-address=trueeureka.instance.instance-id={$spring.cloud.clie…

    Java 2023年5月30日
    062
  • SpringBoot扩展接口- Bean实例化前后扩展点

    常用的扩展接口: 1、ApplicationContextAware:获取应用上下文 2、BeanPostProcessor 接口在对象实例化后, 初始化方法调用前后做前置处理和后…

    Java 2023年5月30日
    086
  • 队列小哥哥喊你来排队了~(自带循环的那种)

    大家好,我是melo,一名大二上软件工程在读生,经历了一年的摸滚,现在已经在工作室里边准备开发后台项目啦。不过这篇文章呢,还是想跟大家聊一聊数据结构与算法,学校也是大二上才开设了数…

    Java 2023年6月5日
    0102
  • 三、《微服务:从设计到部署》–进程间通信IPC

    交互方式: 在单体应用中,组件可通过语言级方法或者函数相互调用。相比之下,基于微服务的应用是一个运行在多台机器上的分布式系统。通常,每个服务实例都是一个进程。因此,服务必须使用进程…

    Java 2023年6月5日
    090
  • 人生苦短,我用JRebel

    昨天看到团子推送的一篇关于热部署的文章,其中介绍了自研的Sonic插件在公司内部的应用。同时晒出来一张对比图: 团子表示我们的插件要比同类插件优秀哦。不过我定睛一看,好家伙,第一列…

    Java 2023年6月5日
    073
  • Oracle的常用命令和表空间

    新手上手还原备份库基本命令 删除用户和表空间 ## 删除用户 drop user userName cascade; ## 如果用户无法删除,并报错: ## ERROR at li…

    Java 2023年6月7日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球