编程内存中python对象检索的后备

时间:2016-10-23 14:05:48

标签: django redis

在我的Django网站上,有一个由每个人都可以查看的文字和照片组成的新闻源。新闻源由每个人查看的2000个最新用户提交,全球组成。

我一直在使用redis来存储和检索这些用户提交的内容。但是,为了加快速度,我现在将直接从内存中查找最新的2000个提交内容。

我将通过将新条目的ID推送到python list并将提交的数据保存在相应的python dictionary中来实现此目的。此外,如果list len高于2000,我会修剪clear(),并在必须删除的相应词典上调用intercom方法。这样我的记忆就不会溢出。

我的问题是关于处理持久性。边缘情况发生在擦除存储器(例如重启)的地方。我该如何处理这个案子?

我能想到的一种方法是在redis中保留用户提交的副本。重启后,我从redis中检索一次数据。从那时起,我再次继续从内存中检索所有内容(以及redis中的副本)。

上面的方案看起来是处理持久性需求的正确方法,同时采用内存中检索的速度(我正在尝试这样做)。我即将实现这一点,但想要由社区来管理,以防我忽视某些事情。

1 个答案:

答案 0 :(得分:0)

正如您在评论中提到的,主要问题是用户网络不佳。您当前的解决方案,即在将数据发送给用户之前压缩数据是非常好的。

对于大多数情况,Redis足够快,尽管它比内存中对象操作慢(因为数据序列化/反序列化和进程间通信需要成本)。但是,如果要返回给用户的数据不是很大,那就不会有问题。比方说,Redis的10ms速度较慢,但​​用户不会感觉到差异。

另一方面,如果用内存中的操作替换Redis,则必须自己进行持久性工作,这可能会使代码更加复杂。

通常,我们使用缓存来提高性能,而Redis是缓存的不错选择。您可以使用SQL / NoSQL数据库(例如Mysql,MongoDB)来存储数据,并将Redis用作LRU缓存。

在您的情况下,您使用Redis作为数据存储,并且在Redis意外退出时不介意丢失一些数据。为了降低python进程和Redis之间的数据序列化/反序列化和IPC的成本,你可以在你的python代码中有一个内存中的LRU缓存。这可能会稍微改善性能,并且不会使代码过于复杂。