把 Redis 用作缓存时,我们会把 Redis 部署在数据库的前端,业务应用在访问数据时,会先查询 Redis 中是否保存了相应的数据。此时,根据数据是否存在于缓存中,会有两种情况。
- 缓存命中:Redis 中保存相应的数据,就直接读取 Redis。
- 缓存缺失:Redis 中没有保存相应的数据,那么就需要从后端数据库中读取数据。而且,一旦发生缓存缺失,为了让后续请求能从缓存中读取到数据,我们需要把缺失的数据写入 Redis,这个过程叫作缓存更新。缓存更新操作会涉及到保证缓存和数据库之间的数据一致性问题,关于这一点,我会在第 25 讲中再具体介绍。
Redis 提供了高性能的数据存取功能,所以 Redis 广泛应用在缓存场景中,既能有效地提升业务应用的响应速度,还可以避免高并发大压力的请求发送到数据库层。
旁路缓存( cache-aside)
对象缓存是一种旁路缓存,旁路缓存通常是一个独立的键值对( key-value )存储。
应用代码通常会询问对象缓存需要的对象是否存在,如果存在,它会获取并使用缓存的对象,如果不存在或已过期,应用会连接主数据源来组装对象,并将其保存回对象缓存中以便将来使用。
缓存系统的工作原理
使用缓存系统时,我们基本有三个操作:
- 应用读取数据时,需要先读取 Redis;
- 发生缓存缺失时,需要从数据库读取数据;
- 发生缓存缺失时,还需要更新缓存。
对于缓存系统,我们需要系统地掌握缓存的一系列内容,包括工作原理、替换策略、异常处理和扩展机制
在一个层次化的系统中,缓存一定是一个快速子系统,数据存在缓存中时,能避免每次从慢速子系统中存取数据。
好了,到这里,我们知道了,通过在应用程序中加入 Redis 的操作代码,我们可以让应用程序使用 Redis 缓存数据了。不过,除了从 Redis 缓存中查询、读取数据以外,应用程序还可能会对数据进行修改,这时,我们既可以在缓存中修改,也可以在后端数据库中进行修改,我们该怎么选择呢?
其实,这就涉及到了 Redis 缓存的两种类型:只读缓存和读写缓存。只读缓存能加速读请求,而读写缓存可以同时加速读写请求。而且,读写缓存又有两种数据写回策略,可以让我们根据业务需求,在保证性能和保证数据可靠性之间进行选择。
所以,接下来,我们来具体了解下 Redis 的缓存类型和相应的写回策略。
不同缓存类型的选择
只读缓存直接在数据库中更新数据的好处是,所有最新的数据都在数据库中,而数据库是提供数据可靠性保障的,这些数据不会有丢失的风险。当我们需要缓存图片、短视频这些用户只读的数据时,就可以使用只读缓存这个类型了。
关于是选择只读缓存,还是读写缓存,主要看我们对写请求是否有加速的需求。
- 如果需要对写请求进行加速,我们选择读写缓存;
- 如果写请求很少,或者是只需要提升读请求的响应速度的话,我们选择只读缓存。
缓存的数据淘汰机制
Redis 的数据淘汰机制使用缓存的异常情况