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 上海专门设立了“直击黑产,业务 ...
随机推荐
- 当滚动条滚动到页面底部自动加载增加内容的js代码
这篇文章主要介绍了如何使用javscript实现滚动条滚动到页面底部自动加载增加页面内容,需要的朋友可以参考下..1,注册页面滚动事件,window.onscroll = function(){ }; ...
- BZOJ 2743 采花(树状数组)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2743 题意:给出一个数列,每个询问查询[L,R]中至少出现两次的数字有多少种? 思路:(1 ...
- leetcode Database3
一.Rank Scores Write a SQL query to rank scores. If there is a tie between two scores, both should ha ...
- matlab函数集锦
matlab函数集锦 matlab函数集锦ISFINITE(X), ISINF(X), or ISNAN(X)pwd 当前目录eval 执行matlab函数CONV2( ,'same') 卷积F ...
- hibernate学习笔记4---HQL、通用方法的抽取实现
一.通用方法的抽取实现 由于hibernate中对增删改查的一切操作都是面向对象的,所以将增删改查抽取成通用方法,以满足不同的表的增删改查操作,简化jdbc代码. 具体例子如下: package cn ...
- hibernate的三种状态(儿)
第五讲:hibernate的三种状态 瞬时:bean对象与session,与数据库无关.在session对象的save方法保存之前. 持久状态(托管):bean对象与session有关,数据库中有对应 ...
- Spring事务报Connection is read-only
昨天做项目时,写了个方法,程序突然报了Connection is readonly. Queries leading to data modification are not allowed调了程序半 ...
- SharePoint的实体生成
生成Linq实体 使用SPMetal工具生成Linq to SharePoint实体 工具安装目录: C:\Program Files\Common Files\Microsoft Shared\We ...
- Oracle安装错误ora-00922(zhuan)
Oracle安装错误ora-00922(缺少或无效选项) (2012-03-19 10:49:27) 转载▼ 标签: 杂谈 安装Oracle 11g R2的过程中,在新建数据库实例时出现了该错误, ...
- myeclipes准备工作
设置jsp中默认编码为utf-8