redis - 使用 Redis 拥有本地和远程客户端

标签 redis

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

我最初的想法是修改设置命令,以便它们在写入 Redis 之前检查规则。我想这样检查会 super 快。当然,每次更改 Redis 时,这样的方法都需要更多的修改,如果你认为这是关于学校作业的话,我觉得这有点硬核。

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

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

  2. 如果我可以尝试 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/

相关文章:

android - 使用 Redis 服务器将数据从 android 发布到 rails

javascript - 向特定用户广播事件(socket.io、redis、node)

mysql - 在循环内使用 sequelize 更新多行

redis - 连接到 Kubernetes Redis 服务时出现 Connection Refused 错误

mysql - Redis如何连接MySQL服务?

php - 将 Redis 用作 PHP session 处理程序时的键前缀......?

redis - 如何在Redis v2.4.6中使Redis从站只读?

java - 我在 redis 中存储了一个用 messagepack 打包的 lua 表,我怎样才能 hget 它并用 java 解压它?

django - 为每个用户检索最相关输出的最佳解决方案(在 Django 或任何后端中)?

database - Redis变慢的原因