1.介绍

将动态的资源存储为静态资源, 从而省去一些重复的计算,逻辑处理等步骤, 快速响应.

同时, 只要两种介质之间存在速度差, 就会产生缓存来缓解这种矛盾.

2.分类

按照存储介质分类:

文件缓存

内存缓存

CPU高速缓存: CPU Cache  //算不算分类之一 TBD 

3.文件缓存[含数据库]

文件缓存

数据库缓存 

MongoDB  //存在磁盘上

4.内存缓存

memcached

redis

5.常用缓存服务器软件

memcached

redis

MongoDB  //其实是当做数据库来使用的,或者说更偏向于DB. 从名字上便可以看出.

6.Memcached

参见: 

7.Redis

参见: 

8.MongoDB

参见: 

9.缓存更新策略

缓存的大小有限,当缓存被用满时,哪些数据应该被清理出去,哪些数据应该被保留?这就需要缓存淘汰策略来决定。

常见的策略有如下几种://推荐前三种

 

先进先出策略 FIFO(First In,First Out)

先进先出,底层是利用双向链表,新来的数据放到链表的尾部,如果链表塞满了就删除头部的。

 

 

最少使用策略 LFU(Least Frequently Used)

思路: 如果一个数据在最近一段时间内使用次数最少,那么将来一段时间使用的可能性也很少, LFU 是基于访问次数的。

实现:两个HASHMAP, 一个是用来存储数据的, key-value. 一个是用来存储次数的, key-time. 

当访问一个key 的时候就在 key-time, 也就是的第二个hashmap 对应的time 加1.

删除的时候就寻找最少time 的那个。

 

 

最近最少使用策略 LRU(Least Recently Used)

如果数据最近被访问过,那么将来访问的几率也很高。

实现:新增加的数据放到头部。每当缓存命中,就把数据放到尾部。删除的时候就删除尾部的数据

 

 

随机淘汰策略/算法: 从数据库中随机删除一个key

 

 

TTL淘汰策略/算法: 从数据库中删除一个最快过期的key

 

 

后续补充

...

10.补充

1.mongodb,以及redis和mongodb的差别,实际使用时选择应该做哪些方面的考虑

回复:

Redis是Key-Value数据库,数据存放在内存中,查询和写入都是在内存中进行操作。当然Redis也支持持久化,只是持久化只是Redis的功能之一,并不是Redis的强项。通常,你可以把Redis称之为缓存。支持的数据类型丰富,包括字符串、哈希、列表、集合、有序集合,同时还支持基数统计,地理空间以及索引半径查询,数据流等。

MongoDB是面向文档数据库,功能强大,是非关系型数据库中最像关系型数据库的,处理增删改查也可以增加条件,类似于RDBMS一样灵活。
在存储方式上,Redis将数据放在内存中的,通过RDB或者AOF方式进行持久化。
而MongoDB实际上数据是存放在磁盘上的[刚刚了解],只是通过mmap调用将数据映射到内存中,所以你可以将mmap理解成为加速的方式。mmap调用可以使得对普通文件的操作像是在内存中进行读写一样,这是因为它将文件映射到调用进程的地址空间中,实现了文件所在的磁盘物理地址与进程空间的虚拟地址一一映射的关系,这样就可以直接在内存中进行操作,然后写完成之后同步一下就可以存放到文件中,效率非常高。//这种实现方式还是没看明白, 但是现实就是确实很快 TBD
不过在使用选择的时候,我们还是将 MongoDB 归为数据库,而Redis归为缓存。

总的来说,Redis就像是一架飞机一样,查询及写入性能极佳,但是存储的数据规模有限。
MongoDB就像是高铁一样,在处理货物(数据)的功能上强于Redis,同时能承载的数据量也很大,远高于Redis,但是查询及写入的效率不及Redis。

 

后续补充

...

11.参考

  //MongoDB是什么?看完你就知道了

https://time.geekbang.org/column/article/41013 //06 | 链表(上):如何实现LRU缓存淘汰算法?

<<PHP核心技术与最佳实践>> P415 列旭松 陈文

后续补充

...