Skip to content

.Net cache solution implemented for memcached using EnyimMemcached, for redis using StackExchange.Redis

License

Notifications You must be signed in to change notification settings

lboobl/Chuye.Caching

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Chuye.Caching

.Net cache solution implemented with memcached using EnyimMemcached, redis using StackExchange.Redis

Architecture

Alt Architecture

Usage

ICacheProvider

ICacheProvider cacheProvider
	//= new MemoryCacheProvider();
	//= MemcachedCacheProvider.Default;      //using memcached, load from configuration
	= new RedisCacheProvider("ubuntu-16");   //using redis, load from configuration

var exist = cacheProvider.TryGet<Object>(key, out val);
Assert.IsFalse(exist);
Assert.AreEqual(val, null);

cacheProvider.Overwrite(key, val);
exist = cacheProvider.TryGet<Object>(key, out val);
Assert.IsNull(val);

More detail in MemcachedCacheProviderTest or RedisCacheProviderTest

Dependency injection

// prepare
{
	var builder = new ContainerBuilder();
	//use memcached from config
	builder.RegisterInstance(MemcachedCacheProvider.Default)
		.As<IRegionCacheProvider>();

	//use redis with connectionString
	builder.RegisterInstance(new RedisCacheProvider("ubuntu-16"))
		.As<IRegionCacheProvider>();
}

Region swith

{
    private readonly IRegionCacheProvider _userCache;
    private readonly IRegionCacheProvider _loginCache;

    public SomeController(IRegionCacheProvider cacheProvider) {
        _userCache = cacheProvider.Switch("user");
        _loginCache = cacheProvider.Switch("login");
    }
}

DistributedLock

    IDistributedLock cache 
        = MemcachedCacheProvider.Default; 
        //= new RedisCacheProvider("ubuntu-16");   //You could using redis directly though
    
	var key = "DistributedLock";
    var list = new List<int>();
    var except = new Random().Next(1000, 2000);
    var stopwatch = Stopwatch.StartNew();

    Parallel.For(0, except, i => {
        using (cache.ReleasableLock(key)) {
            list.Add(i);
        }
    });

    stopwatch.Stop();
    Console.WriteLine("Handle {0} times cost {1}, {2:f2} per sec.",
        except, stopwatch.Elapsed.TotalSeconds, except / stopwatch.Elapsed.TotalSeconds);

    Assert.AreEqual(list.Count, except);

Release log

2.5 合并与简化接口

  • 移除基于 HttpContext 的缓存实现;
  • 重构设计配置生效行为;

2.4 添加基于配置的扩展能力

  • 加入分布式缓存对所有或特定 Region 实施只读策略的能力;
  • 缓存路径即 region+key 的拼接方式可以通过配置修改, 以方便分区与迁移;
  • 可以通过配置中的默认过期时间限制未显示提供生命周期的缓存时长;
  • 可以通过切换 region 生成新的实例以满足依赖注入的需求

About

.Net cache solution implemented for memcached using EnyimMemcached, for redis using StackExchange.Redis

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C# 95.1%
  • PowerShell 3.9%
  • Batchfile 1.0%