23 旁路缓存:Redis 是如何工作的?

Redis 常常用于作为应用程序域数据库之间的缓存的作用,若当 Redis 作为缓存失效了,就会造成大量的请求直接积压到了数据库层,数据库层就有可能巨大的压力造成数据库宕机或者故障使之不可用,此时应用程序就无法存储数据并响应客户端的请求了。

一、缓存的特征

  • 对于层次化的系统中,缓存相对于后端数据库而言是一个支持高速访问数据的数据存储系统,缓存中存储应用程序中频繁访问的数据,因此为了提高应用程序请求的响应时间,那么缓存就需要支持高速的数据访问能力。
  • 由于硬件生产及其成本的限制,因此缓存中的存储空间是有限,不可能存储含有大量数据的数据库中的所有数据,而是将应用程序中频繁访问的数据存储起来,当需要访问的数据不在缓存时,应用程序就需要从后端数据库中读取数据,其访问数据的性能没有从缓存中读取数据好,并且为了使得应用程序之后能够在缓存中可以读取到这些数据,后续缓存就会将这些数据从后端数据库中读取存储在缓存中,这也就是“缓存更新”,假若缓存的内存不够,那么就会执行 Redis 的数据淘汰机制,让一部分的数据淘汰掉,用于存储新的访问数据。这些操作就涉及到了缓存与后端数据库进行数据写回及其数据的读取的交互过程,其中在“缓存更新”的过程中还需要保证缓存与后端数据库中的数据保持一致性。

二、Redis 缓存处理请求的两种情况

  • 缓存命中
    • 应用程序中需要访问的数据在缓存中,那么应用程序就可以直接从缓存中读取数据,性能比较好。
  • 缓存缺失
    • 应用程序中需要访问的数据在缓存中并没有,因此去后端数据库中去读取这些数据,并且为了之后应用程序之后可以在缓存中读取这份数据,就需要把这部分缺失的数据读取更新到缓存中。(“缓存更新”),进行“缓存更新”的过程中就涉及到保证缓存和后端数据库之间要保证数据一致性的问题。
      在这里插入图片描述

三、Redis 作为旁路缓存的使用操作

  • Redis 作为独立的系统,它只能被动的等待请求,然后再进行请求的处理,与应用程序是两个独立的系统,因此如果应用程序需要使用 Redis 作为缓存,那么就需要在应用程序代码中添加相应的 Redis 的操作代码。其中应用程序在访问 Redis 缓存的时候就有缓存命中和缓存缺失两种情况,因此就涉及到了读取缓存,读取数据库,缓存更新三个主要的操作。首先应用程序在缓存中执行 GET 操作,查看缓存是否存储需要的数据,如果数据存在则缓存命中,如果没有那么就缓存缺失,因此应用程序就不得以从后端数据库中读取数据,性能有所下降,事后还需要将读取到的数据更新到缓存中,方便应用程序之后从缓存中读取。
  • 因此如果我们不知道应用程序源码的而情况下,就无法对其源码进行修改,也就无法对这些应用程序修改内部的代码进行使用 Redis 缓存的,并操作 Redis 的操作接口。
  • 在我们在应用程序中添加 Redis 的操作代码的时候,其中就包括读操作和写操作。其中就涉及到 Redis 缓存类型的两种类型:只读缓存和读写缓存。而写操作也有两种方式:写回缓存和写回后端数据库。
  • 并且 Redis 作为一个独立 系统,因此可以单独地为 Redis 缓存进行扩容或者是优化,并且,之后只要 Redis 的操作接口没有发生改变,对应用程序对 Redis 的操作的代码也不会有太大的修改。

四、缓存类型

(1)只读缓存

当 Redis 作为只读缓存的时候,当应用程序读取数据的时候就会调用 Redis GET 命令去缓存中查找数据,如果缓存中有这些数据就会从缓存中直接返回,如果查询从缓存中并没有这些数据,那么就会从后端数据库中读取,并且将这些数据更新到缓存中。而对于应用程序的要执行写操作,对于只读缓存类型的 Redis 而言,应用程序就只会将写操作发送给后端数据库,然后让后端数据库执行写操作。如果操作的这些数据在 Redis 中也有的话,那么就会将这份数据从 Redis 中删除,当事后应用程序在对这份数据进行读操作的事后,就会在 Redis 缓存中缓存缺失,因此还会从后端数据库中读取并更新到 Redis 缓存中。
在这里插入图片描述

(2)读写缓存

如果应用程序会将接收到的读写操作都会交给属于“读写缓存”的 Redis 缓存来负责执行,也就是说,利用 Redis 缓存高效率的读写性能的优势,将负责执行应用程序发送的读写数据的操作,因此 Redis 缓存中拥有最新的数据,然而为了保证 Redis 缓存和后端数据库的数据一致性,我们就需要将 Redis 的最新的数据写回到后端数据库中,然而由于应用程序不同的数据可靠性及其缓存性能方面的需求,选择不同的缓存数据写回的策略。

(3)读写缓存的两种写回策略

  • 同步写回
    • 每当 Redis 缓存执行一条应用程序发送的写操作命令,也会同样的将该命令发送给后端数据库来执行,当后端数据库也完成写操作之后,Redis 缓存才会返回客户端的响应。这样一来就可以保证数据的一致性,但是也因此要等到后端数据库相对于高性能的 Redis 缓存的慢速的写操作执行完毕才能返回,使得拖慢了 Redis 缓存,降低了 Redis 的性能。
  • 异步写回
    • 当应用程序处理写操作的时候就会将写操作命令发送给 Redis 缓存来执行,如果 Redis 缓存中存在该数据,就会在 Redis 缓存中执行,并不会将该写命令发送给后端数据库,直至在 Redis 缓存中发生修改操作的数据被淘汰的时候才会将该数据写回到后端数据库中。这样的策略可以利用 Redis 的高性能的读写操作使得返回给客户端的响应时间减少,但是如果 Redis 发生了宕机等故障,就会导致在 Redis 缓存中发生修改但是还未来得及写回后端数据库的数据发生丢失,数据的可靠性不高。
  • 如果对于需要高性能的执行写操作的业务场景,就可以考虑使用 Redis 的读写缓存。如果对于写操作并不是很多,并且主要需要执行高性能的读操作,那么就可以考虑使用 Redis 的只读缓存。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值