Redis入门:数据类型及操作命令

2022-03-24 10:28:13 浏览数 (1)

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>

0 人点赞