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

  

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

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

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

  

  举一个例子:淘宝商城,我店里有一个商品,当时缓存的库存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 * 作者:                    不要理我 CJ3 * 邮件:               869722304@qq.com(仅仅支持商业合作洽谈)4 * 创建时间:                2012-8-14 19:43:415 * 最后修改时间:            2012-8-14 19:43:416 * 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.Cache23 {24     public class CacheTargetManger //: ICacheTargetManger25     {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                 else47                 {48                     break;49                 }50             }51         }52         /// <summary>53         /// 使用了最近最少使用策略54         /// </summary>55         public static void DoStrategy()56         {57             try58             {59                 Remove(_entries.OrderBy(a => a.Value.LastRefresh).First().Key);60             }61             catch62             {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

转载于:https://www.cnblogs.com/ntcj/p/4100899.html

CJCMS系列---说说项目中的缓存实现(1)相关推荐

  1. 项目中CI缓存适配器的使用

    2019独角兽企业重金招聘Python工程师标准>>> 项目中CI缓存适配器的使用     项目中有若干控制器,这些控制器有一些公共数据,因此,在基控制器类中获取这些数据,为了提高系 ...

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

    今天这一篇文章我来谈一谈在MVC 3项目中的缓存功能,以及针对缓存的一些设计上的考量,给大家参考参考 前言 为什么需要讨论缓存?缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源 ...

  3. 缓存详解-在java项目中使用缓存

    目录 一.概述 二.java常用的缓存 三.使用缓存将会面临的一些问题 穿透 雪崩 击穿 总结 三.缓存淘汰策略 缓存淘汰 在Spring项目中优雅的实现缓存 二级缓存推荐的实现 一.概述 在java ...

  4. 为什么要在项目中使用缓存呢?

    用缓存主要是两个用途,高性能和高并发 高性能 假如有1000个请求要去查询同一条数据,如果1000个请求直接去数据库中查找,而且这个查找sql比较耗时,那么这1000个请求每个都会很慢. 如果在查询系 ...

  5. php中怎么让图片没有缓存,关于项目中图片缓存的问题

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

  6. java项目遇到的问题_java系列:项目中遇到的一些问题(持续更新中)

    JSONArray去重的问题 JSONArray array = ["2","0","0","0","0&qu ...

  7. android项目中自定义顶部标题栏,Android项目中自定义顶部标题栏

    Android项目中自定义顶部标题栏 下面给大家详细介绍android中自定义顶部标题栏的思路及实现方式 先来图: 思路及实现步骤 1.定义标题栏布局 2.自定义TitleActivity控制标题栏按 ...

  8. 分桶策略清理SpringCache中的缓存

    背景介绍 我们使用SpringCache框架 + Redis来实现项目中的缓存实现,它能实现自动对数据缓存,也可以自动清理过期的缓存.大多数情况下,它都运行非常好. 这是因为我们需要缓存的数据,通常都 ...

  9. 【Android 教程系列第 24 篇】在 Android Studio 中清理缓存的两种方式

    这是[Android 教程系列第 24 篇],如果觉得有用的话,欢迎关注专栏. 一:问题描述 昨天的安卓项目还好好的,今天早上打开的时候说我引入 R 文件还有其它的类出现了错误,然后点击任意一个类几乎 ...

最新文章

  1. 基于深度学习OpenCV与python进行字符识别
  2. 手撕一个spirng IoC的过程
  3. leetcode396. Rotate Function
  4. 201.09.22 除虫药水(线性dp)
  5. python3高性能网络编程_Python3 网络编程
  6. python建立pip.ini
  7. 解决安装rrdtool遇到的一个问题
  8. function与感叹号!
  9. 带你认识MindSpore量子机器学习库MindQuantum
  10. 2018/12/26
  11. 微信小程序转发,发送朋友圈(uni-app)
  12. 3.5正交试验设计法
  13. Bugku杂项——旋转跳跃
  14. wma转mp3怎么弄_几种值得推荐的WMA转换MP3方法
  15. 网站不收录怎么解决问题?三个SEO技巧秒收实例
  16. uv纹理坐标设定与贴图规则
  17. 如何将xlsx表格文件转换成txt文件?
  18. 三步解决Chrome80后提示限制第三方cookie问题
  19. 学计算机用多大的u盘合适,装w764位系统需要多大u盘呢?
  20. 联想服务器怎么用u盘安装系统安装win7系统教程,联想一体机如何安装win7_联想一体机怎么使用u盘重装win7...

热门文章

  1. pg_hint_plan
  2. IAR快速修改工程名称
  3. 如何检查Linux系统上运行的Debian版本
  4. 小米11android auto,小米MIUI 11这几个隐藏功能,每个都很发烧,知道的才是真米粉...
  5. Java之程序流程控制
  6. calibre中的hcell_Calibre LVS -hier与-flat的区别
  7. JavaScript必备知识点之XMLHttpRequest请求
  8. 2.3 组织过程资产
  9. c语言程序整数划分源代码,整数划分 | C/C++程序员之家
  10. C语言函数形参添加默认值