Redis入门:数据类型及操作命令
Redis现在支持以下几种数据类型:
- 字符串
- 列表
- 集合
- 排序集合
- 哈希
- Bitmap
- HyperLogLog
- Stream
针对不同的数据类型,还有不同的操作命令。
1 KEY设置规则
Redis的键原则上可以使用任何字符串,但是在使用的时候,还是有一些建议规则:
- 1.key最好不要太长。
- 2.key也不要太短。
- 3.使用正确的模式。
- 4.key最大为512M。
2 STRING
String类型是Redis中的基本数据类型。Redis中的key是字符串类型的,value也可以是字符串类型,其实就是用一个字符串去表示另一个字符串。
2.1 操作命令
2.1.1 keys
keys [pattern]:查询当前的存储空间中,所有存在的key值。
例如:
代码语言:javascript复制127.0.0.1:6379> keys *
(empty list or set)
2.1.2 set
set [key] [value]:设置存储的key-value结构的数据,value是字符串;覆盖已经存在的key-value数据。
例如:
代码语言:javascript复制127.0.0.1:6379> set city beijing
OK
127.0.0.1:6379> keys *
1) "city"
127.0.0.1:6379> set city shanghai
OK
127.0.0.1:6379> keys *
1) "city"
127.0.0.1:6379> get city
"shanghai"
127.0.0.1:6379> set city beijing
OK
127.0.0.1:6379> get city
"beijing"
2.1.3 get
get [key]:获取当前key对应的value数据。
例如:
代码语言:javascript复制127.0.0.1:6379> set name xiao
OK
127.0.0.1:6379> get name
"xiao"
2.1.4 select
select [整数值默认0-15]:redis存在默认的0-15号的数据分库,即16个数据库。默认使用0号,功能现在不常用。是早期的遗留功能,java代码不支持分库的api。
例如:
代码语言:javascript复制127.0.0.1:6379> keys *
1) "city"
2) "name"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
2.1.5 exists
exists [key]:查看当前redis节点是否包含查询的key-value数据,返回1表示存在,返回0表示不存在。
redis存储的字符串类型数据value达到最大值512m;get命令判断key的存在会占用读取value过程的资源,效率低。
例如:
代码语言:javascript复制127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists nil
(integer) 0
2.1.6 del
del [key]:删除当前存储的key-value数据。返回1表示删除成功,返回0表示删除不成功。
例如:
代码语言:javascript复制127.0.0.1:6379> keys *
1) "city"
2) "name"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> keys *
1) "city"
2.1.7 type
type [key]:查看当前key对应的value的数据类型。
例如:
代码语言:javascript复制127.0.0.1:6379> type city
string
2.1.8 help
help [命令名称]:查询当前命令的使用规则。
例如:
代码语言:javascript复制127.0.0.1:6379> help set
SET key value [EX seconds] [PX milliseconds] [NX|XX]
summary: Set the string value of a key
since: 1.0.0
group: string
注意:help的返回内容不全面;真正需要查询某个命令的使用规则,可以到官网查询。
2.1.9 flushall
flushall:将当前的数据库[0-15]的所有数据,flush到指定的持久化文件中(dump.rbd);可以代替清空当前数据库的key-value数据的功能。
例如:
代码语言:javascript复制127.0.0.1:6379> set name xiao
OK
127.0.0.1:6379> set gender male
OK
127.0.0.1:6379> keys *
1) "city"
2) "gender"
3) "name"
127.0.0.1:6379> flushall
4599:M 23 Feb 11:23:35.394 * DB saved on disk
OK
127.0.0.1:6379> keys *
(empty list or set)
2.1.10 flushdb
flushdb:指定清空或者flush当前数据库的数据到磁盘文件中。
例如:
代码语言:javascript复制127.0.0.1:6379> set name xiao
OK
127.0.0.1:6379> set city beijing
OK
127.0.0.1:6379> keys *
1) "city"
2) "name"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> set name xiao
OK
127.0.0.1:6379[1]> set city beijing
OK
127.0.0.1:6379[1]> flushdb
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "city"
2) "name"
2.1.11 incr/decr
incr decr 自增,自减:对于字符串纯数字的数据可以进行自增和自减操作。
例如:
代码语言:javascript复制127.0.0.1:6379> set num1 100
OK
127.0.0.1:6379> incr num1
(integer) 101
127.0.0.1:6379> type num1
string
127.0.0.1:6379> set num2 oo100
OK
127.0.0.1:6379> incr num2
(error) ERR value is not an integer or out of range
127.0.0.1:6379> decr num1
(integer) 100
2.1.12 incrby/decrby
incrby [key] [整数] decrby [key] [整数]:自增自减指定数量的值。
例如:
代码语言:javascript复制127.0.0.1:6379> incrby num1 5
(integer) 105
127.0.0.1:6379> decrby num1 50
(integer) 55
自增自减的使用情景:内存数据库的计算需要消耗资源,上线人数:50399,数字是时刻跳动的,不会一个一个添加或者减少。
2.1.13 apend
apend [key] [value]:在指定key的value上追加数据。
例如:
代码语言:javascript复制127.0.0.1:6379> append city daxing
(integer) 13
127.0.0.1:6379> get city
"beijingdaxing"
2.1.14 mset/mget
mset mget:设置一批key-value和获取一批key对应的value值。
例如:
代码语言:javascript复制127.0.0.1:6379> mset num01 100 num02 200 num03 300
OK
127.0.0.1:6379> keys *
1) "num01"
2) "num02"
3) "num03"
4) "num2"
5) "city"
6) "name"
7) "num1"
127.0.0.1:6379> mget num01 num02 num03 num2 city
1) "100"
2) "200"
3) "300"
4) "oo100"
5) "beijingdaxing"
也是redis早期版本的遗留功能,不支持jedis的分片计算,java代码无法操作和使用。
2.1.15 expire ttl
expire [key] 时间数字(单位秒):设置当前key-value数据的存活时间,配合ttl的命令可以查看剩余的寿命。
寿命是整数-2代表超时,大于0代表存活描述,永久存活的值是-1。
例如:
代码语言:javascript复制127.0.0.1:6379> expire bomb 100
(integer) 1
127.0.0.1:6379> ttl bomb
(integer) 93
127.0.0.1:6379> set bomb c4
OK
127.0.0.1:6379> expire bomb 100
(integer) 1
127.0.0.1:6379> ttl bomb
(integer) 93
127.0.0.1:6379> ttl bomb
(integer) 88
127.0.0.1:6379> set bomb2 c5
OK
127.0.0.1:6379> expire bomb2 10
(integer) 1
127.0.0.1:6379> ttl bomb2
(integer) 7
127.0.0.1:6379> ttl bomb2
(integer) 2
127.0.0.1:6379> ttl bomb2
(integer) 0
127.0.0.1:6379> ttl bomb2
(integer) -2
127.0.0.1:6379> ttl bomb2
(integer) -2
127.0.0.1:6379> ttl name
(integer) -1
127.0.0.1:6379> keys *
1) "num01"
2) "num03"
3) "city"
4) "num1"
5) "num02"
6) "num2"
7) "name"
127.0.0.1:6379> ttl num1
(integer) -1
使用场景:可以作为抢单、秒杀的倒计时;如果单位是秒的话不够精确,至少要毫秒。
2.1.16 pexpire
pexpire [key]:时间整数[毫秒]。
例如:
代码语言:javascript复制127.0.0.1:6379> pexpire bomb3 15000
(integer) 1
127.0.0.1:6379> ttl bomb3
(integer) 11
3 LIST
Redis的List是通过链表实现的。能够以非常快速的方式将元素添加到非常长的列表中。
3.1 操作命令
3.1.1 lrange
查看list。起始位置start,结束位置stop,分别对应的是元素的下标。如果stop=-1展示从start位置到结束的所有元素。
代码语言:javascript复制redis 127.0.0.1:6379> lrange mylist3 0 -1
3.1.2 lpush
LPUSH:在key对应list的头部添加字符串元素(上为头,下为尾)。
代码语言:javascript复制redis 127.0.0.1:6379> lpush mylist "world"
(integer) 1
redis 127.0.0.1:6379> lpush mylist "hello"
(integer) 2
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
3.1.3 rpush
RPUSH:在key对应list的尾部添加字符串元素。
代码语言:javascript复制redis 127.0.0.1:6379> rpush mylist2 "hello"
(integer) 1
redis 127.0.0.1:6379> rpush mylist2 "world"
(integer) 2
redis 127.0.0.1:6379> lrange mylist2 0 -1
1) "hello"
2) "world"
3.1.4 linsert
linsert:在key对应list的特定位置之前或之后添加字符串元素。
代码语言:javascript复制redis 127.0.0.1:6379> rpush mylist3 "hello"
(integer) 1
redis 127.0.0.1:6379> rpush mylist3 "world"
(integer) 2
redis 127.0.0.1:6379> linsert mylist3 before "world" "there"
(integer) 3
redis 127.0.0.1:6379> lrange mylist3 0 -1
1) "hello"
2) "there"
3) "world"
3.1.5 lset
lset:设置list中指定下标的元素值。
代码语言:javascript复制redis 127.0.0.1:6379> rpush mylist4 "one"
(integer) 1
redis 127.0.0.1:6379> rpush mylist4 "two"
(integer) 2
redis 127.0.0.1:6379> rpush mylist4 "three"
(integer) 3
redis 127.0.0.1:6379> lset mylist4 0 "four"
OK
redis 127.0.0.1:6379> lset mylist4 -2 "five" 倒数第二
OK
redis 127.0.0.1:6379> lrange mylist4 0 -1
1) "four"
2) "five"
3) "three"
3.1.6 lrem
lrem:从key对应list中删除count个和value相同的元素。
count>0时,按从头到尾(上到下)的顺序删除。
代码语言:javascript复制redis 127.0.0.1:6379> rpush mylist5 "hello"
(integer) 1
redis 127.0.0.1:6379> rpush mylist5 "hello"
(integer) 2
redis 127.0.0.1:6379> rpush mylist5 "foo"
(integer) 3
redis 127.0.0.1:6379> rpush mylist5 "hello"
(integer) 4
redis 127.0.0.1:6379> lrem mylist5 2 "hello"
(integer) 2
redis 127.0.0.1:6379> lrange mylist5 0 -1
1) "foo"
2) "hello"
redis 127.0.0.1:6379>
count<0时,按从尾到头(下到上)的顺序删除。
代码语言:javascript复制redis 127.0.0.1:6379> rpush mylist6 "hello"
(integer) 1
redis 127.0.0.1:6379> rpush mylist6 "hello"
(integer) 2
redis 127.0.0.1:6379> rpush mylist6 "foo"
(integer) 3
redis 127.0.0.1:6379> rpush mylist6 "hello"
(integer) 4
redis 127.0.0.1:6379> lrem mylist6 -2 "hello"
(integer) 2
redis 127.0.0.1:6379> lrange mylist6 0 -1
1) "hello"
2) "foo"
redis 127.0.0.1:6379>
count=0时,删除全部。
代码语言:javascript复制redis 127.0.0.1:6379> rpush mylist7 "hello"
(integer) 1
redis 127.0.0.1:6379> rpush mylist7 "hello"
(integer) 2
redis 127.0.0.1:6379> rpush mylist7 "foo"
(integer) 3
redis 127.0.0.1:6379> rpush mylist7 "hello"
(integer) 4
redis 127.0.0.1:6379> lrem mylist7 0 "hello"
(integer) 3
redis 127.0.0.1:6379> lrange mylist7 0 -1
1) "foo"
redis 127.0.0.1:6379>
3.1.7 ltrim
保留指定key 的值范围内的数据。
代码语言:javascript复制redis 127.0.0.1:6379> rpush mylist8 "one"
(integer) 1
redis 127.0.0.1:6379> rpush mylist8 "two"
(integer) 2
redis 127.0.0.1:6379> rpush mylist8 "three"
(integer) 3
redis 127.0.0.1:6379> rpush mylist8 "four"
(integer) 4
redis 127.0.0.1:6379> ltrim mylist8 1 -1
OK
redis 127.0.0.1:6379> lrange mylist8 0 -1
1) "two"
2) "three"
3) "four"
redis 127.0.0.1:6379>
3.1.8 lpop
从list的头部删除元素,并返回删除元素。
代码语言:javascript复制redis 127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
redis 127.0.0.1:6379> lpop mylist
"hello"
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "world"
redis 127.0.0.1:6379>
3.1.9 rpop
从list的尾部删除元素,并返回删除元素。
代码语言:javascript复制redis 127.0.0.1:6379> lrange mylist2 0 -1
1) "hello"
2) "world"
redis 127.0.0.1:6379> rpop mylist2
"world"
redis 127.0.0.1:6379> lrange mylist2 0 -1
1) "hello"
redis 127.0.0.1:6379>
3.1.10 rpoplpush
从第一个list的尾部移除元素并添加到第二个list的头部,最后返回被移除的元素值,整个操作是原子的。如果第一个list是空或者不存在返回nil。
代码语言:javascript复制redis 127.0.0.1:6379> lrange mylist5 0 -1
1) "three"
2) "foo"
3) "hello"
redis 127.0.0.1:6379> lrange mylist6 0 -1
1) "hello"
2) "foo"
redis 127.0.0.1:6379> rpoplpush mylist5 mylist6
"hello"
redis 127.0.0.1:6379> lrange mylist5 0 -1
1) "three"
2) "foo"
redis 127.0.0.1:6379> lrange mylist6 0 -1
1) "hello"
2) "hello"
3) "foo"
redis 127.0.0.1:6379>
3.1.11 lindex
返回名称为key的list中index位置的元素。
代码语言:javascript复制redis 127.0.0.1:6379> lrange mylist5 0 -1
1) "three"
2) "foo"
redis 127.0.0.1:6379> lindex mylist5 0
"three"
redis 127.0.0.1:6379> lindex mylist5 1
"foo"
redis 127.0.0.1:6379>
3.1.12 llen
返回key对应list的长度。
代码语言:javascript复制redis 127.0.0.1:6379> llen mylist5
(integer) 2
redis 127.0.0.1:6379>
4 HASH
Hash类型类似对象属性和值的结构.
4.1 操作命令
4.1.1 hset/hget
HSET和HGET:赋值和取值。
命令格式:
代码语言:javascript复制HSET key field value
HGET key field
HMSET key field value [field value…]
HMGET key field value [field value…]
HGETALL key
代码语言:javascript复制127.0.0.1:6379> hset user username chenchen
(integer) 1
127.0.0.1:6379> hget user username
"chenchen"
127.0.0.1:6379> hset user username chen
(integer) 0
127.0.0.1:6379> keys user
1) "user"
127.0.0.1:6379> hgetall user
1) "username"
2) "chen"
127.0.0.1:6379>
127.0.0.1:6379> hset user age 30
(integer) 1
127.0.0.1:6379> hgetall user
1) "username"
2) "chen"
3) "age"
4) "30"
HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。
4.1.2 hmset/hmget
HMSET和HMGET:批量设置和获取对象属性。
代码语言:javascript复制127.0.0.1:6379> hmset person username tony age 18
OK
127.0.0.1:6379> hmget person age username
1) "18"
2) "tony"
127.0.0.1:6379> hgetall person
1) "username"
2) "tony"
3) "age"
4) "18"
注意:上面HMGET字段顺序可以自行定义。
4.1.3 hexists
HEXISTS:属性是否存在。
代码语言:javascript复制127.0.0.1:6379> hexists killer
(error) ERR wrong number of arguments for 'hexists' command
127.0.0.1:6379> hexists killer a
(integer) 0
127.0.0.1:6379> hexists user username
(integer) 1
127.0.0.1:6379> hexists person age
(integer) 1
4.1.4 hdel
HDEL:删除对象字段。
代码语言:javascript复制127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hgetall user
1) "username"
2) "chen"
127.0.0.1:6379> hgetall person
1) "username"
2) "tony"
3) "age"
4) "18"
4.1.5 hkeys/hvals
只获取字段名HKEYS或字段值HVALS。
代码语言:javascript复制127.0.0.1:6379> hkeys person
1) "username"
2) "age"
127.0.0.1:6379> hvals person
1) "tony"
2) "18"
4.1.6 hlen
获取字段数量HLEN
代码语言:javascript复制127.0.0.1:6379> hlen user
(integer) 1
127.0.0.1:6379> hlen person
(integer) 2
5 SET
Redis的Set是无序的字符串集合。
5.1 操作命令
5.1.1 sadd
此命令用来添加新的新的元素,可以单个添加,也可添加一组。
例如:
代码语言:javascript复制127.0.0.1:6379> sadd muset 1 2 3 4
(integer) 4
5.1.2 smembers
此命令用于返回set的值。返回的值是无序的,这个顺序是随机组成的。
例如:
代码语言:javascript复制127.0.0.1:6379> smembers muset
1) "1"
2) "2"
3) "3"
4) "4"
5.1.3 sismember
此命令用于检查元素是否存在。
例如:
代码语言:javascript复制127.0.0.1:6379> sismember muset 3
(integer) 1
127.0.0.1:6379> sismember muset 5
(integer) 0
5.1.4 sinter
此命令用于获取set的交集。
例如:
代码语言:javascript复制127.0.0.1:6379> sadd news:1000:tags 1 2 5 77
(integer) 4
127.0.0.1:6379> sadd tag:1:news 1000
(integer) 1
127.0.0.1:6379> sadd tag:2:news 1000
(integer) 1
127.0.0.1:6379> sadd tag:5:news 1000
(integer) 1
127.0.0.1:6379> sadd tag:77:news 1000
(integer) 1
127.0.0.1:6379> smembers news:1000:tags
1) "1"
2) "2"
3) "5"
4) "77"
127.0.0.1:6379> sinter tag:1:news tag:2:news tag:5:news tag:77:news
1) "1000"
5.1.5 spop
此命令用于从set中随机删除一个元素,并将这个元素返回给客户端。
例如:
代码语言:javascript复制127.0.0.1:6379> spop news:1000:tags
"2"
127.0.0.1:6379> smembers news:1000:tags
1) "1"
2) "5"
3) "77"
5.1.6 sunionstore
此命令用于获取两个set的并集,并且会去重。
例如:
代码语言:javascript复制127.0.0.1:6379> sadd set1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd set2 4 5 6 7
(integer) 4
127.0.0.1:6379> sunionstore set3 set1 set2
(integer) 7
127.0.0.1:6379> smembers set3
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
5.1.7 scard
此命令用于获取集合中元素的个数。
例如:
代码语言:javascript复制127.0.0.1:6379> scard set3
(integer) 7
127.0.0.1:6379> scard set1
(integer) 4
127.0.0.1:6379> scard set2
(integer) 4
5.1.8 srandmember
此命令用于从set中随机获取一个元素,但是不删除此元素。
例如:
代码语言:javascript复制127.0.0.1:6379> srandmember set3
"4"
127.0.0.1:6379> smembers set3
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
127.0.0.1:6379>
6 SORTED SET
排序集由一组有序的不重复的字符串元素组成。有序集合中的每个元素都与一个浮点值相关联,称为分数
排序规则:
- 1.如果A和B是具有不同分数的两个元素,如果A.score>B.score则A>B。
- 2.如果A和B具有完全相同的分数,则如果A字符串在字典顺序上大于B字符串,则A>B。A和B字符串不能相等,因为排序集只有唯一元素。
6.1 操作命令
6.1.1 zadd
此命令用于给集合添加元素。
命令格式如下:
代码语言:javascript复制zadd name score value
例如:
代码语言:javascript复制127.0.0.1:6379> zadd zset1 1940 "Alan Kay"
(integer) 1
127.0.0.1:6379> zadd zset1 1957 "Sophie Wilson"
(integer) 1
127.0.0.1:6379> zadd zset1 1953 "Richard Stallman"
(integer) 1
127.0.0.1:6379> zadd zset1 1949 "Anita Borg"
(integer) 1
6.1.2 zrange
以分数从小到大排序显示集合所有元素。
例如:
代码语言:javascript复制127.0.0.1:6379> zrange zset1 0 -1
1) "Alan Kay"
2) "Anita Borg"
3) "Richard Stallman"
4) "Sophie Wilson"
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "Alan Kay"
2) "1940"
3) "Anita Borg"
4) "1949"
5) "Richard Stallman"
6) "1953"
7) "Sophie Wilson"
8) "1957"
- 0和-1表示从元素索引0到最后一个元素。
- withscores:此为可选项,用于表示是否显示分数。
6.1.3 zrevrange
以分数从大到小排序显示集合所有元素。后面的参数与zrange一样。
例如:
代码语言:javascript复制127.0.0.1:6379> zrevrange zset1 0 -1
1) "Sophie Wilson"
2) "Richard Stallman"
3) "Anita Borg"
4) "Alan Kay"
6.1.4 zrangebyscore
此命令用于显示集合中的指定部分数据。
例如:
代码语言:javascript复制127.0.0.1:6379> zadd zset2 1 a
(integer) 1
127.0.0.1:6379> zadd zset2 2 b
(integer) 1
127.0.0.1:6379> zadd zset2 3 c
(integer) 1
127.0.0.1:6379> zadd zset2 4 d
(integer) 1
127.0.0.1:6379> zadd zset2 5 e 6 f
(integer) 2
127.0.0.1:6379> zrange zset2 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
7) "d"
8) "4"
9) "e"
10) "5"
11) "f"
12) "6"
127.0.0.1:6379> zrangebyscore zset2 -inf 3
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> zrangebyscore zset2 4 6
1) "d"
2) "e"
3) "f"
-inf表示负无穷。
6.1.5 zremrangebyscore
此命令用于批量删除元素,并且返回删除元素的个数。
例如:
代码语言:javascript复制127.0.0.1:6379> zremrangebyscore zset2 3 5
(integer) 3
127.0.0.1:6379> zrange zset2 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
5) "f"
6) "6"
127.0.0.1:6379>
6.1.6 zrank
此命令用于返回元素的正向位置。集合中第一个元素下标为0。
例如:
代码语言:javascript复制127.0.0.1:6379> zrank zset2 f
(integer) 2
127.0.0.1:6379> zrank zset2 b
(integer) 1
127.0.0.1:6379>
6.1.7 zrevrank
此命令用于返回元素的反向位置。
例如:
代码语言:javascript复制127.0.0.1:6379> zrevrank zset2 f
(integer) 0
7 BITMAP
Bitmap即位图,它不是实际的数据类型,而是在String类型上定义的一组面向位操作的数组。它的最大程度为512M,最长的位为2的32次方。
位图操作分为两部分:一部分是offset,另一部分是value。
位图的offset大小为2的32次方,value只能是0或1。
7.1 操作命令
7.1.1 setbit
此命令用于设置位图对应offset的value。
格式如下:
代码语言:javascript复制setbit key offset value
例如:
代码语言:javascript复制127.0.0.1:6379> setbit key 10 1
(integer) 0
7.1.2 getbit
此命令用于获取位图对应offset的value。
格式:
代码语言:javascript复制getbit key offset
例如:
代码语言:javascript复制127.0.0.1:6379> getbit key 10
(integer) 1
7.1.3 bitcount
格式如下:
代码语言:javascript复制bitcount key [start end]
获取位图指定范围中值为1的个数,如果不指定start和end,则取所有。
例如:
代码语言:javascript复制127.0.0.1:6379> bitcount key 0 11
(integer) 1
7.1.4 bitop
格式如下:
代码语言:javascript复制bitop opration destKey key1 [key2…]
获取多个位图的交集、并集、非、异或操作之后的结果,结果保存在destKey中。
opration:可以是and,or,not,xor。
例如:
代码语言:javascript复制127.0.0.1:6379> bitop and bitm3 bitm1 bitm2
(integer) 2
7.1.5 bitpos
格式如下:
代码语言:javascript复制bitpos key bit [start end]
查找指定范围内的指定值出现第一次的位置。如果不指定star和end,则取所有。
例如:
代码语言:javascript复制127.0.0.1:6379> bitpos bitm3 1
(integer) 2
127.0.0.1:6379> bitpos bitm3 0
(integer) 0
8 HYPERLOGLOG
HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
在Redis里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为HyperLogLog只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。
8.1 操作命令
8.1.1 pfadd
格式如下:
代码语言:javascript复制pfadd key element [element …]
向HyperLogLog中添加指定元素。
例如:
代码语言:javascript复制127.0.0.1:6379> pfadd hll a b c d e
(integer) 1
8.1.2 pfcount
格式如下:
代码语言:javascript复制pfcount key [key…]
返回指定HyperLogLog的基数估算值。
例如:
代码语言:javascript复制127.0.0.1:6379> pfcount hll
(integer) 5
127.0.0.1:6379> pfadd hl2 d e f g
(integer) 1
127.0.0.1:6379> pfcount hll hl2
(integer) 7
127.0.0.1:6379>
8.1.3 pfmerge
格式如下:
代码语言:javascript复制pfmerge destkey sourcekey [sourcekey…]
将多个HyperLogLog合并为一个。
例如:
代码语言:javascript复制127.0.0.1:6379> pfcount hll hl2
(integer) 7
127.0.0.1:6379> pfmerge hl3 hll hl2
OK
127.0.0.1:6379> pfcount hl3
(integer) 7
127.0.0.1:6379>