缓存碎语一

如果按存储的地方来分类,缓存分为哪些?

分为本地缓存和分布式缓存。本地缓存就是把数据保存应用程序所在的那台机器的内存中;而分布式缓存是把数据放在缓存服务器中,这个缓存服务器有可能是和应用服务器在同一台机器,这时候的是跨进程访问,如果缓存服务器和应用程序服务器不在同一台机器,这时候就可能会设计到跨域跨进程访问了。

缓存通过何种方式来找到缓存中的数据?

表面上是通过键来找到对象,实际是通过对象的引用在内存中查找到数据对象的。

修改缓存对象和修改数据库数据是一回事吗?

千万不要认为修改缓存对象就是修改了数据库中对应的数据。如果修改的是本地缓存对象,那只是修改更新了内存的那个缓存对象。而对于分布式缓存,在应用程序中修改完缓存对象,还需要把新的对象数据传给跨域、跨进程之外的缓存服务器。

有哪些分布式缓存机制?

比如memcached,AppFabric......

分布式缓存保存和读取数据的大致过程是怎样的?

缓存数据的时候,使用API,在应用程序服务器上把数据序列化为字节,再把这些字节发送给缓存服务器,让其保存;读取缓存数据的时候,缓存服务器把对象对应的字节发送给应用程序,在应用程序服务器上的对应类库再把字节转换成对象。

.NET本地缓存有哪几种方式?

一种是给类打上Serializable特性,不过这种方式由于其内部使用了反射机制,会比较耗CPU,特别是处理大对象的时候;另一种方式是给类打上Serializable特新,并且还让这个类实现ISerializable接口,这种方式没有使用反射,效率是上一种方式的几百倍。

什么是缓存大对象?

当缓存对象占用的内存大于85K的时候,就把其认为是缓存大对象。注意,大于85*1024个字节是大对象,一个对集合的引用,比如List<Person> list = new List<Person>(),其中list只是指向托管堆上的一个引用,不是大对象。

大对象与内存碎片,内存碎片是如何产生的?

大对象是被放在托管堆上的大堆上的,当GC进行垃圾回收后,大堆是不会被压缩的。内存碎片的产生大致这样:

→产生大对象
→在内存空间为该大对象开辟一块连续的区域
→CLR的GC进行垃圾回收,对象被回收,内存上该对象对应的大堆没有被压缩,这块内存空间还一直存在的
→在产生一个比第一次小的对象,占用刚才大堆内存空间的一部分
→于是,剩下的大堆内存空间的那部分成了碎片

线程间共享缓存数据会造成冲突吗?

答案是会的。

......
int a = 0;
myCache["mykey"] = 0;

var thread1 = new Thread(new ThreadStart(() =>{
    a = myCache["mykey"];
    a++;
    myCahce["mykey"]=a;
}));

var thread2 = new Thread(new ThreadStart(() =>{
    a = myCache["mykey"];
    a++;
    myCahce["mykey"]=a;
}));

thread1.Start();
thread2.Start();


最终的结果可能是0也可能是1。

调用缓存API把数据缓存起来后,就一定能读取到吗?

不一定。因为缓存机制一般设置绝对或相对过去时间,一旦过了这个时间,缓存数据就没有了。另外,缓存服务器CPU忙、网络不好也会导致数据没有被即时序列化保存到缓存服务器中。

所以,每次使用缓存数据的时候,先要判断缓存数据是否存在。

参考资料:汪洋的"DotNet"公众号。

时间: 2024-08-15 06:36:31

缓存碎语一的相关文章

缓存碎语二

缓存很多条数据,但只读取其中的一部分数据,如何处理? 比如在缓存中保存了100条数据,但读取分页数据,比如每次分页只读取10条数据.这种情况下,可以把这100条数据拆分成10次分别保存起来.每一个缓存项的key需要特别的设计,比如:01-10-products, 02-10-products...... 如何避免缓存一些不需要的数据? 比如: public class Teacher { public int Id{get;set;} public string Name{get;set;} p

Apache Ignite——新一代数据库缓存系统

Apache Ignite是一个通用的数据库缓存系统,它不仅支持所有的底层数据库系统,比如RDBMS.NoSQL和HDFS,还支持Write-Through和Read-Through.Write-Behind Caching等可选功能. Apache Ignite是一个聚焦分布式内存计算的开源项目,它在内存中储存数据,并分布在多个节点上以提供快速数据访问.此外,可选地将数据同步到缓存层同样是一大优势.最后,可以支持任何底层数据库存储同样让 Ignite成为数据库缓存的首先.

数据字典实现缓存

数据字典的好处很多比如: 1.可以减少使用表,来专门记录类型. 2.类型使用key检索,或者报表统计分析,在一定程度上相比汉字来讲,效率好得多. 3.使用缓存的数据字典.也可以减少不少的io操作. 等等.... 首先,库表设计就智者见智了.不多说.爱怎么设计就怎么设计. 完整的数据字典设计 ,需要 1.生成select 自定义标签. 2.list页面,或者get页面, 一个key转 value的标签 使用自定义标签,搭配上缓存的数据字典是最方便.最完美的解决办法, 接下来,就直接贴代码了. 一.

4.缓存控制技术

动态网站的数据都是从数据库获取而来的.所以网站的瓶颈往往就是反复连接数据库和大量的SQL语句查询的执行.由于HTTP协议是无状态性的,所以每次对页面请求都会执行相同的操作.我们可以让页面内容本身变化不大但是偶尔还是要变化的页面(例如新闻网站)缓存起来作为静态的页面,下一次再访问的时候直接访问静态的HTML页面即可. ① Smarty里面控制缓存 需要做3步工作:开启缓存,指定缓存目录,定义缓存的生命周期

Shiro缓存(十三)

使用缓存,可以解决每次访问请求都查数据库的问题.第一次授权后存入缓存. 缓存流程 shiro中提供了对认证信息和授权信息的缓存.shiro默认是关闭认证信息缓存的,对于授权信息的缓存shiro默认开启的.主要研究授权信息缓存,因为授权的数据量大. 用户认证通过. 该 用户第一次授权:调用realm查询数据库 该 用户第二次授权:不调用realm查询数据库,直接从缓存中取出授权信息(权限标识符). -------------------------------------使用ehcache缓存框架

Hibernate session缓存

一级缓存(执行代码时查看console台上的sql语句)  清空缓存 @Test public void demo03(){ //清空缓存 Session session=factory.openSession(); session.beginTransaction(); //1.查询 User user = (User)session.get(User.class, 1); System.out.println(user); //session.evitc(user) //将执行对象从一级缓存

nginx三 之缓存模块

友情提示: 缓存模块是在动静分离的环境基础上搭建,动静分离可以参考http://www.cnblogs.com/dahuandan/p/6759212.html 介绍 提高网站响应速度是web应用不容忽视的目标,在之前动静分离的基础上,我们已经降低了后端服务器压力,提高了处理请求的性能,但是用户请求的静态资源是从硬盘读取,相比内存的性能还有很大的提高: Nginx自带的缓存模块可以把静态资源缓存到内存中,提高了用户请求静态资源的速度,并且nginx自带缓存模块配置简单,使用灵活,搭配第三方插件可

一个缓存容灾写的样例

背景 有时我们能够使用缓存进行容灾的处理.场景例如以下:我们当前有一个专门提供各种数据的应用DataCore,该应用开放多个RFC方法供其它应用使用.      我们平时在读写数据时,会在Cache备份一份(为平时DataCore提高响应速度.减少DB.CPU压力所用),当DB挂掉的时候.Cache还能够用来容灾.使用缓存容灾的优点是:性能足够好,坏处是缓存可比数据库成本高多了. 让我们想象得更猛烈些,当DataCore整个挂掉的时候,A.B.C.D方怎么才干安然的执行下去? 我们能够在A.B.

浏览器缓存机制浅析

非HTTP协议定义的缓存机制 浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制(如: Expires: Cache-control等).但是也有非HTTP协议定义的缓存机制,如使用HTML Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下: <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 上述代码的作用是告诉浏览器当前页面不被缓存,每