1、数据类及操作命令
1.1 常用命令
查看所有key
192.168.1.204:0>keys *
1) "aaa"
2) "foo"
3) "abc"
查看key是否存在 1存在 0不存在
192.168.1.204:0>exists key aaa
"1"
192.168.1.204:0>exists key bbb
"0"
192.168.1.204:0>
查看key的数据类型
192.168.1.204:0>type aaa
"string"
删除key
192.168.1.204:0>del aaa
"1"
192.168.1.204:0>keys *
1) "foo"
2) "abc"
expire 给key设置过期时间,ttl 查看key的过期时间,如果是正数代表没过期,-1代表永不过期,-2代表过期
192.168.1.204:0>expire foo 10
"1"
192.168.1.204:0>ttl foo
"2"
192.168.1.204:0>ttl foo
"-2"
192.168.1.204:0>ttl foo
"-2"
选择数据库
192.168.1.204:0>select 1
"OK"
#查看数据库key的数量
192.168.1.204:1>dbsize
"0"
#因为1没有数据库,先插一条
192.168.1.204:1>set abc abc
"OK"
#查看key个数
192.168.1.204:1>dbsize
"1"
清空当前库
192.168.1.204:1>flushdb
"OK"
192.168.1.204:1>keys *
清空所有库
192.168.1.204:1>flushall
"OK"
192.168.1.204:1>select 0
"OK"
192.168.1.204:0>keys *
1.2 字符串 String
string是Redis的基本类型,以key value形式出现
string类型是二进制安全的,所以可以是任何数据
values中最多可存512m
1.2.1 常用命令
#设置key value
192.168.1.204:0>set k1 v1
"OK"
#获取key得到value
192.168.1.204:0>get k1
"v1"
#在原有的key对应的value后面追加
192.168.1.204:0>append k1 23
"4"
#查k1发现value变成了v123
192.168.1.204:0>get k1
"v123"
#查看key对应value的长度
192.168.1.204:0>strlen k1
"4"
#----------setnx key----------
#只有在key不存在时才增加一个,返回为0证明已经有相同的key,返回1证明增加成功
#----------------------------
192.168.1.204:0>setnx k1 v1
"0"
192.168.1.204:0>get k1
"v123"
192.168.1.204:0>setnx k2 v2
"1"
#----------incr key----------
#将key中存储的数值加1,如果不是数字返回报错
#----------------------------
192.168.1.204:0>set k3 1
"OK"
192.168.1.204:0>incr k3
"2"
192.168.1.204:0>get k3
"2"
192.168.1.204:0>incr k2
"ERR value is not an integer or out of range"
#----------decr key----------
#将key中存储的数值加1,如果不是数字返回报错
#----------------------------
192.168.1.204:0>decr k3
"1"
192.168.1.204:0>
#----------incrby key 增加自定义步长----------
192.168.1.204:0>incrby k3 10
"11"
#----------decrby key 减少自定义步长----------
192.168.1.204:0>decrby k3 10
"1"
#----------mset key1 value1 key2 value2 同时设置多个key value----------
192.168.1.204:0>mset k5 v5 k6 v6
"OK"
#----------mget key1 key2 同时获取多个key的value----------
192.168.1.204:0>mget k5 k6
1) "v5"
2) "v6"
192.168.1.204:0>
#----------msetnx key1 value1 key2 value2 同时设置多个key value,只有当key不存在时才成功,因为该操作是原子性的,有一个失败就全部失败----------
192.168.1.204:0>msetnx k7 v7 k8 v8
"1"
#测试原子性,k7已存在,得到结果k9没插成功
192.168.1.204:0>msetnx k7 v7 k9 v9
"0"
192.168.1.204:0>get k9
null
192.168.1.204:0>
#-----用法:getrange 开始索引位置 结束索引位置----------
#-----解释:获取值范围,类似Java中的substring
#---------------------------------------------------
192.168.1.204:0>get k1
"v123"
192.168.1.204:0>getrange k1 1 2
"12"
#-----用法:setrange 开始索引位置 新的值----------
#-----解释:从索引位置开始,用新值替换旧值
#---------------------------------------------------
192.168.1.204:0>setrange k1 1 abc
"4"
192.168.1.204:0>get k1
"vabc"
192.168.1.204:0>
#-----用法:setex key 过期时间 value----------
#-----解释:插入新值的同时,设置过期时间,单位秒,过期会自动删除
#---------------------------------------------------
192.168.1.204:0>setex k9 10 v9
"OK"
192.168.1.204:0>get k9
null
#-----用法:getset key value----------
#-----解释:从索引位置开始,用新值替换旧值,并获取原来值
#---------------------------------------------------
192.168.1.204:0>getset k9 v99
null
192.168.1.204:0>get k9
"v99"
1.2.2 数据结构
String的数据结构为可修改的动态字符串(Simple Dynamic String)。字符串在进行扩容时如果长度小于1m,那就按照当前控件翻倍,如果超过1m,每次扩容只会多扩容1m,最大可到512m
1.3 列表 List
Redis的列表为有序列表,按照插入顺序进行排序,虽然是按照顺序插入进行排序,但可以往中间插
1.3.1 常用命令
#------用法:lpush k1 v1 v2
#------解释:从左边插入一个或多个值
192.168.1.204:0>lpush k1 v1 v2
"2"
#------用法:rpush k1 v1 v2
#------解释:从右边插入一个或多个值
192.168.1.204:0>rpush k1 v3 v4
"4"
#------用法:lpop key
#------解释:从左边开始拿,如果value中没有值,那么key也将删除
192.168.1.204:0>lpop k1
"v2"
192.168.1.204:0>lpop k1
"v1"
#------用法:rpop k1
#------解释:从右边开始拿,如果value中没有值,那么key也将删除
192.168.1.204:0>rpop k1
"v4"
192.168.1.204:0>rpop k1
"v3"
192.168.1.204:0>
#------用法:rpoplpush key1 key2
#------解释:从key1列表右边吐出一个值,插入到key2列表的左边
192.168.1.204:0>lpush k1 v1 v2
"2"
192.168.1.204:0>lpush k2 v2 v3
"2"
192.168.1.204:0>rpoplpush k1 k2
"v1"
#看k2的左边是否为v1
192.168.1.204:0>lpop k2
"v1"
#------用法:lrange key startIndex stopIndex
#------解释:按照索引下标从左到右获取元素,如果startIndex=0 stopIndex=-1 则代表获取所有元素
192.168.1.204:0>flushall
"OK"
192.168.1.204:0>lpush k1 v1 v2 v3
"3"
192.168.1.204:0>lrange k1 0 2
1) "v3"
2) "v2"
3) "v1"
192.168.1.204:0>lrange k1 0 -1
1) "v3"
2) "v2"
3) "v1"
#------用法:lindex key index
#------解释:按照所有下标获取元素
192.168.1.204:0>lindex k1 1
"v2"
192.168.1.204:0>lindex k1 2
"v1"
#------用法:llen key
#------解释:获取列表长度
192.168.1.204:0>llen k1
"3"
#------用法:linsert key before value newvalue
#------解释:在列表的中间插入一个值
192.168.1.204:0>lrange k1 0 -1
1) "v3"
2) "v2"
3) "v1"
192.168.1.204:0>linsert k1 before v2 vnew2
"4"
#已经在v2的前面加了vnew2
192.168.1.204:0>lrange k1 0 -1
1) "v3"
2) "vnew2"
3) "v2"
4) "v1"
192.168.1.204:0>
#------用法:lrem key n value
#------解释:从左边到右删除n个value
192.168.1.204:0>lrange k1 0 -1
1) "v3"
2) "v4"
3) "v3"
4) "v2"
5) "v3"
192.168.1.204:0>lrem k1 2 v3
"2"
192.168.1.204:0>lrange k1 0 -1
1) "v4"
2) "v2"
3) "v3"
192.168.1.204:0>
#------用法:lset key index value
#------解释:将列表下标的元素替换成value
192.168.1.204:0>lrange k1 0 -1
1) "v4"
2) "v2"
3) "v3"
192.168.1.204:0>lset k1 0 v1
"OK"
192.168.1.204:0>lrange k1 0 -1
1) "v1"
2) "v2"
3) "v3"
1.3.2 数据结构
List的数据结构是链表,所以用LPUSH命令在十个元素的头部添加新元素和在千万元素的头部添加新元素的速度是相同的
1.4 无序集合Set
Set与List类似,区别在于Set是元素不能重复的,List元素可以重复。并且Set可以通过命令判断元素是否在集合里面,而List没有。并且Set的集合是无序集合,底层实现用的字典
1.4.1常用命令
增加元素
用法:sadd key value1 value2
解释:将一个或多个元素加入集合key中,已存在的元素将会被忽略
#先清空一下,做测试才这样
192.168.1.204:0>flushall
"OK"
192.168.1.204:0>sadd k1 v1 v2 v3
"3"
获取所有元素
用法:smembers key
解释:获取集合中的所有元素
192.168.1.204:0>smembers k1
1) "v3"
2) "v2"
3) "v1"
判断值是否在集合中
用法:sismember key
解释:判断值是否在集合中,1有,0没有
192.168.1.204:0>sismember k1 v2
"1"
192.168.1.204:0>sismember k1 v4
"0"
获取集合的元素个数
用法:scard key
解释:获取集合的元素个数
192.168.1.204:0>scard k1
"3"
192.168.1.204:0>
获取集合的某些元素
用法:srem key
解释:获取集合的某些元素,可以是一个也可以是多个
192.168.1.204:0>srem k1 v2 v3
"2"
192.168.1.204:0>smembers k1
1) "v1"
192.168.1.204:0>
随机获取一个元素
用法:spop key
解释:随机获取一个元素并删除该元素
#先加两个
192.168.1.204:0>sadd k1 v2 v3
"2"
192.168.1.204:0>spop k1
"v3"
192.168.1.204:0>spop k1
"v1"
192.168.1.204:0>spop k1
"v2"
随机获取一个元素
用法:srandmember key n
解释:随机获取多个元素,n为个数,不会删除集合中的元素
192.168.1.204:0>srandmember k1 2
1) "v3"
2) "v1"
192.168.1.204:0>
把一个集合中元素移动到另一个集合中
用法:smove key1 key2 value1
解释:把一个集合中元素移动到另一个集合中,key1移出集合,key2移入集合,value1为key1集合中的元素
#加一个集合 k2 值v5
192.168.1.204:0>sadd k2 v5
"1"
192.168.1.204:0>smove k1 k2 v1
"1"
#原来是 v1 v2 v3
192.168.1.204:0>smembers k1
1) "v3"
2) "v2"
#原来是 v5
192.168.1.204:0>smembers k2
1) "v5"
2) "v1"
192.168.1.204:0>
求两个集合的交集
用法:sinter key1 key2
解释:求两个集合的交集
192.168.1.204:0>sinter k1 k2
1) "v5"
2) "v1"
192.168.1.204:0>smembers k1
1) "v3"
2) "v2"
3) "v5"
4) "v1"
192.168.1.204:0>smembers k2
1) "v5"
2) "v1"
求两个集合的并集
用法:sunion key1 key2
解释:求两个集合的并集
192.168.1.204:0>smembers k1
1) "v3"
2) "v2"
3) "v5"
4) "v1"
192.168.1.204:0>smembers k2
1) "v5"
2) "v1"
192.168.1.204:0>sunion k1 k2
1) "v2"
2) "v5"
3) "v1"
4) "v3"
求两个集合的差集
用法:sdiff key1 key2
解释:求两个集合的差集,差集指的是key1中有的key2中没有的
192.168.1.204:0>sdiff k1 k2
1) "v3"
2) "v2"
192.168.1.204:0>smembers k1
1) "v3"
2) "v2"
3) "v5"
4) "v1"
192.168.1.204:0>smembers k2
1) "v6"
2) "v5"
3) "v1"
1.5 哈希 Hash
Redis的Hash类似Java的Map<String,Object>,所以用来存储对象非常合适
1.5.1 常用命令
增加一个元素
用法:hset key field value
解释:增加一个元素
192.168.1.204:0>hset user:1001 id 1
"1"
192.168.1.204:0>hset user:1001 name zhangsan
"1"
获取一个元素
用法:hget key field
解释:增加一个元素
192.168.1.204:0>hget user:1001 id
"1"
192.168.1.204:0>hget user:1001 name
"zhangsan"
192.168.1.204:0>
批量增加元素
用法:hmset key field1 value1 field2 value2
解释:往一个key中批量增加元素
192.168.1.204:0>hmset user:1001 f1 v1 f2 v2
"OK"
查key中对应的字段是否存在
用法:hexists key field
解释:查key中对应的字段是否存在,1存在,0不存在
192.168.1.204:0>hexists user:1001 f1
"1"
192.168.1.204:0>hexists user:1001 f3
"0"
查看集合中所有的字段
用法:hkeys key
解释:查看集合中所有的字段
192.168.1.204:0>hkeys user:1001
1) "id"
2) "name"
3) "f1"
4) "f2"
查看集合中所有的值
用法:hvals key
解释:查看集合中所有的值
192.168.1.204:0>hvals user:1001
1) "1"
2) "zhangsan"
3) "v1"
4) "v2"
为key中指定field的value进行加减
用法:hincrby key field n
解释:为key中指定field的value进行加减,n可以是正数或负数,正数加,负数减
192.168.1.204:0>hset user:1001 age 10
"1"
192.168.1.204:0>hvals user:1001
1) "1"
2) "zhangsan"
3) "v1"
4) "v2"
5) "10"
192.168.1.204:0>hincrby user:1001 age 3
"13"
192.168.1.204:0>hincrby user:1001 age -3
"10"
为key中指定field不存在时赋值
用法:hsetnx key field value
解释:为key中指定field不存在时赋值,field存在不赋值并放回0,field不存在新增一个field并赋值
192.168.1.204:0>hsetnx user:1001 name lisi
"0"
192.168.1.204:0>hsetnx user:1001 name1 lisi
"1"
1.6 有序集合 Zset
Redis的Zset和set类似,是一个没有重复元素的字符集合
Zset为每个成员关联了一个评分(score),按评分从低到高对元素进行排序。因为是按照评分排序的,所以可以根据评分或次序(position)来获取一个范围的元素。因为其没有重复元素,所以访问集合元素要优于set
1.6.1 常用命令
增加一个集合
用法:zadd key score1 field1 score2 field2
解释:增加一个集合,score和field成对出现,可以有多个
192.168.1.204:0>zadd user 60 zhangsan 66 lisi 69 wangwu
"3"
查找一定范围内的元素
用法:zrange key start stop 【withscores】
解释:查找一定范围内的元素,start stop可以是任意数字,0代表第一个,-1代表最后一个,【withscores】代表把scores也输出出来
192.168.1.204:0>zrange user 0 -1
1) "zhangsan"
2) "lisi"
3) "wangwu"
192.168.1.204:0>zrange user 0 -1 withscores
1) "zhangsan"
2) "60"
3) "lisi"
4) "66"
5) "wangwu"
6) "69"
查找一定范围内的元素(从小到大排序)
用法:ZRANGEBYSCORE key min max [withscores][limit offset count]
解释:查找一定范围内的元素,min max可以是任意数字, [withscores]代表把scores也输出出来,[limit offset count]代表分页 offset相当于起始下标 coun代表多少个
192.168.1.204:0>ZRANGEBYSCORE user 60 66
1) "zhangsan"
2) "lisi"
192.168.1.204:0>ZRANGEBYSCORE user 60 66 withscores limit 0 2
1) "zhangsan"
2) "60"
3) "lisi"
4) "66"
查找一定范围内的元素(从大到小排序)
用法:zrevrangebyscore key max min [withscores][limit offset count]
解释:查找一定范围内的元素,min max可以是任意数字, [withscores]代表把scores也输出出来,[limit offset count]代表分页 offset相当于起始下标 coun代表多少个
192.168.1.204:0>zrevrangebyscore user 100 66
1) "wangwu"
2) "lisi"
192.168.1.204:0>zrevrangebyscore user 100 66 withscores limit 0 2
1) "wangwu"
2) "69"
3) "lisi"
4) "66"
为元素的score加上一个值
用法:zincrby key increment value
解释:为元素的score加上一个值,increment是你要加的值
192.168.1.204:0>zincrby user 1 zhangsan
"61"
删除集合下指定元素
用法:zrem key value
解释:删除集合下指定元素
192.168.1.204:0>zrem user zhangsan
"1"
统计集合区间的元素个数
用法:zcount key min max
解释:统计集合区间的元素个数
192.168.1.204:0>zadd user 60 zhangsan
"1"
192.168.1.204:0>zcount user 60 66
"2"
返回该值在集合中的排名,从0开始
用法:zrank key value
解释:返回该值在集合中的排名,从0开始
192.168.1.204:0>zrank user zhangsan
"0"
192.168.1.204:0>zrank user lisi
"1"
192.168.1.204:0>zrange user 0 -1 withscores
1) "zhangsan"
2) "60"
3) "lisi"
4) "66"
5) "wangwu"
6) "69"
如何用Zset实现排名?
看一下我们这个例子相当于用Zset实现了排名
192.168.1.204:0>zrange user 0 -1 withscores
1) "zhangsan"
2) "60"
3) "lisi"
4) "66"
5) "wangwu"
6) "69"
1.6.2 数据结构
Zset又称SortedSet,Zset使用了两种数据结构第一种是Hash,类似于Java的Map<String,Double>String 是我们value double是我们score
第二种是跳跃表,其目的是为了根据score对value进行排序和根据score的范围取值
Redis的跳跃表就是底层存储全部元素,每往上一层元素递减。比如一个跳跃表有三层,从第三层开始查,查到元素所在区间之后去下一层,最后到第一层,类似于二分法查找
下面演示一下跳跃表的查找过程
1、我们查33这个元素首先在L2层找,在5-66这个区间
2、然后L1层5-66这个区间找,可以确定在22-66这个区间
3、然后再L0层找22-66区间,可以找到最终元素33
我这边画的可能不是很准确,但就是按照区间找元素
1.7 高级数据类型 Bitmaps
- bitmaps不是数据类型,实际上是一种字符串key-value,但它可以对字符串的位进行操作,位即bit
- 相当于位组成的一个数组,这个数据只存储0和1,数组的下标叫偏移量,偏移量从0开始,位值默认为0
如下图
我们需要统计一个网站一天有哪些用户登录了,有多少?就可以用这个类型,我们常说的布隆过滤器就是用bitmaps实现的
我现在试着实现这个功能,用户如果访问了就标记为1,没有就是0,偏移量为用户id,如果我们现在有10个用户,1、3、5访问了,Bitmaps会有以下改变
设置一个Bitmaps值
setbit key offset value
解释:key:user:20210701代表这一天用户访问情况,offset:1、3、5代表用户id,value:1代表访问了
192.168.1.204:0>setbit user:20210701 1 1
"0"
192.168.1.204:0>setbit user:20210701 3 1
"0"
192.168.1.204:0>setbit user:20210701 5 1
"0"
值得注意的是,在第一次初始化Bitmaps时,偏移量非常大,那么有可能造成Redis阻塞
获取一个Bitmaps值
setbit key offset
192.168.1.204:0>getbit user:20210701 5
"1"
192.168.1.204:0>getbit user:20210701 6
"0"
统计被设置为1的bit数
bitcount key 【start end】
解释:start开始字节数,end结束字节数。两个都可以是负数,比如:-1即最后一位,-2为最后一位。字节数从0开始,所以0 -1代表整个区间。Redis中start end两个不是必选参数,所以默认查的就是0 -1
注意:start end都是计算byte中1的个数,不是计算bit数组中1的个数,1个byte等于8bit
#为了后面方便在bit下标20的值改为1
192.168.1.204:0>setbit user:20210701 20 1
"0"
192.168.1.204:0>bitcount user:20210701
"4"
192.168.1.204:0>bitcount user:20210701 0 -1
"4"
下图是我们二进制的值,可以看到整个字符串为1的有4个
现在我们用start end
再用之前先把字符串按1byte等于8bit划分以下,可以分为三段 01010100 00000000 00001000
start为0 end为1得到的值应该是3
start为0 end为2得到的值应该是4
start为1 end为2得到的值应该是1
下面来看一下结果,从结果中我们可以看出和我们想的一样
192.168.1.204:0>bitcount user:20210701 0 2
"4"
192.168.1.204:0>bitcount user:20210701 0 1
"3"
192.168.1.204:0>bitcount user:20210701 1 2
"1"
bitop
用法:BITOP operation destkey key [key …]
对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
BITOP 命令支持 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种参数:
- BITOP AND destkey srckey1 srckey2 srckey3 … srckeyN ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。
- BITOP OR destkey srckey1 srckey2 srckey3 … srckeyN,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。
- BITOP XOR destkey srckey1 srckey2 srckey3 … srckeyN,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。
- BITOP NOT destkey srckey,对给定 key 求逻辑非,并将结果保存到 destkey 。
除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入。
执行结果将始终保持到destkey里面。
处理不同长度的字符串
当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0 。
空的 key 也被看作是包含 0 的字符串序列。
返回值为整数
保存到 destkey 的字符串的长度,和输入 key 中最长的字符串长度相等。
BITOP AND destkey srckey1 srckey2 srckey3 … srckeyN
两个bitmaps中相同下标值都为1的
先建两个bitmaps user:20210702id有0、1、2、3 值分别为0、0、1、1
user:20210703id有0、2 值分别为1、1
预测结果:只有2连续出现两次
#第一个bitmaps
192.168.1.204:0>setbit user:20210702 0 0
"0"
192.168.1.204:0>setbit user:20210702 1 0
"0"
192.168.1.204:0>setbit user:20210702 2 1
"0"
192.168.1.204:0>setbit user:20210702 3 1
"0"
#第二个bitmaps
192.168.1.204:0>setbit user:20210703 0 1
"0"
192.168.1.204:0>setbit user:20210703 2 1
"0"
#求逻辑并
192.168.1.204:0>bitop and result user:20210702 user:20210703
"1"
#结果
192.168.1.204:0>getbit result 0
"0"
192.168.1.204:0>getbit result 1
"0"
192.168.1.204:0>getbit result 2 #只有2连续两次出现
"1"
192.168.1.204:0>getbit result 3
"0"
BITOP OR destkey srckey1 srckey2 srckey3 … srckeyN
两个bitmaps中相同下标值至少有一个为1
还是以上面bitmaps为例 user:20210702id有0、1、2、3 值分别为0、0、1、1
user:20210703id有0、2 值分别为1、1
预测结果:只有2连续出现两次
192.168.1.204:0>bitop or result1 user:20210703 user:20210702
"1"
192.168.1.204:0>getbit result1 0
"1"
192.168.1.204:0>getbit result1 1
"0"
192.168.1.204:0>getbit result1 2
"1"
192.168.1.204:0>getbit result1 3
"1"
1.8 高级数据类型 HyperLogLog
HyperLogLog会根据输入元素来计算基数,但不会存储输入的元素
基数即不重复元素个数,如:{1,2,3,4,5,2,4,6}那么基数集合就是{1,2,3,4,5,6}基数为6
1.8.1 命令
pfadd
用法:pfadd key element1 element2
解释:将指定元素添加到集合中,1代表基数改变,0代表基数没改变
#插入三个用户,返回1
192.168.1.204:0>pfadd user1 "zhangsan" "lisi" "wangwu"
"1"
#插入三个相同用户,返回0
192.168.1.204:0>pfadd user1 "zhangsan" "lisi" "wangwu"
"0"
#插入一个相同用户,返回0
192.168.1.204:0>pfadd user1 "zhangsan"
"0"
#"zhangsan" "lisi"相同,"wangwu1"不相同,返回1
192.168.1.204:0>pfadd user1 "zhangsan" "lisi" "wangwu1"
"1"
pfcount
用法:pfcount key1 key2
解释:返回基数,key可以有多个
192.168.1.204:0>pfcount user1
"4"
pfmerge
用法:pfmerge destkey sourcekey1 sourcekey2
解释:将sourcekey1 sourcekey2两个的元素合并到destkey中
#清掉库
192.168.1.204:0>flushdb
"OK"
#user增加元素
192.168.1.204:0>pfadd user "zhangsan" "lisi" "wangwu"
"1"
#user1增加元素
192.168.1.204:0>pfadd user1 "zhangsan" "zhaoliu"
"1"
#合并两个集合的元素到一个result集合里面
192.168.1.204:0>pfmerge result user user1
"OK"
#查看基数
192.168.1.204:0>pfcount result
"4"
#查看原来两个的基数,两个的数据和合并的result中的基数相同
192.168.1.204:0>pfcount user user1
"4"
1.9 地理信息 Geographic
Geographic即常说的GEO,也就是地图上的经纬度,redis提供了对经纬度的设置、查询、范围查询、距离查询、经纬度Hash等基本操作
命令
geoadd
用法:geoadd key longitude latitude member 【longitude latitude member】
解释:添加地理位置 经度 维度 名称,经度 维度 名称 可以增加多个
注意:有效经度-180到180,纬度-85.05112878到85.05112878,坐标超出范围将返回一个错误,已添加的数据不能继续添加
192.168.1.204:0>geoadd city 117.059810 30.487686 chizhou 117.043260 30.454646 hefei
"1"
#不能添加相同数据
192.168.1.204:0>geoadd city 117.059810 30.487686 chizhou
"0"
geopos
用法:geopos key member 【member】
解释:获取某个成员经纬度
192.168.1.204:0>geopos city chizhou hefei
1) 1) "117.05981165170669556"
2) "30.48768567047614653"
2) 1) "117.04326242208480835"
2) "30.45464558016416134"
GEORADIUSBYMEMBER
用法:GEORADIUSBYMEMBER key member radius m|km|ft|mi
解释:以某个成员为圆心,找在特定半径范围内的成员
下面查一个以chizhou为圆心,160公里范围内的成员
192.168.1.204:0>GEORADIUSBYMEMBER city chizhou 160 km
1) "hefei"
2) "chizhou"
geodist
用法:geodist key member1 member2【unit】
解释:求两个成员之间的距离,unit默认米,unit支持m、km、mi、ft
192.168.1.204:0>geodist city chizhou hefei
"114911.5824"
192.168.1.204:0>geodist city chizhou hefei km
"114.9116"
geohash
用法:geohash key member 【member】
192.168.1.204:0>geohash city chizhou
1) "wte5pu0m530"
192.168.1.204:0>geohash city chizhou hefei
1) "wte5pu0m530"
2) "wt7jr2h71t0"