每天了解些redis的基本命令,将这些命令写在博客上,经常查看避免一段时间不用忘记。

1、 append key value
用法:key只能是string类型的,在key的value后面再加命令输入的value值。当key不存在的时候,新建一个,跟set一致。
返回值:key对应value的长度
Eg:

redis> EXISTS mykey
(integer) 0
redis> APPEND mykey "Hello"
(integer) 5
redis> APPEND mykey " World"
(integer) 11
redis> GET mykey
"Hello World"
redis>

2、 bgrewriteaof
功能:发消息通知备份进程立即做备份操作(AOF备份)。
返回值:一直都是成功的。打印Background append only file rewriting started.

3、 bgsave
功能:redis数据导出到物理盘,redis会fork个子进程做存盘工作,子进程做完存盘工作后就退出。客户端可以可以通过lastsave命令来查看是否执行成功。
返回值:Background saving started.

4、 bitcount key [start end]
功能:计算一个string类型的值中bit为1的个数,当后面没有加[start end]的时候计算整个value的所有位,当加上[start end]的时候只计算该范围为string中从start到end之间bit为1的个数。Start和end为正数的时候从左往右开始计算,反之从右往左计算字符的位置。
返回值:bit为1的个数,如果key值不存在返回0。

5、 bitfield key [get type offset] [set type offset value] [incrby type offset increment] [overflow wrap|sat|fail]
起始版本:3.2.0 时间复杂度:O(1)
功能:本命令会把redis字符串当做位数组,并能对变成位宽和任意为字节对齐的指定位域进行寻址。提供有保证、可配置的上溢和下溢操作。同时bitfield命令操作多字节位域,它会执行一系列操作,并返回一个响应数组,在参数类别中每个响应数组匹配相应的操作。
支持的原子命令:
1) get -返回指定的位域
2) set -设置指定位域的值并返回它原值
3) incrby –自增或自减(如果increment为负数)指定位域值并返回它的新值
4) overflow [wrap|sat|fail] 配合incrby使用
支持的整形:当需要一个整型时,有符号整形需在位数前加i,无符号在位数前加u.例如,u8是一个8位的无符号整形,i16是一个16位的有符号整形。有符号整形最大支持64位,二无符号整形最大支持63位,对无符号整形的限制,是由于当前redis协议不能再响应消息中返回无符号整数。
位和位偏移:bitfield命令有两种方式来指定位偏移。如果未带数字前缀(加0)将会以字符串的第0位作为起始位。如果偏移量带#前缀,那么指定的偏移量除以整形宽度。

Redis> get testkey
“111111”
Redis>bitfield testkey set i8 0 51
1)(interger)49
Redis>get testkey
“311111”
Redis>bitfield testkey set i8 #2 51
1)  (interger) 49
Redis>get testkey
“313111”

溢出控制:使用overflow命令,用户可以通过指定下列其中一种行为为调整自增或自减操作溢出(或下溢)后的行为:
1>wrap:回环算法,适用于有符号和无符号整型两种类型。对于无符号整型,回环计算将对整型最大值进行取模操作。对于有符号整形,上溢出最负数开始取数,下溢则从最爱正数开始取数,例如i8整型值设为127,自加1后值变为-128
2>sat:饱和算法,下溢后设为最小的整型值,上溢后设为最大的整型值。例如i8整型值从120加上10后,结果为127
3>fail:失败算法,当发生上溢或者下溢时,会返回失败。
注意每种溢出(overflow)控制方法,仅影响紧跟在incrby命令后的子目录,直到从新指出新的overflow。在没有指出溢出控制方法的时候,默认使用wrap。
返回值:该命令各个子命令返回值逐个返回,结果依次排列。
设计动机:本命令的动机是为了能够在单个大位图中存储多个小整数。

6、 bitop operation destkey key [key …]
起始版本:2.6.0
时间复杂度:O(N)
功能:对一个或者多个保存二进制的字符串key进行位元操作,并将结果保存到destkey上。其中bitop支持and、or、not、xor这四种操作中的任意一种草书:
例子:
1>bitop and destkey srckey1 srckey2 … srckeyN 对一个或多个key求逻辑并,并将结果保存到destkey。
2>bitop or destkey srckey1 srckey2 srckey3 … srckeyN 对一个或多个key求逻辑或,并将结果保存到destkey
3>bitop xor destkey srckey1 srckey2 srckey3 … srckeyN 对一个或多个key求逻辑异或,并将结果保存到destkey
4>bitop not destkey srckey 对给定key求逻辑非,并将结果保存到destkey。
处理不同长度的字符串:当bitop 处理不同长度字符串时,较短的那个字符串缺少的部分会被当做0处理,空的key也被看做包含0的字符串序列。
返回值:保存到destkey的字符串的长度,和输入key中最大长的字符串相等。
性能:
当key对应的字符串比较长的时候,要注意一下性能问题。考虑将对应的操作放到客户端做。

7、 bitpos key bit [start] [end]
起始版本:2.8.7
时间复杂度:O(N)
功能:返回字符串里面第一个被设置为1或者0的bit位。返回一个位置,把字符串当做一个从左到右的字节数组,第一个符合条件的在位置0,第二个为8。默认情况下整个字符串都会被检索一次,只有在指定start和end参数,该范围被介绍为一个字节的范围,而不是一系列的位,所以start=0并且end=2是指前三个字节范围内查找。字节位置整数表示从字符串左到右的偏移,负数表示字符串从右到做的偏移。注意,返回位置始终是从0开始的,即使使用start来指定第一个开始字节也是一样。
返回值:命令返回字符串里第一个被设置为1或者0的bit位。如果我们在空串或者零字节长度的字符串里边查找bit为1的内容,结果将返回-1.可以将空串看出右边有无数个0.如果在指定的start和end范围进行查找指定值时,如果该范围内无指定的值,结果将返回-1。
例子:

redis> SET mykey "\xff\xf0\x00"
OK
redis> BITPOS mykey 0 # 查找字符串里面bit值为0的位置
(integer) 12
redis> SET mykey "\x00\xff\xf0"
OK
redis> BITPOS mykey 1 0 # 查找字符串里面bit值为1从第0个字节开始的位置
(integer) 8
redis> BITPOS mykey 1 2 # 查找字符串里面bit值为1从第2个字节(12)开始的位置
(integer) 16
redis> set mykey "\x00\x00\x00"
OK
redis> BITPOS mykey 1 # 查找字符串里面bit值为1的位置
(integer) -1
redis>

8、 blpop key [key …] timeout
起始版本:2.0.0
功能:从多个链表中弹出一个列表头元素,blpop是阻塞列表的弹出原语。它是lpop的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被blpop命令阻塞。当给定多个key参数是,按参数key的先后顺序依次检查各个列表,弹出第一个非空表的头元素。Timeout参数表示阻塞的最大秒数的整型值,当timeout为0的时候表示阻塞时间无限制。
当客户端为多个 key 尝试阻塞的时候,若至少存在一个 key 拥有元素,那么返回的键值对(key/element pair)就是从左到右数第一个拥有一个或多个元素的key。 在这种情况下客户端不会被阻塞。比如对于这个例子 BLPOP key1 key2 key3 key4 0,假设 key2 和 key4 都非空, 那么就会返回 key2 里的一个元素。
当多个客户端为同一个 key 阻塞的时候,第一个被处理的客户端是等待最长时间的那个(即第一个因为该key而阻塞的客户端)。 一旦一个客户端解除阻塞那么它就不会保持任何优先级,当它因为下一个 BLPOP 命令而再次被阻塞的时候,会在处理完那些 被同个 key 阻塞的客户端后才处理它(即从第一个被阻塞的处理到最后一个被阻塞的)。
当一个客户端同时被多个 key 阻塞时,若多个 key 的元素同时可用(可能是因为事务或者某个Lua脚本向多个list添加元素), 那么客户端会解除阻塞,并使用第一个接收到 push 操作的 key(假设它拥有足够的元素为我们的客户端服务,因为有可能存在其他客户端同样是被这个key阻塞着)。 从根本上来说,在执行完每个命令之后,Redis 会把一个所有 key 都获得数据并且至少使一个客户端阻塞了的 list 运行一次。 这个 list 按照新数据的接收时间进行整理,即是从第一个接收数据的 key 到最后一个。在处理每个 key 的时候,只要这个 key 里有元素, Redis就会对所有等待这个key的客户端按照“先进先出”(FIFO)的顺序进行服务。若这个 key 是空的,或者没有客户端在等待这个 key, 那么将会去处理下一个从之前的命令或事务或脚本中获得新数据的 key,如此等等。
注意:2.4版本和2.6版本以后版本的差异。禁止在multi/exec事务中使用。因为为了保证其原子性,如果发生阻塞,将阻塞到timeout时间,且该时间段内redis不执行其他命令。
返回值:
1> 当没有元素的时候会弹出一个nil的多批量值,并且timeout过期。
2> 当有元素时会返回一个双元素的多批量值,其中第一个元素是弹出元素的key,第二个元素是value

9、 brpop key [key …] timeout
起始版本:2.0.0
功能:brpop是一个阻塞的列表弹出原语,它是rpop的阻塞版本,因为这个命令会在给定list无法弹出如何元素的时候阻塞连接。该命令会按照给出的key顺序查看list,并在找到第一个非空list的尾部弹出一个元素。起注意点和blpop一致
返回值:
1>当没有元素的时候会弹出一个nil的多批量值,并且timeout过期。
2>当有元素时会返回一个双元素的多批量值,其中第一个元素是弹出元素的key,第二个元素是value
例子:

redis> DEL list1 list2
(integer) 0
redis> RPUSH list1 a b c
(integer) 3
redis> BRPOP list1 list2 0
1) "list1"
2) "c"

10、 brpoplpush source destination timeout
起始版本:2.2.0
功能:brpoplpush是rpoplpush的阻塞版本。当source包含元素的时候,该命令表现的跟rpoplpush一模一样。当source是空的时候,redis将会阻塞这个连接,直到另一个客户端push插入或者达到timeout时间,timeout为零则无期限阻塞客户端。注意,所有阻塞的操作都禁止在事务中使用。
返回值:
Nil表示timeout否则ok