一个C#开发的非常实用的缓存中间件

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: *这是一个用C#开发的.Net开源的缓存中间件,他支持各种缓存并提供了很多高级功能。它的主要目标是让开发人员开发更简单、特别是一些复杂的缓存场景。

今天给大家推荐一个C#开发的非常实用的缓存中间件,支持各种缓存。

在我们实际开发中,缓存是经常用到的。特别是一些需要重复执行且消耗资源的操作时,我们都会把结果存储在缓存中,下次需要用到直接从缓存读取。在.Net支持缓存方式,也是非常多,还有其他中间件比如Redis、Memcache,每一种缓存使用方法、接口都不一样,如果我们需要改变缓存策略的时候,就需要修改代码。

今天给大家推荐这个中间件,就可以很好的满足我们的需求。

项目简介

这是一个用C#开发的.Net开源的缓存中间件,他支持各种缓存并提供了很多高级功能。它的主要目标是让开发人员开发更简单、特别是一些复杂的缓存场景。

项目支持多层缓存、分布式缓存、通过简单几行代码配置,就可以实现很多功能。提供了统一的缓存接口,方便项目改变缓存策略时,不需要大量的修改代码。而且项目还提供了很多功能,例如缓存同步、并发更新、序列化、事件、性能计数器。

技术架构

1、跨平台:这是基于.Net Core开发的系统,可以部署在Docker, Windows, Linux。

2、基于Net4.5开发。

3、支持缓存类别:MemoryCache、Redis 、Memcached 、Couchbase、System.Web.Caching。

项目结构

图片

使用方法

配置

<cacheManager xmlns="http://cachemanager.michaco.net/schemas/CacheManagerCfg.xsd">
<managers>
<cache name="cacheName" updateMode="Up" enableStatistics="false" enablePerformanceCounters="false">
<handle name="handleName" ref="systemRuntimeHandle" expirationMode="Absolute" timeout="50s"/>
</cache>
</managers>
<cacheHandles>
<handleDef  id="systemRuntimeHandle" type="CacheManager.SystemRuntimeCaching.MemoryCacheHandle`1, CacheManager.SystemRuntimeCaching"
defaultExpirationMode="Sliding" defaultTimeout="5m"/>
</cacheHandles>
</cacheManager>

声明

var cache = CacheFactory.Build<string>(s => s.WithDictionaryHandle());

添加或者更新缓存

var cache = CacheFactory.Build<string>(s => s.WithDictionaryHandle());

            Console.WriteLine("Testing update...");

if (!cache.TryUpdate("test", v => "item has not yet been added", out string newValue))
            {
                Console.WriteLine("Value not added?: {0}", newValue == null);
            }

            cache.Add("test", "start");
            Console.WriteLine("Initial value: {0}", cache["test"]);

            cache.AddOrUpdate("test", "adding again?", v => "updating and not adding");
            Console.WriteLine("After AddOrUpdate: {0}", cache["test"]);

            cache.Remove("test");
try
            {
var removeValue = cache.Update("test", v => "updated?");
            }
catch
            {
                Console.WriteLine("Error as expected because item didn't exist.");
            }

// use try update to not deal with exceptions
if (!cache.TryUpdate("test", v => v, out string removedValue))
            {
                Console.WriteLine("Value after remove is null?: {0}", removedValue == null);
            }

缓存事件监听

private static void EventsExample()
        {
var cache = CacheFactory.Build<string>(s => s.WithDictionaryHandle());
            cache.OnAdd += (sender, args) => Console.WriteLine("Added " + args.Key);
            cache.OnGet += (sender, args) => Console.WriteLine("Got " + args.Key);
            cache.OnRemove += (sender, args) => Console.WriteLine("Removed " + args.Key);

            cache.Add("key", "value");
var val = cache.Get("key");
            cache.Remove("key");
        }

计数器

private static void UpdateCounterTest()
        {
var cache = CacheFactory.Build<long>(s => s.WithDictionaryHandle());

            Console.WriteLine("Testing update counter...");

            cache.AddOrUpdate("counter", 0, v => v + 1);

            Console.WriteLine("Initial value: {0}", cache.Get("counter"));

for (var i = 0; i < 12345; i++)
            {
                cache.Update("counter", v => v + 1);
            }

            Console.WriteLine("Final value: {0}", cache.Get("counter"));
        }

Redis缓存

private static void RedisSample()
        {
var cache = CacheFactory.Build<int>(settings =>
            {
                settings
                    .WithSystemRuntimeCacheHandle()
                    .And
                    .WithRedisConfiguration("redis", config =>
                    {
                        config.WithAllowAdmin()
                            .WithDatabase(0)
                            .WithEndpoint("localhost", 6379);
                    })
                    .WithMaxRetries(1000)
                    .WithRetryTimeout(100)
                    .WithRedisBackplane("redis")
                    .WithRedisCacheHandle("redis", true);
            });

            cache.Add("test", 123456);

            cache.Update("test", p => p + 1);

var result = cache.Get("test");
        }

从Json读取配置

var builder = new Microsoft.Extensions.Configuration.ConfigurationBuilder()
    .AddJsonFile("cache.json");

this.Configuration = builder.Build();
项目地址: https://github.com/MichaCo/CacheManager

- End -

专注分享编程知识、热门有用有趣的开源项目

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
缓存 人工智能 算法
【实测】gpt做底层:在开发过程中应对gpt的结果先做mock缓存再继续调试开发
【实测】gpt做底层:在开发过程中应对gpt的结果先做mock缓存再继续调试开发
|
2月前
|
缓存 中间件 Python
Python Web 开发: 解释 Django 中的中间件是什么,以及如何使用?
Python Web 开发: 解释 Django 中的中间件是什么,以及如何使用?
|
2月前
|
缓存 NoSQL Java
SSM之spring注解式缓存redis->redis整合,redis的注解式开发及应用场景,redis的击穿穿透雪崩
SSM之spring注解式缓存redis->redis整合,redis的注解式开发及应用场景,redis的击穿穿透雪崩
40 0
|
3月前
|
缓存 监控 NoSQL
一个.Net Core开源缓存中间件,让你更加简单、方便使用缓存
一个.Net Core开源缓存中间件,让你更加简单、方便使用缓存
116 0
|
3月前
|
缓存 NoSQL 数据可视化
c#如何将数据缓存至Redis
.netcore c# 如何将数据库查询的数据缓存至Redis
32 0
|
4月前
|
中间件
如何开发一个 SAP UI5 Tools 的自定义中间件扩展 - Custom Middleware Extension
如何开发一个 SAP UI5 Tools 的自定义中间件扩展 - Custom Middleware Extension
61 1
|
5月前
|
缓存 测试技术 BI
SAP Gateway 在开发系统和生产系统上的缓存控制
SAP Gateway 在开发系统和生产系统上的缓存控制
37 1
|
5月前
|
缓存 NoSQL Java
Spring Cache简化缓存开发
Spring Cache简化缓存开发
111 0
|
8月前
|
JavaScript NoSQL 中间件
【Node.js实战】一文带你开发博客项目之初识Express(安装Express,处理路由,中间件机制)
【Node.js实战】一文带你开发博客项目之初识Express(安装Express,处理路由,中间件机制)
|
9月前
|
存储 缓存 监控
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache抽象详解的核心原理探索
缓存的工作机制是先从缓存中读取数据,如果没有再从慢速设备上读取实际数据,并将数据存入缓存中。通常情况下,我们会将那些经常读取且不经常修改的数据或昂贵(CPU/IO)的且对于相同请求有相同计算结果的数据存储到缓存中。
133 1

相关产品

  • 云消息队列 MQ
  • 微服务引擎
  • 云消息队列 Kafka 版