在我的Django网站上,有一个由每个人都可以查看的文字和照片组成的新闻源。新闻源由每个人查看的2000个最新用户提交,全球组成。
我一直在使用redis来存储和检索这些用户提交的内容。但是,为了加快速度,我现在将直接从内存中查找最新的2000个提交内容。
我将通过将新条目的ID推送到python list
并将提交的数据保存在相应的python dictionary
中来实现此目的。此外,如果list
len
高于2000,我会修剪clear()
,并在必须删除的相应词典上调用intercom
方法。这样我的记忆就不会溢出。
我的问题是关于处理持久性。边缘情况发生在擦除存储器(例如重启)的地方。我该如何处理这个案子?
我能想到的一种方法是在redis中保留用户提交的副本。重启后,我从redis中检索一次数据。从那时起,我再次继续从内存中检索所有内容(以及redis中的副本)。
上面的方案看起来是处理持久性需求的正确方法,同时采用内存中检索的速度(我正在尝试这样做)。我即将实现这一点,但想要由社区来管理,以防我忽视某些事情。
答案 0 :(得分:0)
正如您在评论中提到的,主要问题是用户网络不佳。您当前的解决方案,即在将数据发送给用户之前压缩数据是非常好的。
对于大多数情况,Redis足够快,尽管它比内存中对象操作慢(因为数据序列化/反序列化和进程间通信需要成本)。但是,如果要返回给用户的数据不是很大,那就不会有问题。比方说,Redis的10ms
速度较慢,但用户不会感觉到差异。
另一方面,如果用内存中的操作替换Redis,则必须自己进行持久性工作,这可能会使代码更加复杂。
通常,我们使用缓存来提高性能,而Redis是缓存的不错选择。您可以使用SQL / NoSQL数据库(例如Mysql,MongoDB)来存储数据,并将Redis用作LRU缓存。
在您的情况下,您使用Redis作为数据存储,并且在Redis意外退出时不介意丢失一些数据。为了降低python进程和Redis之间的数据序列化/反序列化和IPC的成本,你可以在你的python代码中有一个内存中的LRU缓存。这可能会稍微改善性能,并且不会使代码过于复杂。