Data is cached everywhere

流程中存在多个层次。
- 客户端应用:HTTP响应可以被浏览器缓存。首次通过HTTP请求数据时,返回的数据带有HTTP头中的过期策略;再次请求数据时,客户端应用会先尝试从浏览器缓存中检索数据。
- CDN:CDN缓存静态网络资源。客户端可以从附近的CDN节点检索数据。
- 负载均衡器:负载均衡器也可以缓存资源。
- 消息基础设施:消息代理首先将消息存储在磁盘上,然后消费者以自己的速度检索它们。根据保留策略,数据在Kafka集群中被缓存一段时间。
- 服务:服务中存在多层缓存。如果数据未缓存在CPU缓存中,服务将尝试从内存中检索数据。有时服务还有第二级缓存,用于在磁盘上存储数据。
- 分布式缓存:像Redis这样的分布式缓存在内存中保存多个服务的键值对。它提供比数据库更好的读/写性能。
- 全文搜索:我们有时需要使用全文搜索,如Elasticsearch进行文档搜索或日志搜索。数据的副本也被索引到搜索引擎中。
- 数据库:即使在数据库中,我们也有不同级别的缓存:
- WAL(预写式日志):在构建B树索引之前,数据首先被写入WAL。
- 缓冲池:用于缓存查询结果的内存区域。
- 物化视图:预先计算查询结果,并将其存储在数据库表中,以提高查询性能。
- 事务日志:记录所有事务和数据库更新。
- 复制日志:用于记录数据库集群中的复制状态。
Why is Redis so fast?
There are 3 main reasons as shown in the diagram below.

- Redis是基于RAM的数据存储。RAM访问速度至少比随机磁盘访问快1000倍。
- Redis利用IO多路复用和单线程执行循环来提高执行效率。
- Redis利用了几种高效的低层数据结构。
Question: Another popular in-memory store is Memcached. Do you know the differences between Redis and Memcached?
You might have noticed the style of this diagram is different from my previous posts. Please let me know which one you prefer.
Redis和Memcached都是流行的内存键值数据存储,但它们有一些区别:
数据类型:Redis支持更复杂的数据类型,如字符串、列表、集合、有序集合、哈希、位图和地理空间索引,而Memcached只支持简单的键值对。
持久性:Redis通过将数据写入磁盘提供持久性,而Memcached没有内置的持久性特性。
数据驱逐策略:Redis允许更复杂的数据驱逐策略,而Memcached使用简单的LRU(最近最少使用)算法进行数据驱逐。
复制:Redis支持主从复制和自动分区,而Memcached没有内置的复制支持。
内置数据操作:Redis内置支持排序、排名和范围查询等操作,而这些功能在Memcached中不可用。
How can Redis be used?

Redis不仅仅是用于缓存。
如图所示,Redis可以在各种场景下使用。
- 会话:我们可以使用Redis在不同服务之间共享用户会话数据。
- 缓存:我们可以使用Redis缓存对象或页面,特别是对于热点数据。
- 分布式锁:我们可以使用Redis字符串在分布式服务之间获取锁。
- 计数器:我们可以统计文章的点赞次数或阅读次数。
- 速率限制器:我们可以为特定用户IP应用速率限制器。
- 全局ID生成器:我们可以使用Redis Int作为全局ID。
- 购物车:我们可以使用Redis Hash来表示购物车中的键值对。
- 计算用户留存:我们可以使用Bitmap表示用户每日登录情况并计算用户留存。
- 消息队列:我们可以使用List作为消息队列。
- 排名:我们可以使用ZSet对文章进行排序。
Top caching strategies
Designing large-scale systems usually requires careful consideration of caching. Below are five caching strategies that are frequently utilized.
