set、get、setex、setnx
set:设置一个key的value值。
get:获取一个key的value值。
setex:设置一个key的value值,并指定失效时间。
setnx:当key不存在的时候,设置一个key的value值。key存在设置失败。
127.0.0.1:6379> set name xupeng
OK
127.0.0.1:6379> get name
"xupeng"
127.0.0.1:6379> setnx name zhuang
(integer) 0
127.0.0.1:6379> get name
"xupeng"
127.0.0.1:6379> setnx addr Jinan
(integer) 1
127.0.0.1:6379> get addr
"Jinan"
127.0.0.1:6379> setex memory 10 fish
OK
127.0.0.1:6379> ttl memory
(integer) 5
127.0.0.1:6379> ttl memory
(integer) -2
127.0.0.1:6379>
位图
在日常的工作开发中,会涉及到一些bool类型的数据存取,比如用户一年的签到记录,已签到是1,未签到是0。记录一年365年,如果使用普通的key/value,当用户数量非常庞大的时候,需要的存储空间是惊人的。
Redis中提供的位图数据结构可以解决这个问题,这样每个用户每天的签到记录只占一个位,365天就是365个位,46个字节就可以容纳下。
位图并不是特殊的数据结构,它的内容其实就是普通的字符串,也就是byte数组。我们可以使用get/set来获取整个位图的内容,也可以使用getbit/setbit等将byte数组看成位数组进行处理。
基本使用:setbit、getbit
目的:使用位操作将字符串设置为 hello。
首先,获取每个字符的ASCII码的二进制值。
h:01101000
e:01100101
l:01101100
l:01101100
o:01101111
setbit:设置key的value(string)在offset处的bit值。
getbit:返回key对应的string在offset处的bit值。
(只需要设置为1的位)
127.0.0.1:6379> setbit s 1 1
(integer) 0
127.0.0.1:6379> setbit s 2 1
(integer) 0
127.0.0.1:6379> setbit s 4 1
(integer) 0
127.0.0.1:6379> get s
"h"
127.0.0.1:6379> setbit s 9 1
(integer) 0
127.0.0.1:6379> setbit s 10 1
(integer) 0
127.0.0.1:6379> setbit s 13 1
(integer) 0
127.0.0.1:6379> setbit s 15 1
(integer) 0
127.0.0.1:6379> get s
"he"
127.0.0.1:6379> setbit s 17 1
(integer) 0
127.0.0.1:6379> setbit s 18 1
(integer) 0
127.0.0.1:6379> setbit s 20 1
(integer) 0
127.0.0.1:6379> setbit s 21 1
(integer) 0
127.0.0.1:6379> get s
"hel"
127.0.0.1:6379>
127.0.0.1:6379> getbit s 0
(integer) 0
127.0.0.1:6379> getbit s 1
(integer) 1
127.0.0.1:6379> getbit s 2
(integer) 1
127.0.0.1:6379> getbit s 4
(integer) 1
127.0.0.1:6379>
统计和查找:bitcount、bitpos
bitcount:统计字符串被设置为1的bit数
127.0.0.1:6379> set s hello
OK
127.0.0.1:6379> get s
"hello"
127.0.0.1:6379> bitcount s
(integer) 21
127.0.0.1:6379>
bitpos:返回字符串里面第一个被设置为1或者0的bit位。
127.0.0.1:6379> setbit s 1 1
(integer) 0
127.0.0.1:6379> setbit s 2 1
(integer) 0
127.0.0.1:6379> setbit s 4 1
(integer) 0
127.0.0.1:6379> get s
"h"
127.0.0.1:6379> bitpos s 0
(integer) 0
127.0.0.1:6379> bitpos s 1
(integer) 1
127.0.0.1:6379>
bitpos可以指定start和end范围进行查找。
比如hello的二进制为01101000 01100101 01101100 01101100 01101111
1,从第三个字符开始,获取hello第一个被设置为0的bit位。
127.0.0.1:6379> set s hello
OK
127.0.0.1:6379> bitpos s 0 2
(integer) 16
2,从第三个字符开始,获取hello第一个被设置为1的bit位.
127.0.0.1:6379> set s hello
OK
127.0.0.1:6379> bitpos s 1 2
(integer) 17
127.0.0.1:6379>
参考《Redis深度历险 核心原理与应用实践》钱文品/著