我正在做作业。 REST API(在Spring中开发)具有m()方法,该方法模拟人员清洁窗户。最后,清洁工必须在窗口上写一个唯一的短语(字符串)。所有清除程序编写的短语最终都保存在MySQL数据库中。因此,每次执行m()时,都会对数据库进行查询,以获取迄今为止已写入数据库的所有短语。然后,更清洁的方法m()生成一个随机字符串作为短语,在查询的短语中对其进行检查以确保其唯一性并将其写入数据库。因此,每m()有一个查询可获取所有短语,而每个m()则有一个查询可写该短语。两者都在同一张桌子上。
这是一个可以利用缓存的场景,我去了Redis。我也认为回写缓存是最好的解决方案。因此,每次写入都会发生,它会发生在缓存中,而不是DB中,并且每次读取也会从缓存中发生。可以每小时以新线程(或可配置的方式)将缓存复制到数据库。我正在读Can Redis write out to a database like PostgreSQL?,似乎几年前您必须手动执行此操作。
我的问题:
如果要使用手册,这就是我计划实现的方式。理想吗?
每小时写入的短语将被添加到Redis中的对象(用户ID,短语)列表中,午夜至凌晨1点的列表将称为短语_1,凌晨1点至2点称为短语_2,依此类推。每小时,后台线程将把整个小时的列表写入数据库。每次需要提取所有短语进行检查时,我都会从缓存中加载当天的所有列表,例如将短语_1,短语_2循环并合并。 (稍后用户数量增加时-我将不得不分片,但这不是我的直接关注)。
谢谢。
答案 0 :(得分:0)
您应该在要成为唯一字段的字段上创建唯一索引,而不是通过Redis来确保数据的唯一性,
答案 1 :(得分:0)
检查 https://github.com/RedisGears/rgsync(和 https://redislabs.com/solutions/use-cases/caching/),它试图解决回写和直写两种情况。 我还没有进行功能测试。
有趣的是,2020 年的 CMU 论文 (https://www.pdl.cmu.edu/PDL-FTP/Storage/2020.apocs.writeback.pdf) 声称“写回感知缓存是 NPcomplete 且 Max-SNP 很难”