我想在Redis中设置一些写约束,我想将这些约束存储在哈希中。
我最初的想法是修改set命令,以便在用Redis编写之前检查规则。我想通过这种方式检查会非常快。当然,每次更改Redis时,这种方法都需要进行更多修改,如果您认为它是关于学校作业的话,我会发现有点硬核。
第二个想法是有两种类型的Redis客户端。一个在Web应用程序端(可能是Web应用程序的多个实例),另一个在Redis机器上。基于这个想法来问我的问题。
2个客户端(本地和远程)是否会在首先检查约束然后在Redis中写入的1个客户端的比较中提高性能?或者我应该坚持一个完成所有工作的客户端(phpredis或predis,应用程序在PHP上,对约束检查进行一些修改)?
如果我可以尝试2个客户端,哪种编程语言可以更好地实现本地客户端(C,Lua或其他)?
答案 0 :(得分: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开销)并保存一些网络往返。但这是以额外复杂性为代价的。