随想:如何在数据库和缓存中交叉的不同对象获取数据
这是第一次写博客,写博客的目的是想把平时积累的一些想法和经验记录下来。
今天的要记录的是如何在同一个系统中获取对象数据时该如何从数据库或缓存中获取数据。
首先说明下为什么需要写这个内容的背景情况。我们为了提高系统的效率会将部分利用率高或者核心的数据从数据库放入到缓存中,部分利用率不高的数据则放置在数据库中等到需要用时再从数据库中取出来。那么假设我们有这么一种对象“产品”,他的属性中有“订单”这个对象。“产品”对象我们放到了缓存中,而“订单”对象我们只放置在数据库中。那么问题就来了,当我们从缓存中取到“产品”对象时,并且从数据库中获取该产品的订单数据后,订单数据会一直附加在“产品”对象中,直到“产品”对象消亡为止。但是订单数据可能随时都在更新的。如何避免我们从缓存中获取“产品”数据时,订单数据还是能够从数据库中去取呢?
一个简单的办法就是“产品”对象提供方法,复制一份副本(只复制值类型的数据,引用类型的数据不复制)出来给调用的程序。当有应用从缓存中获取“产品”对象数据时获取到的只是这个“产品”对象的副本。这时“产品”对象如果需要获取订单数据时就可以到数据库里面去获取,但并不会影响缓存中的“产品”对象。反过来如果“产品”对象中有个属性“部门”也缓存在内存中,那么通过索引同样可以在缓存中找到对应的“部门”对象数据。同样获取的“部门”对象也是从缓存中复制出来的。这样一来,对象在缓存或者数据库中交叉获取数据的问题就解决了。所一千道一万,文字写的再多也没有图表的表达能力强,下面我尝试用图的形式说明我的想法。