补充ICache
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace System
{ /// <summary>
/// 一个接口,表示缓存
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
public interface ICache<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>>
{
/// <summary>
/// 获取当前缓存的数量
/// </summary>
int Count { get; } IEnumerable<TKey> Keys { get; } /// <summary>
/// 是否包含键
/// </summary>
bool ContainsKey(TKey key); /// <summary>
/// 查询缓存
/// </summary>
/// <param name="key"></param>
/// <param name="factory"></param>
/// <returns></returns>
TValue Get(TKey key, Func<TValue> factory); ///// <summary>
///// 查询缓存
///// </summary>
///// <param name="key"></param>
///// <returns></returns>
//TValue Get(TKey key); /// <summary>
/// 查询缓存
/// </summary>
/// <param name="key"></param>
/// <param name="factory"></param>
/// <returns></returns>
Task<TValue> GetAsync(TKey key, Func<Task<TValue>> factory); ///// <summary>
///// 查询缓存
///// </summary>
///// <param name="key"></param>
///// <returns></returns>
//Task<TValue> GetAsync(TKey key); /// <summary>
/// 获取数据,没有返回默认值
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
TValue this[TKey key] { get; set; } /// <summary>
/// 清空缓存
/// </summary>
void Flush(); /// <summary>
/// 更新缓存
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
bool Update(TKey key, TValue value); /// <summary>
/// 添加缓存
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
bool Add(TKey key, TValue value); /// <summary>
/// 添加或更新缓存
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
void AddOrUpdate(TKey key, TValue value); /// <summary>
/// 移除缓存
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
bool Remove(TKey key); }
}
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using System.Linq; namespace System
{ internal class Cache<TKey, TValue> : ICache<TKey, TValue>
{
Dictionary<TKey, TValue> _map = new Dictionary<TKey, TValue>();
ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); SemaphoreSlim _asyncLock; SemaphoreSlim AsyncLock
{
get
{
if (_asyncLock == null)
{
_asyncLock = new SemaphoreSlim(, );
}
return _asyncLock;
}
} public int Count
{
get
{
return _map.Count;
}
} public IEnumerable<TKey> Keys
{
get
{
return _map.Keys;
}
} #region Get
public TValue Get(TKey key, Func<TValue> factory)
{
// Check cache
_lock.EnterReadLock();
TValue val;
try
{
if (_map.TryGetValue(key, out val))
return val;
}
finally
{
_lock.ExitReadLock();
} // Cache it
_lock.EnterWriteLock();
try
{
// Check again
if (_map.TryGetValue(key, out val))
return val; // Create it
val = factory(); // Store it
_map.Add(key, val); // Done
return val;
}
finally
{
_lock.ExitWriteLock();
}
} //public TValue Get(TKey key)
//{
// // Check cache
// _lock.EnterReadLock();
// TValue val;
// try
// {
// _map.TryGetValue(key, out val);
// return val;
// }
// finally
// {
// _lock.ExitReadLock();
// }
//} public async Task<TValue> GetAsync(TKey key, Func<Task<TValue>> factory)
{
// Check cache
//_lock.EnterReadLock();
await AsyncLock.WaitAsync(-);
TValue val;
try
{
if (_map.TryGetValue(key, out val))
return val;
}
finally
{
AsyncLock.Release();
//_lock.ExitReadLock();
} // Cache it
//_lock.EnterWriteLock();
await AsyncLock.WaitAsync(-);
try
{
// Check again
if (_map.TryGetValue(key, out val))
return val; // Create it
val = await factory(); // Store it
_map.Add(key, val); // Done
return val;
}
finally
{
//_lock.ExitWriteLock();
AsyncLock.Release();
}
} //public async Task<TValue> GetAsync(TKey key)
//{
// // Check cache
// //_lock.EnterReadLock();
// await AsyncLock.WaitAsync(-1);
// TValue val;
// try
// {
// _map.TryGetValue(key, out val);
// return val;
// }
// finally
// {
// AsyncLock.Release();
// //_lock.ExitReadLock();
// } //} #endregion /// <summary>
/// 获取数据,没有返回默认值
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public TValue this[TKey key]
{
get
{
_lock.EnterReadLock();
TValue val;
try
{
if (_map.TryGetValue(key, out val))
return val;
}
finally
{
_lock.ExitReadLock();
}
return default(TValue);
}
set
{
AddOrUpdate(key, value);
}
} public bool Update(TKey key, TValue value)
{
_lock.EnterReadLock();
TValue val;
try
{
if (!_map.TryGetValue(key, out val))
return false;
//val = value;
_map[key] = value;
return true;
}
finally
{
_lock.ExitReadLock();
}
} public bool Add(TKey key, TValue value)
{
_lock.EnterReadLock();
TValue val;
try
{
if (_map.TryGetValue(key, out val))
return false;
_map.Add(key, value);
return true;
}
finally
{
_lock.ExitReadLock();
}
} public void AddOrUpdate(TKey key, TValue value)
{
_lock.EnterReadLock();
TValue val;
try
{
if (_map.TryGetValue(key, out val))
// val = value;
_map[key] = value;
else
_map.Add(key, value);
}
finally
{
_lock.ExitReadLock();
} } public bool Remove(TKey key)
{
_lock.EnterReadLock();
try
{
return _map.Remove(key);
}
finally
{
_lock.ExitReadLock();
}
} public void Flush()
{
// Cache it
_lock.EnterWriteLock();
try
{
_map.Clear();
}
finally
{
_lock.ExitWriteLock();
} } public bool ContainsKey(TKey key)
{
_lock.EnterReadLock();
TValue val;
try
{
if (_map.TryGetValue(key, out val))
return true;
return false;
}
finally
{
_lock.ExitReadLock();
}
} public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{
return _map.GetEnumerator();
} IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable)_map).GetEnumerator();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace System
{
/// <summary>
/// 缓存工厂
/// </summary>
public static class CacheFactory
{ internal static readonly List<Action> _actions; internal static readonly Timer _timer; static CacheFactory()
{
_expireTime = ;
_actions = new List<Action>();
_timer = new Timer(o =>
{
var actions = o as IEnumerable<Action>; object lockObj = new object(); lock (lockObj)
{
foreach (var item in actions)
{
try
{
item();
}
catch
{
}
}
}
}, _actions, Timeout.Infinite, Timeout.Infinite); int time = * * _expireTime;
_timer.Change(time, time);
} static int _expireTime;
/// <summary>
/// 获取或设置过期时间
/// </summary>
public static int ExpireTime
{
get { return _expireTime; }
set
{
_expireTime = value;
int time = * * _expireTime;
_timer.Change(time, time);
}
} /// <summary>
/// 创建一个缓存
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
/// <returns></returns>
public static ICache<TKey, TValue> CreateCache<TKey, TValue>()
{
return new Cache<TKey, TValue>();
//return ActivatorFactory.CreateInstance<ICache<TKey, TValue>>();
} /// <summary>
/// 创建一个过期缓存
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
/// <returns></returns>
public static IExpireCache<TKey, TValue> CreateExpireCache<TKey, TValue>()
{
return new ExpireCache<TKey, TValue>();
//return ActivatorFactory.CreateInstance<IExpireCache<TKey, TValue>>();
} /// <summary>
/// 创建一个过期缓存
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
/// <returns></returns>
public static IExpireCache<TValue> CreateExpireCache<TValue>()
{
return new ExpireCache<TValue>();
//return ActivatorFactory.CreateInstance<IExpireCache<TValue>>();
} }
}
补充ICache的更多相关文章
- MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示(补充)
在2.1.栏目的前台显示中因右键没有添加视图把微软给鄙视了一下,后来有仔细研究了一下发现应该鄙视自己,其实这个功能是有的,是自己没搞清楚乱吐糟. 其实只要在NuGet中安装两个包(Microsoft. ...
- RabbitMq应用一的补充(RabbitMQ的应用场景)
直接进入正题. 一.异步处理 场景:发送手机验证码,邮件 传统古老处理方式如下图 这个流程,全部在主线程完成,注册->入库->发送邮件->发送短信,由于都在主线程,所以要等待每一步完 ...
- Android Retrofit 2.0 使用-补充篇
推荐阅读,猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava 4.RxBus 5.Android MVP+Retrofit+RxJava实践小 ...
- Android中使用ViewFlipper实现屏幕页面切换(关于坐标轴的问题已补充更改)
屏幕切换指的是在同一个Activity内屏幕间的切换,ViewFlipper继承了Framelayout类,ViewAnimator类的作用是为FrameLayout里面的View切换提供动画效果.如 ...
- 关于《Linux.NET学习手记(8)》的补充说明
早前的一两天<Linux.NET学习手记(8)>发布了,这一篇主要是讲述OWIN框架与OwinHost之间如何根据OWIN协议进行通信构成一套完整的系统.文中我们还直接学习如何直接操作OW ...
- Hexo的coney主题的一些补充说明
title: Hexo的coney主题的一些补充说明 date: 2014-12-14 14:10:44 categories: Hexo tags: [hexo,技巧] --- Coney是一个非常 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(47)-工作流设计-补充
系列目录 补充一下,有人要表单的代码,这个用代码生成器生成表Flow_Form表的Index代码就可以 加上几个按钮就可以了 <div class="mvctool"> ...
- 21-Python-Django进阶补充篇
1. 路由部分补充 1.1 默认值 url: url(r'^index/', views.index, {'name': 'root'}), views: def index(request,name ...
- 像画笔一样慢慢画出Path的三种方法(补充第四种)
今天大家在群里大家非常热闹的讨论像画笔一样慢慢画出Path的这种效果该如何实现. 北京-LGL 博客号@ligl007发起了这个话题.然后各路高手踊跃发表意见.最后雷叔 上海-雷蒙 博客号@雷蒙之星 ...
随机推荐
- [leetcode 27]Implement strStr()
1 题目: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if ...
- Xamarin跨平台移动开发解决方案
Xamarin始创于2011年,旨在使移动开发变得难以置信地迅捷和简单.Xamarin的产品简化了针对多种平台的应用开发,包括iOS.Android.Windows Phone和Mac App.Xam ...
- Javascript图表插件HighCharts用法案例
最近还在忙着基于ABP的项目,但本篇博客和ABP无关,喜欢ABP框架的朋友请点击传送门. 这不,最近项目基本功能做的差不多了,现在在做一个数据统计的功能,需要绘制区域图(或折线图)和饼图.一开始,楼主 ...
- 移动端web开发进阶
三个月前曾写过一篇跨终端响应式页面设计入门的博客,上了博客园头条也得到了不少关注,今天想在这篇博客的基础上,继续写一篇进阶的文章. 补充 基于“入门”一文,我想再补充几个基础知识点,主要都是针对iOS ...
- UWP?UWP! - Build 2015有些啥?(1)
UWP?UWP! - Build 2015有些啥? Build 2015圆满落幕了,不知大家有多少人刷夜看了直播呢?不管怎么说,想必各位都很好奇在这场微软开发者盛宴上,Microsoft又发布了什么令 ...
- C#最良心脚本语言C#Light/Evil,Xamarin\WP8\Unity热更新最良心方案,再次进化.
C#Light的定位是嵌入式脚本语言,一段C#Light脚本是一个函数 C#Evil定位为书写项目的脚本语言,多脚本文件合作,可以完全用脚本承载项目. C#Light/Evil 使用完全C#一致性语法 ...
- 手把手教你用python打造网易公开课视频下载软件3-对抓取的数据进行处理
上篇讲到抓取的数据保存到rawhtml变量中,然后通过编码最终保存到html变量当中,那么html变量还会有什么问题吗?当然会有了,例如可能html变量中的保存的抓取的页面源代码可能有些标签没有关闭标 ...
- Lucene系列-搜索
Lucene搜索的时候就要构造查询语句,本篇就介绍下各种Query.IndexSearcher是搜索主类,提供的常用查询接口有: TopDocs search(Query query, int n); ...
- iOS 常见设计模式
(一)代理模式/委托模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和 ...
- 什么是P3O?
P3O(Portfolio, Programme and Project Offices)项目组合.项目群和项目办公室资格认证. 是由英国商务部 OGC 于2008年10月28日发布的最新的最佳实践指 ...