项目开发中,用到了缓存,其中的一个列表项,可能要多线程处理,就有了下面的想法,具体的问题在代码中有详细说明,见下文。

         static void Main(string[] args) {

             测试缓存的想法();

             Console.WriteLine("测试结束!");
Console.ReadKey();
} /// <summary>
/// 静态的缓存,测试缓存是否存放的指针
/// </summary>
private static MemoryCache memoryCache = MemoryCache.Default; private static void 测试缓存的想法() { Console.WriteLine("创建一个测试的整型列表:"); List<int> ints = new List<int>(); Console.WriteLine("列表中放入{1,2,3} 3个数字"); ints.Add();
ints.Add();
ints.Add(); //缓存的策略,10分钟,测试够用了
var policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(); Console.WriteLine("将整型列表放入缓存,缓存10分钟:");
memoryCache.Set("key", ints, policy); //不取出更改原有的列表,去除第2个数字
Console.WriteLine("更新原有列表的数据,去除第2个数字,缓存不做处理:");
ints.Remove(); Console.WriteLine("从缓存中取出对应的缓存列表,打印缓存列表项"); var result = (List<int>)memoryCache.Get("key"); result.ForEach(r => { Console.WriteLine(r); }); Console.WriteLine("-----------------第一阶段测试完成------------------------");
Console.WriteLine(""); Console.WriteLine("直接处理缓存列表项,去除第1个数字,并且没有再次保存至缓存的动作:");
result.Remove(); Console.WriteLine("打印缓存中的列表项:");
//下面这句有没有,打印的结果是一样的
result = (List<int>)memoryCache.Get("key");
result.ForEach(r => { Console.WriteLine(r); }); Console.WriteLine("");
Console.WriteLine("打印原列表项:"); ints.ForEach(r => { Console.WriteLine(r); }); Console.WriteLine("-----------------第二阶段测试完成------------------------"); Console.WriteLine("直接操作原有的列表项,添加一个数字4:");
ints.Add(); Console.WriteLine("不重新取缓存项,打印缓存中的列表项:");
//下面这句有没有,打印的结果是一样的
result.ForEach(r => { Console.WriteLine(r); }); Console.WriteLine("");
Console.WriteLine("打印原列表项:"); ints.ForEach(r => { Console.WriteLine(r); }); Console.WriteLine("-----------------第三阶段测试完成------------------------"); /*
* 结论:
*
* 缓存内部存放的对象的指针,不管是原对象的直接修改,或对缓存项的修改
* 只要缓存的指针没有发生变化,对此对象的修改会同步传导到缓存及原对象的指针
*/
}

其实这个测试并没有什么新意,在.Net中关于对象在内存中的存放位置相关的文章中有明确的说明:

对象放在托管堆上,对象本身有个指针指向这个托管堆,(虽然这个指针可能会随着GC的运行发生动态调整,但是我们仍然可以当做指针来理解)

上面测试中的缓存项与原有的列表项,其实指向的是同一块内存,对其中的任何修改,会同时传导到两个对象。理解不了需要看一下.Net的底层的相关知识

结合C语言的指针理解起来其实更容易一些。

我想要多线程处理这个缓存列表安全,此时可以换用 ConcurrentBag ,没见过这个对象的同学可以参考MSDN,这是一个多线程操作安全的无序集合。

此时便可以多线程得到这个缓存项(ConcurrentBag)的 对象,做相应的操作即可,问题解决。

语言表达能力有限,欢迎批评指正,有砖轻轻拍。

C#缓存的一点想法及测试的更多相关文章

  1. Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法

    原文:Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法 很多朋友做安装包的时候,所打包的软件需要.NET Framework之类的环境,他 ...

  2. 【MM系列】SAP S/4 HANA BP创建客户/供应商的一点想法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP S/4 HANA BP创建客 ...

  3. 后端程序员之路 30、webapi测试工具的一点想法

    有了webapi,对应的,也就要有各种语言的sdk,有时候,还要有一个好用的api测试工具.sdk和api测试工具在功能上有一些异同,有时候测试工具会直接基于sdk来制作. 它们通常包含: 1.htt ...

  4. 大三CS狗一点想法

    本文非技术文 十点半游戏的代码大概完成了1/3,想到今晚提早验收完汇编实验,还是副院长亲自验的,似乎很看好我的样子,然后问我的方向,导师和参加的项目.聊了几句后结束了对话,不禁又引发了我的一些思考. ...

  5. 系统架构:Web应用架构的新趋势---前端和后端分离的一点想法

    最近研究servlet,看书时候书里讲到了c/s架构到b/s架构的演变,讲servlet的书都很老了,现在的b/s架构已经不是几年前的b/s架构,其实b/s架构就是web应用开发,对于这样的架构我们现 ...

  6. Flask 页面缓存逻辑,jinja2 过滤器,测试器

    回调接入点-页面缓存逻辑 from flask import Flask,request,render_template from werkzeug.contrib.cache import Simp ...

  7. Docker 监控的一点想法

    目前项目内部署了docker,于是涉及到关于监控的事情,参考一些经典实例以及一些自己的想法,总结一下思路. 1.关于监控的内容 监控宿主机本身 监控宿主机本身还是比较简单的,同其他服务器监控类似,对c ...

  8. docker监控的一点想法

    目前项目内部署了docker,于是涉及到关于监控的事情,参考一些经典实例以及一些自己的想法,总结一下思路. 1.关于监控的内容 监控宿主机本身 监控宿主机本身还是比较简单的,同其他服务器监控类似,对c ...

  9. 2017qcon大会的一点想法(安全人才如何不被淘汰?)

    2017 qcon 上海专门设立了“直击黑产,业务安全的攻与防”专题,通过这次专题的了解和学习,让我对黑产的攻防有了更深入认识. 1. 安全防护趋势 2017 qcon 上海专门设立了“直击黑产,业务 ...

随机推荐

  1. 每天一个小算法(Shell Sort3)

    希尔算法自己编了一个,循环很多,很不美观,不过运行正确: c语言实现: #include <stdio.h> #include <stdlib.h> #define LEN 2 ...

  2. python 捕获 shell 脚本的输出结果

    import subprocessoutput =Popen(["mycmd","myarg"], stdout=PIPE).communicate()[0] ...

  3. ural1221. Malevich Strikes Back!

    http://acm.timus.ru/problem.aspx?space=1&num=1221 算是枚举的 题目意思是必须划出这样的 11011 10001 00000 10001 110 ...

  4. R语言将List转为矩阵do.call

    ehparse.matrix <- do.call(rbind, easyham.parse)

  5. Mybatis传递多个参数

    方法一: //DAO层的函数方法Public User selectUser(String name,String area); 对应的Mapper.xml <select id="s ...

  6. CodeForces Round #297 Div.2 E (中途相遇法)

    当时打比赛的时候卡在D题了,没有看E.现在看来E还是不难的. 将n个数排序后,其实不排序也是可以的,只是排序能快一半的时间. 枚举前一半能得到多少种和,放到map里面: 然后在后一半数中枚举,然后在m ...

  7. Npoi Web 项目中(XSSFWorkbook) 导出出现无法访问已关闭的流的解决方法

    原本在CS项目中用的好好的在BS项目中既然提示我导出出现无法访问已关闭的流的解决方法 比较郁闷经过研究 终于解决了先将方法发出来 让遇到此问题的筒子们以作参考 //新建类 重写Npoi流方法 publ ...

  8. gcc与g++

    gcc和g++都是GNU(组织)的一个编译器. 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为 ...

  9. java程序员修炼之道

    今天在论坛里看到了一位工作10年的java大牛总结的java程序员修炼之道,看完后给出的评价是:字字玑珠,深入人心,猛回头,自己一无是处··· 大牛告诉我们应该好好学习与修炼以下知识与技能 Java语 ...

  10. Sublime 的中文乱码问题

    Sublime Text 是现在最受欢迎的文本编辑器,没有之一.它非常简洁,而且对各种代码的高亮显示很美观.但是,它默认不支持 GBK.Shift-JIS 等中文.日本编码格式,故打开此类文件会出现乱 ...