缓存

来源:互联网 发布:上瘾网络剧免费观看 编辑:程序博客网 时间:2024/06/05 03:41

分布式与集群

1.    分布式

在计算机科学中,分布式计算(英语:Distributed computing),又译为分散式運算。这个研究领域,主要研究分布式系统(Distributed system)如何进行计算。分布式系统是一组电脑(computer),通过网络相互链接传递消息与通信后并协调它们的行为而形成的系统。组件之间彼此进行交互以实现一个共同的目标。把需要进行大量计算的工程数据分区成小块,由多台计算机分别计算,再上传运算结果后,将结果统一合并得出数据结论的科学。

2. 集群

计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多。 计算机集群的特点: 1. 通过多台计算机完成同一个工作。达到更高的效率。 2. 两机或多机内容、工作过程等完全一样。如果一台死机,另一台可以起作用。

3. 两者的区别与联系

集群要解决的是可靠性,而分布式的主要工作是分解任务,将职能拆解。

集群和分布式都是由多个节点组成,但是集群之间的通信协调基本不需要,而分布式各个节点的通信协调必不可少。

集群主要是为了应对请求压力的分担,从而有了LB,负载均衡集群;为了应对可用性,从而有了HA,高可用性集群;为了更强的性能,从而有了HP,高性能集群;为了高并发大规模性能,从而有分布式系统集群。

缓存

1. 基本知识

    1.  前提:较少变更的数据才适合做缓存

2.  缓存方案的确定

    1.  首先明确是不是一定要上缓存,当前架构的瓶颈在哪里,若瓶颈真是数据库操作上,再继续往下看。

    2.  搞明白应用场景,明确memcached和redis的区别,到底要使用哪个。前者终究是个缓存,不可能永久保存数据(LRU机制),支持分布式,后者除了缓存的同时也支持把数据持久化到磁盘等,redis要自己去实现分布式缓存(貌似最新版本的已集成),自己去实现一致性hash。

    3.  不建议一次性全量上缓存,最开始不动核心业务,可以将边缘业务先换成缓存组件,一步步换至核心业务。

3.  缓存读取流程:
    1、先到缓存中查数据
    2、缓存中不存在则到实际数据源中取,取出来后放入缓存
    3、下次再来取同样信息时则可直接从缓存中获取

4.  缓存更新流程:
    1、更新数据,并不马上更新缓存,而是等到再次读取时加载,

    2、使缓存过期或失效,这样会促使下次查询数据时在缓存中查不到而重新从数据库去一次。

5.  通用缓存机制:
    1、用查询的方法名+参数作为查询时的key value对中的key值
    2、向memcache或redis之类的nosql数据库(或者内存hashmap)插入数据
    3、取数据时也用方法名+参数作为key向缓存数据源获取信息

6.缓存策略

缓存策略主要三方面:①缓存什么内容;②何时进行缓存;③当缓存空间已满时如何进行替换,即缓存替换算法。

1. LRU类:Least Recently Used,最近最少使用。

    核心思想:算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

    实现:最常见的实现是使用一个链表保存缓存数据。1. 新数据插入到链表头部;2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;3. 当链表满的时候,将链表 尾部的数据丢弃。

    命中率:当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命中率急剧下降,缓存污染情况比较严重。

    复杂度:实现简单。

    代价:命中时需要遍历链表,找到命中的数据块索引,然后需要将数据移到头部。

2. LFU类:Least Frequently Used,最不经常使用。

    核心思想:算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。

    实现:LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排序。1. 新加入数据插入到队列尾部(因为引用计数为1);2. 队列中的数据被访问后,引用计数增加,队列重新排序;3. 当需要淘汰数据时,将已经排序的列表最后的数据块删除;

    命中率:一般情况下,LFU效率要优于LRU,且能够避免周期性或者偶发性的操作导致缓存命中率下降的问题。但LFU需要记录数据的历史访问记录,一旦数据访问模式改变,LFU需要更长时间来适用新的访问模式,即:LFU存在历史数据影响将来数据的“缓存污染”效用。

    复杂度:需要维护一个队列记录所有数据的访问记录,每个数据都需要维护引用计数。

    代价:需要记录所有数据的访问记录,内存消耗较高;需要基于引用计数排序,性能消耗较高。

3. FIFO类:First In First Out,先进先出。

    核心思想:判断被存储的时间,离目前最远的数据优先被淘汰。

    实现:1. 新访问的数据插入FIFO队列尾部,数据在FIFO队列中顺序移动;2. 淘汰FIFO队列头部的数据;

    命中率:命中率很低,因为命中率太低,实际应用中基本上不会采用。

    复杂度:简单。

    代价:实现代价很小。

7.哪些数据需要被缓存

1. 经常被读取并且实时性要求不强可以等到自动过期的数据。

    例如网站首页最新文章列表、某某排行等数据。也就是虽然新数据产生了,但对用户体验不会产生任何影响的场景。这类数据就使用典型的缓存策略,设置一过合理的过期时间,当数据过期以后再从数据库中读取。当然你得制定一个缓存清除策略,便于编辑或者其它人员能马上看到效果。

2. 经常被读取并且实时性要求强的数据。比如用户的好友列表,用户文章列表,用户阅读记录等。
    这类数据首先被载入到memcached中,当发生更改(添加、修改、删除)时就清除缓存。在缓存的时候,我将查询的SQL语句md5()得到它的hash值作为key,结果数组作为值写入memcached,并且将该SQL涉及的table_name以及hash值配对存入memcached中。当更改了这个表时,我就将与此表相配对的key的缓存全部删除。

3. 统计类缓存,比如文章浏览数、网站PV等
    此类缓存是将在数据库的中来累加的数据放在memcached来累加。获取也通过memcached来获取。但这样就产生了一个问题,如果memcached服务器down掉的话这些数据就有可能丢失,所以一般使用memcached的永固性存储,这方面我们新浪使用memcachedb。

4. 活跃用户的基本信息或者某篇热门文章。
    此类数据的一个特点就是数据都是一行,也就是一个一维数组,当数据被update时(比如修改昵称、文章的评论数),在更改数据库数据的同时,使用Memcache::replace替换掉缓存里的数据。这样就有效了避免了再次查询数据库。

5. session数据
    使用memcached来存储session的效率是最高的。memcached本身也是非常稳定的,不太用担心它会突然down掉引起session数据的丢失,即使丢失就重新登录了,也没啥。

原创粉丝点击