background image
我们自己能用以下简单的命令实现这个功能:
x = GET foo
x = x + 1
SET foo x
问题在于要使上面的操作正常进行,同时只能有一个客户端操作
x 的值。看看如果两台电脑
同时操作这个值会发生什么:
x = GET foo (返回 10)
y = GET foo (返回 10)
x = x + 1 (x 现在是 11)
y = y + 1 (y 现在是 11)
SET foo x (foo 现在是 11)
SET foo y (foo 现在是 11)
问题发生了!我们增加了值两次,本应该从
10 变成 12,现在却停留在了 11。这是因为用
GET 和 SET 来实现 INCR 不是一个原子操作(atomic operation)。
所以
Redis\memcached 之类提供了一个原子的 INCR 命令,服务器会保护
get-increment-set 操作,以防止同时的操作。
Redis 与众不同的是它提供了更多类似 INCR 的方案,用于解决模型复杂的问题。
因此你可以不使用任何
SQL 数据库、仅用 Redis 写一个完整的 web 应用,而不至于抓狂。
超越
Ke-Value 数据库
本节我们会看到构建一个
Twitter 克隆所需 Redis 的功能。首先需要知道的是,Redis 的值
不仅仅可以是字符串
(String)。