Skip to content

Commit

Permalink
更新 string 类型的命令样式,并对代码示例进行更新和修改
Browse files Browse the repository at this point in the history
  • Loading branch information
huangzworks committed Mar 30, 2012
1 parent 56d4f9c commit bc3043e
Show file tree
Hide file tree
Showing 20 changed files with 303 additions and 244 deletions.
43 changes: 23 additions & 20 deletions string/append.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,36 @@ APPEND

**APPEND key value**

如果\ ``key``\ 已经存在并且是一个字符串,\ `APPEND`_\ 命令将\ ``value``\ 追加到\ ``key``\ 原来的值之后。
如果 ``key`` 已经存在并且是一个字符串, `APPEND`_ 命令将 ``value`` 追加到 ``key`` 原来的值之后。

如果\ ``key``\ 不存在,\ `APPEND`_\ 就简单地将给定\ ``key``\ 设为\ ``value``\ ,就像执行\ ``SET key value``\ 一样。
如果 ``key`` 不存在, `APPEND`_ 就简单地将给定 ``key`` 设为 ``value`` ,就像执行 ``SET key value`` 一样。

**可用版本:**
>= 2.0.0

**时间复杂度:**
平摊复杂度O(1)
平摊O(1)

**返回值:**
追加\ ``value``\ 之后,\ ``key``\ 中字符串的长度。
追加 ``value`` 之后, ``key`` 中字符串的长度。

::

# 情况1:对不存在的 key 执行 APPEND
# 对不存在的 key 执行 APPEND

redis> EXISTS myphone # 确保 myphone 不存在
(integer) 0

redis> APPEND myphone "nokia" # 对不存在的 key 进行 APPEND,等同于 SET myphone "nokia"
(integer) 5 # 字符长度
redis> APPEND myphone "nokia" # 对不存在的 key 进行 APPEND ,等同于 SET myphone "nokia"
(integer) 5 # 字符长度


# 情况2:对字符串进行 APPEND
# 对已存在的字符串进行 APPEND

redis> APPEND myphone " - 1110"
(integer) 12 # 长度从5个字符增加到12个字符
redis> APPEND myphone " - 1110" # 长度从 5 个字符增加到 12 个字符
(integer) 12

redis> GET myphone # 查看整个字符串
redis> GET myphone
"nokia - 1110"

模式:时间序列(Time series)
Expand All @@ -53,20 +56,20 @@ APPEND

这个模式的唯一缺陷是我们只能增长时间序列,而不能对时间序列进行缩短,因为 Redis 目前还没有对字符串进行修剪(tirm)的命令,但是,不管怎么说,这个模式的储存方式还是可以节省下大量的空间。

提示:可以考虑使用 UNIX 时间戳作为时间序列的键名,这样一来,可以避免单个 ``key`` 因为保存过大的时间序列而占用大量内存,另一方面,也可以节省下大量命名空间。
.. note:: 可以考虑使用 UNIX 时间戳作为时间序列的键名,这样一来,可以避免单个 ``key`` 因为保存过大的时间序列而占用大量内存,另一方面,也可以节省下大量命名空间。

下面是一个时间序列的例子:

::

redis> EXISTS mykey
(integer) 0
redis> APPEND ts "0043"
(integer) 4

redis> APPEND mykey "Hello"
(integer) 5
redis> APPEND ts "0035"
(integer) 8

redis> APPEND mykey " World"
(integer) 11
redis> GETRANGE ts 0 3
"0043"

redis> GET mykey
"Hello World"
redis> GETRANGE ts 4 7
"0035"
21 changes: 11 additions & 10 deletions string/decr.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,28 @@ DECR

**DECR key**

\ ``key``\ 中储存的数字值减一。
将 ``key`` 中储存的数字值减一。

如果\ ``key``\ 不存在,\ ``0``\ \ ``key``\ 的初始值,然后执行\ `DECR`_\ 操作。
如果 ``key`` 不存在,那么 ``key`` 的值会先被初始化为 ``0`` ,然后再执行 `DECR`_ 操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在64位(bit)有符号数字表示之内。
本操作的值限制在 64 位(bit)有符号数字表示之内。

关于更多递增(increment)/递减(decrement)操作信息,参见\ `INCR`_\ 命令。
关于递增(increment) / 递减(decrement)操作的更多信息,请参见 `INCR`_ 命令。

**可用版本:**
>= 1.0.0

**时间复杂度:**
O(1)

**返回值:**
执行\ `DECR`_\ 命令之后\ ``key``\ 的值。
执行 `DECR`_ 命令之后 ``key`` 的值。

::

# 情况1:对存在的数字值 key 进行 DECR
# 对存在的数字值 key 进行 DECR

redis> SET failure_times 10
OK
Expand All @@ -32,7 +35,7 @@ DECR
(integer) 9


# 情况2:对不存在的 key 值进行 DECR
# 对不存在的 key 值进行 DECR

redis> EXISTS count
(integer) 0
Expand All @@ -41,12 +44,10 @@ DECR
(integer) -1


# 情况3:对存在但不是数值的 key 进行 DECR
# 对存在但不是数值的 key 进行 DECR

redis> SET company YOUR_CODE_SUCKS.LLC
OK

redis> DECR company
(error) ERR value is not an integer or out of range


20 changes: 10 additions & 10 deletions string/decrby.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,28 @@ DECRBY

**DECRBY key decrement**

\ ``key``\ 所储存的值减去减量\ ``decrement``\
将 ``key`` 所储存的值减去减量 ``decrement`` 。

如果\ ``key``\ 不存在,\ ``0``\ \ ``key``\ 的初始值,然后执行\ `DECRBY`_\ 操作。
如果 ``key`` 不存在,那么 ``key`` 的值会先被初始化为 ``0`` ,然后再执行 `DECRBY`_ 操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在64位(bit)有符号数字表示之内。
本操作的值限制在 64 位(bit)有符号数字表示之内。

关于更多递增(increment)/递减(decrement)操作信息,参见\ `INCR`_\ 命令。
关于更多递增(increment) / 递减(decrement)操作的更多信息,请参见 `INCR`_ 命令。

**可用版本:**
>= 1.0.0

**时间复杂度:**
O(1)

**返回值:**
减去\ ``decrement``\ 之后,\ ``key``\ 的值。
减去 ``decrement`` 之后, ``key`` 的值。

::

# 情况1:对存在的数值 key 进行 DECRBY
# 对已存在的 key 进行 DECRBY

redis> SET count 100
OK
Expand All @@ -32,13 +35,10 @@ DECRBY
(integer) 80

# 情况2:对不存在的 key 进行DECRBY
# 对不存在的 key 进行DECRBY

redis> EXISTS pages
(integer) 0

redis> DECRBY pages 10
(integer) -10



34 changes: 24 additions & 10 deletions string/get.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,42 @@ GET

**GET key**

返回\ ``key``\ 所关联的字符串值。
返回 ``key`` 所关联的字符串值。

如果\ ``key``\ 不存在则返回特殊值\ ``nil``\
如果 ``key`` 不存在则返回特殊值 ``nil`` 。

假如\ ``key``\ 储存的值不是字符串类型,返回一个错误,因为\ `GET`_\ 只能用于处理字符串值。
假如 ``key`` 储存的值不是字符串类型,返回一个错误,因为 `GET`_ 只能用于处理字符串值。

**可用版本:**
>= 1.0.0

**时间复杂度:**
O(1)

**返回值:**
| \ ``key``\ 的值。
| 如果\ ``key``\ 不存在,返回\ ``nil``\
| ``key`` 不存在时,返回 ``nil`` ,否则,返回 ``key`` 的值。
| 如果 ``key`` 不是字符串类型,那么返回一个错误
::

redis> GET fake_key
(nil)
# 对不存在的 key 或字符串类型 key 进行 GET

redis> SET animate "anohana"
redis> GET db
(nil)
redis> SET db redis
OK

redis> GET animate
"anohana"
redis> GET db
"redis"

# 对不是字符串类型的 key 进行 GET

redis> DEL db
(integer) 1

redis> LPUSH db redis mongodb mysql
(integer) 3

redis> GET db
(error) ERR Operation against a key holding the wrong kind of value
14 changes: 8 additions & 6 deletions string/getbit.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,13 @@ GETBIT

**GETBIT key offset**

\ ``key``\ 所储存的字符串值,获取指定偏移量上的位(bit)。
对 ``key`` 所储存的字符串值,获取指定偏移量上的位(bit)。

当 ``offset`` 比字符串值的长度大,或者 ``key`` 不存在时,返回 ``0`` 。

**可用版本:**
>= 2.2.0

\ ``offset``\ 比字符串值的长度大,或者\ ``key``\ 不存在时,返回\ ``0``\

**时间复杂度:**
O(1)

Expand All @@ -17,8 +20,7 @@ GETBIT

::
# 情况1:对不存在的 key 或不存在的 offset 进行 GETBIT,
# 默认为0
# 对不存在的 key 或者不存在的 offset 进行 GETBIT, 返回 0

redis> EXISTS bit
(integer) 0
Expand All @@ -27,7 +29,7 @@ GETBIT
(integer) 0

# 情况2:对已存在的 offset 进行 GETBIT
# 对已存在的 offset 进行 GETBIT

redis> SETBIT bit 10086 1
(integer) 0
Expand Down
29 changes: 16 additions & 13 deletions string/getrange.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,38 +5,41 @@ GETRANGE

**GETRANGE key start end**

返回\ ``key``\ 中字符串值的子字符串,字符串的截取范围由\ ``start``\ \ ``end``\ 两个偏移量决定(包括\ ``start``\ \ ``end``\ 在内)。
返回 ``key`` 中字符串值的子字符串,字符串的截取范围由 ``start`` ``end`` 两个偏移量决定(包括 ``start`` ``end`` 在内)。

负数偏移量表示从字符串最后开始计数,\ ``-1``\ 表示最后一个字符,\ ``-2``\ 表示倒数第二个,以此类推。
负数偏移量表示从字符串最后开始计数, ``-1`` 表示最后一个字符, ``-2`` 表示倒数第二个,以此类推。

\ `GETRANGE`_\ 通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。
`GETRANGE`_ 通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。

.. note::
在 <= 2.0 的版本里,GETRANGE 被叫作 SUBSTR。

**可用版本:**
>= 2.4.0

**时间复杂度:**
| O(N),\ ``N``\ 为要返回的字符串的长度。
| 复杂度最终由返回值长度决定,但因为从已有字符串中建立子字符串的操作非常廉价(cheap),所以对于长度不大的字符串,该操作的复杂度也可看作O(1)。
| O(N), ``N`` 为要返回的字符串的长度。
| 复杂度最终由字符串的返回值长度决定,但因为从已有字符串中取出子字符串的操作非常廉价(cheap),所以对于长度不大的字符串,该操作的复杂度也可看作O(1)。
**返回值:**
截取得出的子字符串。

.. note::
在<=2.0的版本里,GETRANGE 被叫作 SUBSTR。

::

redis> SET greeting "hello, my friend"
OK

redis> GETRANGE greeting 0 4 # 返回索引0-4的字符,包括4。
redis> GETRANGE greeting 0 4 # 返回索引0-4的字符,包括4。
"hello"

redis> GETRANGE greeting -1 -5 # 不支持回绕操作
redis> GETRANGE greeting -1 -5 # 不支持回绕操作
""

redis> GETRANGE greeting -3 -1 # 负数索引
redis> GETRANGE greeting -3 -1 # 负数索引
"end"

redis> GETRANGE greeting 0 -1 # 从第一个到最后一个
redis> GETRANGE greeting 0 -1 # 从第一个到最后一个
"hello, my friend"

redis> GETRANGE greeting 0 1008611 # 值域范围不超过实际字符串,超过部分自动被符略
redis> GETRANGE greeting 0 1008611 # 值域范围不超过实际字符串,超过部分自动被符略
"hello, my friend"
36 changes: 20 additions & 16 deletions string/getset.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,36 +5,42 @@ GETSET

**GETSET key value**

将给定\ ``key``\ 的值设为\ ``value``\ ,并返回\ ``key``\ 的旧值。
将给定 ``key`` 的值设为 ``value`` ,并返回 ``key`` 的旧值(old value)

\ ``key``\ 存在但不是字符串类型时,返回一个错误。
当 ``key`` 存在但不是字符串类型时,返回一个错误。

**可用版本:**
>= 1.0.0

**时间复杂度:**
O(1)

**返回值:**
| 返回给定\ ``key``\ 的旧值(old value)
| \ ``key``\ 没有旧值时,返回\ ``nil``\
| 返回给定 ``key`` 的旧值。
| 当 ``key`` 没有旧值时,也即是, ``key`` 不存在时,返回 ``nil`` 。
::

redis> EXISTS mail
(integer) 0

redis> GETSET mail [email protected] # 因为 mail 之前不存在,没有旧值,返回 nil
redis> GETSET db mongodb # 没有旧值,返回 nil
(nil)

redis> GETSET mail [email protected] # mail 被更新,旧值被返回
"[email protected]"
redis> GET db
"mongodb"

redis> GETSET db redis # 返回旧值 mongodb
"mongodb"

redis> GET db
"redis"

模式
--------

\ `GETSET`_\ 可以和\ `INCR`_\ 组合使用,实现一个有原子性(atomic)复位操作的计数器(counter)。
`GETSET`_ 可以和 `INCR`_ 组合使用,实现一个有原子性(atomic)复位操作的计数器(counter)。

举例来说,每次当某个事件发生时,进程可能对一个名为\ ``mycount``\ \ ``key``\ 调用\ `INCR`_\ 操作,通常我们还要在一个原子时间内同时完成获得计数器的值和将计数器值复位为\ ``0``\ 两个操作。
举例来说,每次当某个事件发生时,进程可能对一个名为 ``mycount`` ``key`` 调用 `INCR`_ 操作,通常我们还要在一个原子时间内同时完成获得计数器的值和将计数器值复位为 ``0`` 两个操作。

可以用命令\ ``GETSET mycounter 0``\ 来实现这一目标。
可以用命令 ``GETSET mycounter 0`` 来实现这一目标。

::
Expand All @@ -44,7 +50,5 @@ GETSET
redis> GETSET mycount 0 # 一个原子内完成 GET mycount 和 SET mycount 0 操作
"11"

redis> GET mycount
redis> GET mycount # 计数器被重置
"0"


Loading

0 comments on commit bc3043e

Please sign in to comment.