缓存者,临时文件交换区也。主要就是方便查找,提高查找效率(效率在于读内存速度比读硬盘快)。

  

  大多数的项目的缓存都是通过设定过期时间来做的,可是我对于这样的替换策略不以为然,而且会导致混乱。

  有人说:最让人蛋疼的莫过于命名和缓存了。

  那么缓存蛋疼在哪里呢,那就是容易导致脏数据,缓存不应该成为脏数据,而大多数时间脏数据不可避免。

  

  举一个例子:淘宝商城,我店里有一个商品,当时缓存的库存100,但是赶上光棍节大酬宾,各种并发请求,也许你在买的时候缓存里面还有20,但是100个订单已经下过了,但是点击下单的时候蛋疼的事情来了(当然我觉得淘宝没有这样子的问题啦),你居然下单成功了。我操,我作为店主很郁闷啊,我他娘的到哪里多进口20架米格战斗机啊。

  

  上面的例子,你对缓存应该也有了一种深恶痛绝的感受吧。你这时候笑了,笑我写的程序差,笑我淘宝店的代码是垃圾,没错,这样的脏数据是能够避免的,可是有多少程序员能够注意到这一点呢,我觉得很少。

  

  直入主题上代码,这里先上一部分后面慢慢讲深入,慢慢改进,毕竟真的是在边写文章边写例子。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace CJCMS.Framework.Cache
{
public class CacheTarget
{
/// <summary>
/// 缓存对象
/// </summary>
public object Target { get; set; } /// <summary>
/// 缓存对象最后使用时间
/// </summary>
public DateTime LastRefresh { get; set; }
}
}

  

  1 /******************************************************************
2 * 作者: 不要理我 CJ
3 * 邮件: 869722304@qq.com(仅仅支持商业合作洽谈)
4 * 创建时间: 2012-8-14 19:43:41
5 * 最后修改时间: 2012-8-14 19:43:41
6 *
7 * 未经修改的文件版权属于原作者所有,但是你可以阅读,修改,调试。本项目不建议商用,不能确保稳定性。
8 * 同时由于项目bug引起的一切问题,原作者概不负责。
9 *
10 * 本项目所引用的所有类库,仍然遵循其原本的协议,不得侵害其版权。
11 *
12 * 您一旦下载就视为您已经阅读此声明。
13 *
14 * 您不可以移除项目中的任何声明。
15 *******************************************************************/
16
17 using System;
18 using System.Collections.Generic;
19 using System.Linq;
20 using System.Text;
21
22 namespace CJCMS.Framework.Cache
23 {
24 public class CacheTargetManger //: ICacheTargetManger
25 {
26 private static Dictionary<string, CacheTarget> _entries = new Dictionary<string, CacheTarget>();
27
28 /// <summary>
29 /// 检测是否缓存空间达到极限,需要使用策略替换
30 /// </summary>
31 /// <returns></returns>
32 public static void CheckIsExpired()
33 {
34
35 AppDomain.MonitoringIsEnabled = true;
36
37 AppDomain currAppDomain = System.Threading.Thread.GetDomain();
38 while (true)
39 {
40 GC.Collect();
41 if (currAppDomain.MonitoringSurvivedMemorySize > 50 * 1000 * 1000)
42 {
43 //最近最少使用策略实现
44 DoStrategy();
45 }
46 else
47 {
48 break;
49 }
50 }
51 }
52 /// <summary>
53 /// 使用了最近最少使用策略
54 /// </summary>
55 public static void DoStrategy()
56 {
57 try
58 {
59 Remove(_entries.OrderBy(a => a.Value.LastRefresh).First().Key);
60 }
61 catch
62 {
63
64 }
65 }
66 /// <summary>
67 /// 添加新的内容
68 /// </summary>
69 /// <param name="key"></param>
70 /// <param name="cache"></param>
71 public static void Add(string key, object cache)
72 {
73 CacheTarget c = new CacheTarget();
74 c.Target = cache;
75 c.LastRefresh = DateTime.Now;
76 CheckIsExpired();
77 lock (_entries)
78 {
79 _entries.Add(key, c);
80 }
81
82 }
83
84 public static void Update(string key, object cache)
85 {
86 CacheTarget c = new CacheTarget();
87 c.Target = cache;
88 c.LastRefresh = DateTime.Now;
89
90 lock (_entries)
91 {
92 _entries.Remove(key);
93 _entries.Add(key, c);
94 }
95
96 }
97
98 public static void Save(string key, object cache)
99 {
100 if (_entries.ContainsKey(key))
101 {
102 Update(key, cache);
103 }
104 else
105 {
106 Add(key, cache);
107 }
108 }
109
110 public static void Remove(string key)
111 {
112 lock (_entries)
113 {
114 _entries.Remove(key);
115 }
116 }
117
118 public static void FuzzyRemove(string fuzzykey)
119 {
120 foreach (KeyValuePair<string, CacheTarget> k in _entries.Where(a => a.Key.Contains(fuzzykey)).ToList())
121 {
122 Remove(k.Key);
123 }
124 }
125
126 public static void Get(string key, out object result)
127 {
128 try
129 {
130 CacheTarget c = new CacheTarget();
131 _entries.TryGetValue(key, out c);
132 result = c.Target;
133 Update(key, result);
134 }
135 catch
136 {
137 result = null;
138 }
139 }
140 }
141 }

大家先看起来代码,具体还没有讲完,我后面再讲。

泰州人在上海做it qq群179233261

CJCMS系列---说说项目中的缓存实现(1)的更多相关文章

  1. 谈谈MVC项目中的缓存功能设计的相关问题

    本文收集一些关于项目中为什么需要使用缓存功能,以及怎么使用等,在实际开发中对缓存的设计的考虑 为什么需要讨论缓存呢? 缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例如数据 ...

  2. java项目中ehcache缓存最简单用法

      java项目中ehcache缓存最简单用法: 1.下载ehcache-core-2.4.3.jar复制到项目的lib目录下 2.新建ehcache.xml文件,放置在项目src目录下的resour ...

  3. ES6系列之项目中常用的新特性

    ES6系列之项目中常用的新特性 ES6常用特性 平时项目开发中灵活运用ES6+语法可以让开发者减少很多开发时间,提高工作效率.ES6版本提供了很多新的特性,接下来我列举项目中常用的ES6+的特性: l ...

  4. 菜鸟-手把手教你把Acegi应用到实际项目中(7)-缓存用户信息

    首先讲讲EhCache.在默认情况下,即在用户未提供自身配置文件ehcache.xml或ehcache-failsafe.xml时,EhCache会依据其自身Jar存档包含的ehcache-fails ...

  5. C#中Fun简单介绍及运用到项目中与缓存(本地缓存,Redis)结合使用

     1.简单介绍Fun C#中Fun和Action有点类似,都是一个委托方法,不同的是Func是有返回值的,而Action没有. (T)此委托封装的方法的参数类型. 备注:详情了解Fun到(https: ...

  6. Django 项目中设置缓存

    一.配置文件settings.py中 # 设置django缓存存放位置为redis数据库,并设置一个默认(default)选项,在redis中(配置文件/etc/redis/redis.conf)开启 ...

  7. 关于vagrant环境下项目中图片缓存的问题

    之前用的是iis所以可能没有这些问题,后来换了nginx之后发现图片缓存问题很严重,本项目用的是thinkphp5框架:浏览器.runtime.session.cookie.加参数,后台,所有缓存都清 ...

  8. WebApi系列~实际项目中如何使用HttpClient向web api发异步Get和Post请求并且参数于具体实体类型

    回到目录 本讲比较实际,在WEB端有一个Index和Create方法,用来从web api显示实体列表数据和向api插入实体对象,这就是以往的网站,只不过是把数据持久化过程放到了web pai上面,它 ...

  9. vue项目中使用bpmn-流程图预览篇

    前情提要 上文已经实现了节点操作的前进.后退.导入.导出等操作,今日来实现“流程图预览”,以及视图的放大缩小 前提:项目安装过bpmn,安装可见上篇文章 实现要点 bpmn提供了两个神器:Modele ...

随机推荐

  1. 由一个多线程共享Integer类变量问题引起的。。。

    最近看到一个多线程面试题,有三个线程分别打印A.B.C,请用多线程编程实现,在屏幕上循环打印10次ABCABC- 看到这个题目,首先想到的是解决方法是定义一个Integer类对象,初始化为0,由3个线 ...

  2. ubuntu-Linux系统读取USB摄像头数据(uvc)

    这几天在做小车的过程中,需要用到图像采集.我想现在用的摄像头是UVC免驱的.根据国嵌的教程中有一个gspca摄像头的程序.我发现把gspca的采集程序用到uvc上时,在显示图像的时候提示没有huffm ...

  3. 负margin的移位参考线

    同早年~ 问题描述 在xx项目中,羊城通卡号的输入框处使用了xx库中的实现方式,即将提示文字标签<label>通过负margin移位到<input>框的下面.静态时展现良好,j ...

  4. 一步一步学FRDM-KE02Z(一):IAR调试平台搭建以及OpenSDA两种工作模式设置

    摘要:FRDM-KE02Z是飞思卡尔公司较为新的微控制器,学习和开发资料较少.从本篇开始会陆续介绍其相关的开发流程,并完成一个小型的工程项目.这是本系列博客的第一篇,主要介绍开发环境IAR for A ...

  5. 高品质开源工具Chloe.ORM:支持存储过程与Oracle

    扯淡 这是一款高质量的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq.借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询.聚合查询.插入数据.批量删 ...

  6. Mongodb的安装使用

    1.下载 最好不要去.com的那个网站下载:    各个版本的下载地址: http://dl.mongodb.org/dl/win32/x86_64 2.压缩包版本: 下载压缩包版本,目录结构如图: ...

  7. php伪静态--隐藏地址实际路径方法

    1.修改Apache配置文件:httpd.conf #LoadMoule rewrite_module modules/mod_rewrite.so --去掉注释 2.查找httpd.conf 中的 ...

  8. .NET、C#和ASP.NET,ASP.NET MVC 四者之间的区别

    经常,会有一些人搞不清楚.NET和c#和ASP.NET这三者之间的关系,她们都是什么呢?他们之间有什么关系呢?总结一下 首先:什么是.NET? .NET是微软公司下的一个开发平台,.NET核心就是.N ...

  9. 用 ElementTree 在 Python 中解析 XML

    用 ElementTree 在 Python 中解析 XML 原文: http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python- ...

  10. 从PHP底层源码去深入理解数组,并用C模拟PHP关联数组(原创)

    PHP是一门入门容易,使用范围广泛的语言,以其灵活性以及web后端开发被很多人熟知,也被很多人戏称“PHP是世界上最好的语言”.本人是一名“忠实”的PHPer,相信用过PHP的程序员都会体会到PHP数 ...