跟着Redis入门指南学习
第三章 5种数据类型
3.1 热身
先了解几个比较基础的命令作为热身,打开redis-cli,跟着样例输入命令来体验下:
1.获取符合规范的健名列表
keys pattern
pattern支持glob风格通配符格式,具体规则如下:
符号 | 含义 |
? | 匹配一个字符 |
* | 匹配任意个(包括0个)字符 |
[] | 匹配括号间的任一字符,可以使用“-”符号表示一个范围,如a[b-d]可以匹配"ab","ac","ad" |
\x | 匹配字符x,用于转义符号。如要匹配"?"就需要使用\? |
<span style="font-size:14px;"><span style="font-family: Arial, Helvetica, sans-serif;">127.0.0.1:6379> select 1</span></span>
<span style="font-size:14px;">OK
127.0.0.1:6379[1]> keys *
(empty list or set)</span>
<span style="font-size:14px;">//选择数据库</span>
<span style="font-size:14px;">127.0.0.1:6379[1]> select 0
OK</span>
<span style="font-size:14px;">//keys 命令 由于我的已经添加过健值 所以你的结果可能会和我不一样
127.0.0.1:6379> keys wjq
1) "wjq"
127.0.0.1:6379> keys test*
1) "testRem"
2) "testboard"
3) "testresult"
4) "test1"
5) "test2"</span>
127.0.0.1:6379[1]> set bar 1
OK
127.0.0.1:6379[1]> keys *
1) "bar"
然后使用keys * 就能获取redis中所有的健,当健的数量较多时会影响性能,不建议在生产环境中使用。
<span style="color:#ff0000;">提示:redis</span>不区分命令大小写
exists key
如果健存在则返回整数类型1,否则返回0.如:
127.0.0.1:6379[1]> exists bar
(integer) 1
127.0.0.1:6379[1]> exists noexists
(integer) 0
del key [key ...]
可以删除一个或多个健,返回值是删除的健的个数。如
127.0.0.1:6379[1]> del bar
(integer) 1
127.0.0.1:6379[1]> del bar
(integer) 0
第二次执行del命令时因为bar健已经被删除了,实际上并没有删除任何健,所以返回0.
技巧: del命令的参数不支持通配符,但我们可以结合Linux的管道和xargs命令自己实现删除所有符合规则的健。比如要删除所有以“user:”开头的健,
就可以执行redis-cli keys "user:*"|xargs redis-cli del.另外由于del命令支持多个健值作为参数,
所以可以执行redis-cli del 'redis-cli keys "user:*" '来达到同样的效果,但是性能更好。
4.获取健值的数据类型
type key
type 命令用来获取健值的数据类型,返回值可能是String(字符串类型)、hash(散列类型)、list(列表类型)、set(集合类型)、zset(有序集合类型)。例如:
127.0.0.1:6379[1]> set foo 1
OK
127.0.0.1:6379[1]> type foo
string
127.0.0.1:6379[1]> lpush bar 1
(integer) 1
127.0.0.1:6379[1]> type bar
list
lpush 命令的作用是向指定的列表类型健中增加一个元素,如果健不存在则创建它,3.4节会详细介绍。
3.2 字符串类型
3.2.2 命令
1.赋值与取值
set key value
get key
set 和get 是redis中最简单的两个命令,他们实现的功能和编程语言中的读写变量相似,如key = “hello”在redis中是这样表示的:
127.0.0.1:6379[1]> set key hello
OK
127.0.0.1:6379[1]> get key
"hello"
当健不存在时会返回空结果。
2.递增数字
incr key
前面说过字符串类型可以存储任何形式的字符串,当存储的字符串是整数形式时,redis提供了一个使用的命令incr,其作用是让当前健值递增,用法为:
127.0.0.1:6379[1]> incr num
(integer) 1
127.0.0.1:6379[1]> incr num
(integer) 2
127.0.0.1:6379[1]> set foo test
OK
127.0.0.1:6379[1]> incr foo
(error) ERR value is not an integer or out of range
def incr($key)
$value = get $key
if not $value
$value = 0
$value = $value + 1
set $key, $value
return $value
若果redis同时只连接一个客户端,那么上面的代码没有任何问题(其实还没有加入错误处理)。但当同一时间有多个客户端连接到redis时则有可能出现竞态条件(race condition)。我们需要保证incr在内的所有redis命令都是原子操作(atomic operation)无论多少个客户端同时连接,都能保证正确,后面会介绍利用事务和脚本来实现自定义的原子操作的方法。
提示:redis对于健名的比较好的建议:“对象类型:对象ID:对象属性”来命名一个健,如user:1:friends 来存储ID为1的用户的好友列表。
3.2.4 命令拾遗
1.增加指定的整数
incrby key increment
incrby命令与incr命令基本一样,只不过前者可以通过increment参数指定一次增加的数值,如:
127.0.0.1:6379[1]> incrby num 2
(integer) 4
127.0.0.1:6379[1]> incrby num 3
(integer) 7
2.减少指定的整数
decr key
decrby key decrement
decr
命令与incr命令用法相同,decrby与incrby用法相同
127.0.0.1:6379[1]> decr num
(integer) 6
127.0.0.1:6379[1]> decrby num 3
(integer) 3
incrbyfloat key increment
127.0.0.1:6379[1]> incrbyfloat num 2.4
"5.4"
127.0.0.1:6379[1]> incrbyfloat num 5e+3
"5005.39999999999999991"
4.向尾部追加值
append key value
append作用是向健值的末尾追加value,即相当于set key value.返回值是追加后字符串的总长度。如:
127.0.0.1:6379[1]> set mytest hello
OK
127.0.0.1:6379[1]> append mytest " world!"
(integer) 12
127.0.0.1:6379[1]> get mytest
"hello world!"
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">append 命令的第二个参数加了双引号,因为该参数包含空格,在redis-cli中输入需要双引号以示区分。</span>
5.获取字符串长度
strlen key
strlen 命令返回健值的长度,如果健不存在则返回0.例如:
127.0.0.1:6379[1]> strlen mytest
(integer) 12
127.0.0.1:6379[1]> set key 你好
OK
127.0.0.1:6379[1]> strlen key
(integer) 6
字符串类型用存储二进制数据,所以它可以存储什么编码的字符串。例子中redis接收到的是使用utf-8编码的中文,
由于你好在UTF-8编码的长度都是3,所以返回6.
6.同事获取/设置多个健值
mget key [key ...]
mset key value [key value ...]
127.0.0.1:6379[1]> mset key1 v1 key2 v2 key3 v3
OK
127.0.0.1:6379[1]> mget key1 key3
1) "v1"
2) "v3"
127.0.0.1:6379[1]> mget key1 key4
1) "v1"
2) (nil)
7.位操作
getbit key offset
setbit key offset value
bitcount key [start] [end]
bitop operation destkey key [key ...]
一个字节有8个二进制组成,redis提供了4个命令可以直接对二进制位进行操作,为了演示,我们首先将foo健值赋值为bar:
127.0.0.1:6379[1]> set foo bar
OK
127.0.0.1:6379[1]> getbit foo 0
(integer) 0
127.0.0.1:6379[1]> getbit foo 6
(integer) 1
127.0.0.1:6379[1]> getbit foo 100000
(integer) 0
bar的3个字母对应的ascii码分别为98、97、114,转换成二进制后分别为011000010、0110000、01110010.
getbit命名可以获取一个字符串类型健指定位置的二进制的值(0或1),索引从0开始。
如果需要获取的二进制位的索引超出了健值的二进制位的实际长度则默认位值是0.
127.0.0.1:6379[1]> setbit foo 6 0
(integer) 1
127.0.0.1:6379[1]> setbit foo 7 1
(integer) 0
127.0.0.1:6379[1]> get foo
"aar"
setbit 命令可以设置字符串类型健指定位置的二进制位的值,返回的是该位置的旧值。如上。
如果要设置的位置超过了健值的二进制的长度,setbit命令会自动将中的二进制位设置为0.同理设置一个不存在的健的指定二进制位的值会自动将其前面的位位置为0:
127.0.0.1:6379[1]> setbit nofoo 10 1
(integer) 0
127.0.0.1:6379[1]> get nofoo
"\x00 "
127.0.0.1:6379[1]> getbit nofoo 5
(integer) 0
127.0.0.1:6379[1]> getbit nofoo 10
(integer) 1
bitcount命令可以获得字符串类型健中值是1的二进制位个数,例如:
127.0.0.1:6379[1]> bitcount foo
(integer) 10
127.0.0.1:6379[1]> bitcount foo 0 1
(integer) 6
127.0.0.1:6379[1]> bitcount foo 0
(error) ERR syntax error
127.0.0.1:6379[1]> bitcount foo 0 0
(integer) 3
bitop命令可以对多个字符串类型健值进行位运算,并将结果存储在destkey参数指定的健中。bitop命令支持的位运算有and or xor和
not。如我们可以对bar 和arr 进行or运算:
127.0.0.1:6379[1]> set foo1 bar
OK
127.0.0.1:6379[1]> set foo2 arr
OK
127.0.0.1:6379[1]> bitop or res foo1 foo2
(integer) 3
127.0.0.1:6379[1]> get res
"csr"
利用位操作命令可以非常紧凑的存储布尔值。