比如说,我正在使用一些长时间运行的任务从数据库中提取数千条记录,并使用Redis缓存它。第二天,有人在数据库中修改了一些记录。下一次,redis将如何知道它必须返回缓存的数据,或者再次访问DB中的所有数千条记录?这种同步是如何实现的?
rekjcdws1#
Redis不知道DB中的数据是否已经更新。通常,我们使用Redis缓存数据如下:1.客户端检查数据,例如键值对,是否存在于Redis中。1.如果该键存在,客户端从Redis获取相应的值。1.否则,它从DB中获取数据,并将其设置为Redis。客户端也会为Redis中的键值对设置一个到期时间,比如5分钟。1.之后,任何对相同密钥的请求都将由Redis提供服务,尽管Redis中的数据可能已经过时。1.但是,在5分钟后,此密钥将自动从Redis中删除。1.转到步骤1。因此,为了让你的数据在Redis中保持最新状态,你可以设置一个较短的过期时间,但是,你的数据库必须满足大量的请求。如果你想大幅度减少对数据库的请求,你可以设置一个较长的过期时间,这样,在大多数情况下,Redis都可以为可能过期的数据提供服务。
5
您应该仔细考虑性能和过时数据之间的平衡。
zpgglvta2#
因为事实的来源在你的数据库中,而你把数据从这个数据库推送到Redis,所以你总是要从数据库更新到Redis,至少你创建了另一个进程来同步数据。我的建议是先从DB到Redis运行一次完整的更新,然后使用一个同步过程,每次你注意到数据库中的更新/创建/删除操作,你就把它拉到Redis。我不知道你在Redis中使用哪种结构来存储数据库记录,但我猜它可能是一个Hash,可能是由你的表索引来索引的,这样同步操作就可以立即进行:如果在数据库中创建了一条记录,则设置HSET,如果删除,则设置HDEL,依此类推。你甚至可以省略从DB到Redis的第一次完全同步,只需要清理Redis并开始同步过程。如果你因为某些原因无法做到以上操作,你可以创建一个同步守护进程,它会不断地从数据库中读取数据,并将它们与Redis中的数据库进行比较,如果它们在你更新的过程中有所不同,或者如果它们在双方都不存在,你可以在Redis中删除或创建条目。
ckx4rj1h3#
我的解决办法是:当您在数据库中更新,删除或添加新数据时,您应该删除redis中所有数据,在您获取路径中,您应该检查数据是否存在,如果不存在,您应该将所有数据从数据库存储到redis中
cmssoen24#
您可以在数据库上应用任何更新/删除时使用@CacheEvict这将从缓存中清除响应值,因此下一个查询将从数据库获取
4条答案
按热度按时间rekjcdws1#
Redis不知道DB中的数据是否已经更新。
通常,我们使用Redis缓存数据如下:
1.客户端检查数据,例如键值对,是否存在于Redis中。
1.如果该键存在,客户端从Redis获取相应的值。
1.否则,它从DB中获取数据,并将其设置为Redis。客户端也会为Redis中的键值对设置一个到期时间,比如
5
分钟。1.之后,任何对相同密钥的请求都将由Redis提供服务,尽管Redis中的数据可能已经过时。
1.但是,在
5
分钟后,此密钥将自动从Redis中删除。1.转到步骤1。
因此,为了让你的数据在Redis中保持最新状态,你可以设置一个较短的过期时间,但是,你的数据库必须满足大量的请求。
如果你想大幅度减少对数据库的请求,你可以设置一个较长的过期时间,这样,在大多数情况下,Redis都可以为可能过期的数据提供服务。
您应该仔细考虑性能和过时数据之间的平衡。
zpgglvta2#
因为事实的来源在你的数据库中,而你把数据从这个数据库推送到Redis,所以你总是要从数据库更新到Redis,至少你创建了另一个进程来同步数据。
我的建议是先从DB到Redis运行一次完整的更新,然后使用一个同步过程,每次你注意到数据库中的更新/创建/删除操作,你就把它拉到Redis。
我不知道你在Redis中使用哪种结构来存储数据库记录,但我猜它可能是一个Hash,可能是由你的表索引来索引的,这样同步操作就可以立即进行:如果在数据库中创建了一条记录,则设置HSET,如果删除,则设置HDEL,依此类推。
你甚至可以省略从DB到Redis的第一次完全同步,只需要清理Redis并开始同步过程。
如果你因为某些原因无法做到以上操作,你可以创建一个同步守护进程,它会不断地从数据库中读取数据,并将它们与Redis中的数据库进行比较,如果它们在你更新的过程中有所不同,或者如果它们在双方都不存在,你可以在Redis中删除或创建条目。
ckx4rj1h3#
我的解决办法是:
当您在数据库中更新,删除或添加新数据时,您应该删除redis中所有数据,在您获取路径中,您应该检查数据是否存在,如果不存在,您应该将所有数据从数据库存储到redis中
cmssoen24#
您可以在数据库上应用任何更新/删除时使用@CacheEvict这将从缓存中清除响应值,因此下一个查询将从数据库获取