<p>我目前正在处理一个场景,在用户登录应用程序后,我想将他的IP、用户名插入数据库。在</p>
<p>现在,我只能做一次的方法是使用缓存将用户的ip和用户名存储在缓存中。在</p>
<p>现在,当每个gunicorn进程初始化自己的缓存时,问题就出现了。如果为proc1的缓存添加username+ip组合,如果proc2接收到同一用户的下一个请求,它将不会在其缓存中找到它,因此再次将其添加到缓存和数据库中,这是不合适的。因此,在这种情况下,线程安全(进程安全)缓存非常重要。在</p>
<p>日志示例:</p>
<pre><code>2015-07-07 22:42:31 - myapp.views:29 - DEBUG - not from cache user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:31 - myapp.views:30 - DEBUG - from cache : user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:40 - myapp.views:29 - DEBUG - not from cache user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:40 - myapp.views:30 - DEBUG - from cache : user1100.100.100.100, <type 'unicode'> [14776]
2015-07-07 22:42:41 - myapp.views:29 - DEBUG - not from cache user1100.100.100.100, <type 'unicode'> [14779]
2015-07-07 22:42:41 - myapp.views:30 - DEBUG - from cache : None, <type 'NoneType'> [14779]
2015-07-07 22:42:41 - myapp.views:32 - DEBUG - new username ip [14779]
2015-07-07 22:42:41 - myapp.views:38 - DEBUG - User : user1, ip : 100.100.100.100, noted at time : Tue Jul 7 22:42:41 2015, login_count : None [14779]
</code></pre>
<p>您可以看到gunicorn进程14776首先将其添加到缓存中,下一个请求被14776选中,因此数据库条目只发生了一次,但是在那之后,下一个请求被14779选中,14779将其添加到缓存中,从而将其添加到数据库中。在</p>
^{pr2}$
<p>使用memcache或基于redis的缓存可以解决这个问题。我自己也在试验。在</p>