当前位置: 首页 > 面试题库 >

Redis作为唯一的原子ID生成器-Web应用程序避免竞争情况的线程安全方法

公冶同
2023-03-14
问题内容

我计划将Redis用作唯一的原子ID生成器。但是,我担心的是,可能会有来自多个浏览器的类似Web请求。我想知道,使以下操作原子化的通常做法是什么?

get id from redis
if id is not found
    insert id as 0 into redis
else
    store the id in a variable
    increase id by one
    store the new id back to redis

如果我使用的是台式机应用程序或移动应用程序,则可以synchronized在Java中使用关键字来避免出现竞争情况。

但是,对于PHP Web应用程序呢?


问题答案:

假设您要生成顺序ID,则可以使用Redis和INCR命令,而不必担心竞争条件。由于Redis(主要是单线程),因此可以确保每个请求都会从中获得其自己的唯一ID。

此外,您不需要检查id密钥的存在/初始化它,因为Redis会为您执行此操作(即,如果INCR不存在,则将首先创建该密钥并将其自动设置为0)。



 类似资料:
  • 问题内容: 在确定文件是否存在时,使用try语句如何避免“竞争条件”? 我之所以这样问是因为高度支持的答案0)(更新:已删除)似乎暗示使用会创造机会,否则这种机会就不会存在。 给出的示例是: 但与以下内容相比,我不了解如何避免出现竞争状况: 调用如何使攻击者能够处理他们无法完成的文件? 问题答案: 比赛条件,当然,你的程序和文件上运行一些其他的代码之间(竞争状态总是需要至少两个平行的进程或线程,看

  • 通常,Vaadin应用程序为应用程序的每个用户界面组件设置一个顺序ID。不幸的是,这些ID对于测试自动化不是很有用,因为它们是动态生成的,并且可能在运行时(每个会话或添加新组件时)发生更改。 对于测试自动化,需要(至少每个应用程序)每个组件的唯一和静态ID。 A) Vaadin的方法[1]能否用于生成测试自动化友好的组件ID? B) Vaadin的或是否可以生成一个自定义CSS样式,该样式以后可能

  • 问题内容: 我有一个多线程程序,在其中创建生成器函数,然后将其传递给新线程。我希望它本质上是共享/全局的,以便每个线程都可以从生成器获取下一个值。 使用这样的生成器是否安全?还是会遇到从多个线程访问共享生成器的问题/情况? 如果不是,是否有更好的方法来解决此问题?我需要可以在列表中循环并为任何线程调用它生成下一个值的东西。 问题答案: 它不是线程安全的;同时调用可能交错,并与局部变量混淆。 常用的

  • 攻击者无时无刻不在准备对你的 Web 应用程序进行攻击,因此提高你的 Web 应用程序的安全性是非常有必要的。幸运的是,来自The Open Web Application Security Project (OWASP) 的有心人已经整理了一份包含了已知安全问题和防御方式的全面的清单。这份清单对于具有安全意识的开发者来说是必读的。由 Padraic Brady 整理的 Survive The D

  • 我只是一个非开发人员,所以我的问题可能非常简单! 我只是在测试Java多线程的东西,这不是真正的代码。我想知道如何在 Java 中同时更新两个成员变量,以防我们希望它们都同步。举个例子: 在这种情况下(当然,想象一下多线程),我希望能够保证对< code>items和< code>itemToStatus的任何读取总是返回相同的结果。 因此,如果代码在< code>itemToStatus.put