1. 输入网址后,查询浏览器缓存
2. 查询浏览器 dns 缓存
3. 查询操作系统 dns 缓存
4. 请求 dns 服务器,查询 dns 服务器缓存
5. 获得 ip,静态资源走 cdn 缓存。动态数据走服务器
6. 如果配置了页面缓存,走页面缓存
7. 如果配置了本地缓存(localcache),走本地缓存
8. 如果配置了分布式缓存(如 redis 等等),走分布式缓存
9. 数据库操作,数据库缓存
使用场景
缓存类型 | 使用场景 | 使用示例 | 优点 | 缺点 | 读取时间 |
---|---|---|---|---|---|
localcache | 少量数据,对应用程序只读或读多写少 | 后台配置,分区信息 | 无需网络开销,访问速度最快 | 集群机器数据不同步 | 0.00001344ms |
memcache | 海量数据,高并发读写 | 评论内容,账号信息 | 内存占用相对 redis 少,适合大键存储 | 数据结构单一,不支持备份及持久化,只支持客户端操作 | 0.4437ms |
redis | 海量数据,高并发读写 | 评论 id 索引,收藏视频信息 | 数据结构丰富,支持备份及持久化,支持服务器操作 | 相对 memcache 内存效率低 |
- localcache 适用于存储少量数据及对应用程序只读或读多写少的场景,例如后台黑白名单、推广信息等,因为应用程序对这些数据几乎只是只读的,数据的修改主要发生在后台管理员更新配置时,且这些数据量很少,完全可以存储在本地内存当中。应用程序只需要定期从数据库 load 数据进行更新即可。对于分布式集群的部署,每台机器独自维护一份 localcache,单后台数据有变动时,不同机器不可能同时 load 更新,因此存在集群机器数据不一致的情况。 但是这种情况通常是在可接受范围内的。
- memcache 适用于存储大量高并发读写的数据,减轻数据库访问压力。如果没有 memcache 缓存,所有的访问直接打到 db,高并发情况下将立马把数据库打挂,由于是直接存储在内存当中,因此访问速度将大大降低,同时数据缓存在 memcache 集群当中,可以确保应用集群访问数据的一致性,而不会存在 localcache 当中的问题。由于 memcache 不支持持久化,一旦集群机器出现宕机,将导致所有数据丢失,但是 memcache 本身就不是为了持久化数据而存在的,所以这也不是一个问题,需要注意的是,一旦 memcache 出现宕机等情况需要服务重启时,需要对缓存进行预热,不然大量 miss 同样也会打挂数据库。
- redis 同样也是为了应对高并发读写而存在的。和 memcache 一样也是 k-v 类型,但是 redis 支持更丰富的数据结构,list,set,sortset,hashes。由于 redis 数据不是完全存在内存当中,当 redis 内存耗尽时,长期不使用的 value 将被转移到磁盘,因此 redis 可以存储比自身内存大的数据。同时 redis 支持持久化及 master-slave 模式数据备份。重启时可以再次加载磁盘的数据到内存当中。redis 还具有容灾模式,只需要开启 aof,即使服务器宕机也可以通过 aof 文件进行数据恢复。是否使用持久化及开启 aof 要根据具体业务场景进行选择。