C#缓存的一点想法及测试
项目开发中,用到了缓存,其中的一个列表项,可能要多线程处理,就有了下面的想法,具体的问题在代码中有详细说明,见下文。
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#缓存的一点想法及测试的更多相关文章
- Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法
原文:Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法 很多朋友做安装包的时候,所打包的软件需要.NET Framework之类的环境,他 ...
- 【MM系列】SAP S/4 HANA BP创建客户/供应商的一点想法
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP S/4 HANA BP创建客 ...
- 后端程序员之路 30、webapi测试工具的一点想法
有了webapi,对应的,也就要有各种语言的sdk,有时候,还要有一个好用的api测试工具.sdk和api测试工具在功能上有一些异同,有时候测试工具会直接基于sdk来制作. 它们通常包含: 1.htt ...
- 大三CS狗一点想法
本文非技术文 十点半游戏的代码大概完成了1/3,想到今晚提早验收完汇编实验,还是副院长亲自验的,似乎很看好我的样子,然后问我的方向,导师和参加的项目.聊了几句后结束了对话,不禁又引发了我的一些思考. ...
- 系统架构:Web应用架构的新趋势---前端和后端分离的一点想法
最近研究servlet,看书时候书里讲到了c/s架构到b/s架构的演变,讲servlet的书都很老了,现在的b/s架构已经不是几年前的b/s架构,其实b/s架构就是web应用开发,对于这样的架构我们现 ...
- Flask 页面缓存逻辑,jinja2 过滤器,测试器
回调接入点-页面缓存逻辑 from flask import Flask,request,render_template from werkzeug.contrib.cache import Simp ...
- Docker 监控的一点想法
目前项目内部署了docker,于是涉及到关于监控的事情,参考一些经典实例以及一些自己的想法,总结一下思路. 1.关于监控的内容 监控宿主机本身 监控宿主机本身还是比较简单的,同其他服务器监控类似,对c ...
- docker监控的一点想法
目前项目内部署了docker,于是涉及到关于监控的事情,参考一些经典实例以及一些自己的想法,总结一下思路. 1.关于监控的内容 监控宿主机本身 监控宿主机本身还是比较简单的,同其他服务器监控类似,对c ...
- 2017qcon大会的一点想法(安全人才如何不被淘汰?)
2017 qcon 上海专门设立了“直击黑产,业务安全的攻与防”专题,通过这次专题的了解和学习,让我对黑产的攻防有了更深入认识. 1. 安全防护趋势 2017 qcon 上海专门设立了“直击黑产,业务 ...
随机推荐
- angular todo
<!DOCTYPE HTML> <html lang="en-US" ng-app> <head> <meta charset=" ...
- c# 获取数组中最大数的值
求数组中最大的数的值:1.数组的max函数: class Program { static void Main(string[] args) { ,,,,,,,,,}; int max= GetMax ...
- 通过asp.net程序来控制自己开发的windows服务
public ActionResult ListService() { //获取已经保存好的windows服务名称 IList<Model.ReportServicesInfoEnt> L ...
- C# 设计基础(一)
(一) C#项目的组成结构 项目结构 .config ---配置文件(存放配置参数文件) .csproj ---项目文件(管理文件项) .sln ---解决方案文件(管理项目) .cs - ...
- Linux 下sleep()函数
调试程序发现起了一个子线程后,主线程上的sleep不生效了,看到这才明白... — Function: unsigned int sleep (unsigned int seconds) The sl ...
- 《Linux内核设计与实现》读书笔记(十)- 内核同步方法【转】
转自:http://www.cnblogs.com/wang_yb/archive/2013/05/01/3052865.html 内核中提供了多种方法来防止竞争条件,理解了这些方法的使用场景有助于我 ...
- android测试常用的命令介绍
- typedef struct trx_struct trx_t;
/* The transaction handle; every session has a trx object which is freed only when the session is fr ...
- HDU 2870 Largest Submatrix
这三道题的关系是这样的,1505是1506的加强版,2870又是1505的加强版 如果按照上面由简到易的顺序来做的话,还是很简单的 这道题的思想就是 枚举+DP 因为某些字符可以变值,所以我们枚举a, ...
- php的webservice的soapheader认证问题
参数通过类传输:class authentication_header { private $username; private $password; public ...