2

我想在 Redis 中设置一些写入约束,并且我正在考虑将这些约束存储在哈希中。

我最初的想法是修改 set 命令,以便他们在写入 Redis 之前检查规则。我在想通过这种方式检查会超级快。当然,每次更改 Redis 时,这种方法都需要进行更多修改,如果您认为这是关于学校作业,我会觉得这有点硬核。

第二个想法是有两种类型的 Redis 客户端。一个在 Web 应用程序端(可能是 Web 应用程序的多个实例),一个在 Redis 机器上。基于这个想法来我的问题。

  1. 与首先检查约束然后在 Redis 中写入的 1 个客户端相比,这 2 个客户端(本地和远程)是否会提高性能?或者我应该坚持使用一个客户端来完成这一切(phpredis 或 predis,应用程序在 PHP 上,对约束检查进行了一些修改)?

  2. 如果我可以尝试 2 个客户端,使用哪种编程语言更好地实现本地客户端(C、Lua 或其他)?

4

1 回答 1

2

我不会尝试修改 Redis 行为本身,而是首先尝试在服务器端 Lua 脚本中实现约束(需要 Redis 2.6 分支)。

Lua EVAL 脚本可以在执行实际写入操作之前轻松地对已存储在 Redis 中的数据执行一些检查。

这是一个例子。假设我们有两个代表银行账户的密钥,我们需要实现账户之间的安全交易。例如,我们必须检查两个帐户是否都存在并且源帐户是否包含所需的资金。

# set 2 accounts for John and Bob
set account:john 100
set account:bob 20

# transfer $10 from John to Bob, checking all constraints
eval "if redis.call('exists',KEYS[2])==1 and redis.call('get',KEYS[1])>=ARGV[1] then
         redis.call( 'incrby', KEYS[2], ARGV[1] )
         redis.call( 'incrby', KEYS[1], - ARGV[1] )
         return 1
      else
         error('invalid transaction')
      end" 2 account:john account:bob 10

您可以在以下位置找到有关 Redis 脚本功能的文档: http ://redis.io/commands#scripting (请先查看 EVAL 命令)。

为了回答您最初的问题(如果您不能使用 Redis 2.6),本地客户端会稍微提高性能,因为它可以使用 unix 域套接字连接到 Redis(绕过一些 TCP 开销)并节省一些网络往返。但这是以额外的复杂性为代价的。

于 2012-04-23T10:20:35.273 回答