在每次访问时,获得一个非随机字段,但是从第一个,第二个,第三个

At each access, get a non-random field, but from the first, second, third

我在 mysql 中有一个 select 和 php,如下所示,我需要每次访问该页面都采用一个字段的值,whats01、whats02、whats03、whats04 ,但不是随机的,而是按顺序的,当你到达最后一个时,回到第一个。 有人有想法吗?

select whats01, whats02, whats03, whats04 from clients

以下是我的解决方法:

  1. 除了 MySQL 数据库外,还向您的应用程序添加一个 Redis 实例。

  2. 在 运行 SQL 查询之前,使用 INCR command 从 Redis 中的特定键获取值。该键中的值是一个 64 位整数值,它以原子方式递增,然后返回。

    INCR mykey
    
  3. 在此SQL 表达式中使用Redis 命令返回的值。它计算 modulus of the 64-bit integer by 4 (or whatever the number of expressions you want to choose from). Add 1, then use this in MySQL's ELT() function 以选择其中一个参数。

    SELECT ELT(MOD(?, 4) + 1, whats01, whats02, whats03, whats04) AS whats_next
    FROM client;
    

这应该创建一个系统,使每个连续的请求递增计数器,并选择相应的列。如果你有很多并发请求,即使你的应用程序在 load-balanced 服务器上有多个实例,它仍然应该工作,因为 Redis 计数器是中央的。每个请求都会得到下一个递增的值。

您可以对单行的 MySQL table 执行类似的操作,但它可能太慢并且会涉及会限制您的流量的行锁。

Redis 足够快以支持高请求率,并且不会锁定 MySQL 中的任何行。