我想在 Redis 中设置一些写入约束,并且我正在考虑将这些约束存储在哈希中。
我最初的想法是修改设置命令,以便它们在写入 Redis 之前检查规则。我想这样检查会 super 快。当然,每次更改 Redis 时,这样的方法都需要更多的修改,如果你认为这是关于学校作业的话,我觉得这有点硬核。
第二个想法是 Redis 客户端有两种类型。一个位于 Web 应用程序端(可能是 Web 应用程序的多个实例),另一个位于 Redis 计算机上。基于这个想法来提出我的问题。
与首先检查约束然后写入 Redis 的 1 个客户端相比,2 个客户端(本地和远程)是否会提高性能?或者我应该坚持使用一个客户端来完成这一切(phpredis 或 predis,应用程序基于 PHP,对约束检查进行了一些修改)?
如果我可以尝试 2 个客户端,哪种编程语言更适合实现本地客户端(C、Lua 或其他)?
最佳答案
我不会尝试修改 Redis 行为本身,而是首先尝试在服务器端 Lua 脚本中实现约束(需要 Redis 2.6 分支)。
在执行实际的写入操作之前,Lua EVAL 脚本可以轻松地对已存储在 Redis 中的数据执行一些检查。
这是一个例子。假设我们有两个代表银行账户的 key ,我们需要在账户之间实现安全交易。例如,我们必须检查两个帐户是否都存在以及源帐户是否包含所需的资金。
# 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 开销)并节省一些网络往返次数。但这是以额外的复杂性为代价的。
关于redis - 使用 Redis 拥有本地和远程客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10277740/