通常来说,当系统写数据到缓存的时候,在某个时点也需要更新缓存后端的数据库。究竟在哪个时点更新后端数据库,是由缓存写策略来控制。
缓存写策略,主要包含两个基础方法,Write-through和Write-behind。
Write-through,写数据到缓存和写数据到数据库是同步的。如果写数据***缓存,那么可以先刷新缓存,然后再写数据库。如果写数据库不***缓存,这个时候是可以直接写数据库了。等到读的时候,如果不***缓存,再从数据库中取数据缓存起来。
Write-behind,延后写数据到数据库。其中一种实现方法是异步写数据到数据库。首先写数据到缓存,然后发布一个写事件到消息队列,此时即可响应客户端了。消息队列的消费者处理写事件,将数据写到数据库中。Write-behind如果对于频繁的数据写表操作,是能提高写性能的。当然如果在写缓存成功,但写事件发布成功前,缓存 server 宕机了,也是有可能数据丢失了。
大多数的系统都是读多写少,所以Write-through策略应用相当广泛,就如spring cache 中的CachePut 注解作用。Ehcache缓存支持这两种策略。
***提出这样一个场景,需要从数据库中,取一些数据(数据会不定时改变,相当频繁),然后做一些复杂耗时的计算,再将结果最终保存到数据库中,这个时候我们该如何做缓存?