我有问题,无法解决。也许我把它变得太难或太复杂了,或者我只是走错了方向,思考了一些没有意义的事情。下面是对所发生情况的描述。(例如,在浏览器中打开多个选项卡或同时请求其他一些页面的页面。)
我有一种情况,Web 应用程序同时收到 3 个请求并且必须创建新的用户会话。此会话用于在用户登录时存储通知、XSRF 令牌和登录信息。应用程序使用线程来处理请求(Bottle.py 下的 CherryPy)。
3 个线程(或进程,以防万一或多个应用程序实例)开始处理 3 个请求。他们检查 cookie,不存在会话,并创建一个新的唯一令牌,该令牌存储在 cookie 和 Redis 中。这将同时发生,他们不知道会话是否已经由另一个线程创建,因为所有 3 个令牌都是唯一的。
这些未使用的会话最终会过期,但它并不整洁。这意味着每次客户端同时进行 N 个请求并需要创建一个新会话时,N-1 个会话是无用的。
如果有一个可以用来识别客户端的属性,比如 IP 地址,那会容易很多,但是在这种情况下使用 IP 地址并不安全。此属性可用于在 Redis 中以原子方式存储会话,其他请求只会获取该会话。