Redis常用命令
约 5640 字大约 19 分钟
Redis命令
1. Redis5大数据类型
1.1 redis键(key)
| 命令 | 作用 |
|---|---|
| keys * | 查看当前库所有的key |
| exists key | 判断某个key是否存在 |
| type key | 查看你的key是什么类型 |
| del key | 删除指定的key数据 |
| unlink key | 根据value删除非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。 |
| expire key 10 | 为指定的key设置有效期10秒 |
| ttl key | 查看指定的key还有多少秒过期,-1:表示永不过期,-2:表示已过期 |
| select dbindex | 切换数据库【0-15】,默认为0 |
| dbsize | 查看当前数据库key的数量 |
| flushdb | 清空当前库 |
| flushall | 通杀全部库 |
1.2 redis字符串(String)
| 命令 | 语法 | 说明 |
|---|---|---|
| set:添加键值对 | set key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET] | NX:当数据库中key不存在时,可以将key-value添加到数据库 XX:当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥 EX:key的超时秒数 PX:key的超时毫秒数,与EX互斥 value中若包含空格、特殊字符,需用双引号包裹 |
| get:获取值 | get <key> | 127.0.0.1:6379> set name ready OK 127.0.0.1:6379> get name "ready" |
| apend:追加值 | append <key> <value> | 127.0.0.1:6379> set k1 hello OK 127.0.0.1:6379> append k1 " world" (integer) 11 127.0.0.1:6379> get k1 "hello world" |
| strlen:获取值的长度 | strlen <key> | 127.0.0.1:6379> set name ready OK 127.0.0.1:6379> strlen name (integer) 5 |
| setnx:key不存在时,设置key的值 | setnx <key> <value> | 127.0.0.1:6379> setnx site "itsoku.com" #site不存在,返回1,表示设置成功 (integer) 1 127.0.0.1:6379> setnx site "itsoku.com" #再次通过setnx设置site,由于已经存在了,所以设置失败,返回0 (integer) 0 |
| incr:原子递增1 | incr <key> | 127.0.0.1:6379> set age 30 #age值为30 OK 127.0.0.1:6379> incr age #age增加1,返回31 (integer) 31 127.0.0.1:6379> get age #获取age的值 "31" |
| decr:原子递减1 | decr <key> | 127.0.0.1:6379> set age 30 #age值为30 OK 127.0.0.1:6379> decr age #age递减1,返回29 (integer) 29 127.0.0.1:6379> get age #获取age的值 "29" |
| incrby/decrby:递增或者递减指定的数字 | incrby/decrby <key> <步长> | 127.0.0.1:6379> set salary 10000 #设置salary为10000 OK 127.0.0.1:6379> incrby salary 5000 #salary添加5000,返回15000 (integer) 15000 127.0.0.1:6379> get salary #获取salary "15000" 127.0.0.1:6379> decrby salary 800 #salary减去800,返回14200 (integer) 14200 |
| mset:同时设置多个key-value | mset <key1> <value1> <key2> <value2> ... | 127.0.0.1:6379> mset name ready age 30 OK 127.0.0.1:6379> get name "ready" 127.0.0.1:6379> get age "30" |
| mget:获取多个key对应的值 | mget <key1> <key2> ... | 127.0.0.1:6379> mset name ready age 30 #同时设置name和age OK 127.0.0.1:6379> mget name age #同时读取name和age的值 1) "ready" 2) "30" |
| msetnx:当多个key都不存在时,则设置成功 | msetnx <key1> <value1> <key2> <value2> ... | 127.0.0.1:6379> set k1 v1 #设置k1 OK 127.0.0.1:6379> msetnx k1 v1 k2 v2 #当k1和k2都不存在的时候,同时设置k1和k2,由于k1已存在,所以这个操作失败 (integer) 0 127.0.0.1:6379> mget k1 k2 #获取k1、k2,k2不存在 1) "v1" 2) (nil) |
| getrange:获取值的范围,类似java中的substring | getrange key start end | 127.0.0.1:6379> set k1 helloworld OK 127.0.0.1:6379> getrange k1 0 4 "hello" |
| setrange:覆盖指定位置的值 | setrange <key> <起始位置> <value> | 127.0.0.1:6379> set k1 helloworld OK 127.0.0.1:6379> get k1 "helloworld" 127.0.0.1:6379> setrange k1 1 java (integer) 10 127.0.0.1:6379> get k1 "hjavaworld" |
| setex:设置键值&过期时间(秒) | setex <key> <过期时间(秒)> <value> | 127.0.0.1:6379> setex k1 100 v1 #设置k1的值为v1,有效期100秒 OK 127.0.0.1:6379> get k1 #获取k1的值 "v1" 127.0.0.1:6379> ttl k1 #获取k1还有多少秒失效 (integer) 96 |
| getset:以新换旧,设置新值同时返回旧值 | getset <key> <value> | 127.0.0.1:6379> set name ready #设置name为ready OK 127.0.0.1:6379> getset name tom #设置name为tom,返回name的旧值 "ready" 127.0.0.1:6379> getset age 30 #设置age为30,age未设置过,返回age的旧值为null (nil) |
1.3 redis列表(List)
| 命令 | 语法 | 说明 |
|---|---|---|
| lpush/rpush:从左边或者右边插入一个或多个值 | lpush/rpush <key1> 、<value1> <key2> <value2> ... | 127.0.0.1:6379> flushdb #清空db,方便测试 OK 127.0.0.1:6379> rpush name java spring "springboot" "spring cloud" #列表name的左边插入4个元素 (integer) 4 127.0.0.1:6379> lrange name 1 2 #从左边取出索引位于[1,2]范围内的元素 1) "spring" 2) "springboot" |
| lrange:从列表左边获取指定范围内的值 | lrange <key> <star> <stop> | 127.0.0.1:6379> rpush course java c c++ php js nodejs #course集合的右边插入6个元素 (integer) 6 127.0.0.1:6379> lrange course 1 3 #获取course集合索引[1,3]范围内的元素 1) "c" 2) "c++" 3) "php" |
| rpoplpush:从一个列表右边弹出一个元素放到另外一个列表中 | rpoplpush source destination | 127.0.0.1:6379> rpush k1 1 2 3 #列表k1的右边添加3个元素[1,2,3] (integer) 3 127.0.0.1:6379> rpush k2 4 5 6 #列表k2的右边添加3个元素[4,5,6] (integer) 3 127.0.0.1:6379> rpoplpush k1 k2 #从k1的右边弹出一个元素放到k2的左边 "3" 127.0.0.1:6379> lrange k1 0 -1 #k1中剩下2个元素了 1) "1" 2) "2" |
| lpop/rpop:从左边或者右边弹出多个元素 | lpop/rpop <key> <count> | 127.0.0.1:6379> rpush course java c++ php js node js #集合course右边加入6个元素 (integer) 6 127.0.0.1:6379> lpop course #从左边弹出1个元素 "java" 127.0.0.1:6379> rpop course 2 #从右边弹出2个元素 1) "js" 2) "node" |
| lindex:获取指定索引位置的元素(从左到右) | lindex key index | 127.0.0.1:6379> rpush course java c c++ php #列表course中放入4个元素 (integer) 4 127.0.0.1:6379> lindex course 2 #返回索引位置2的元素 "c++" 127.0.0.1:6379> lindex course 200 #返回索引位置200的元素,没有 (nil) |
| llen:获得列表长度 | llen key | 127.0.0.1:6379> rpush name ready tom jack (integer) 3 127.0.0.1:6379> llen name (integer) 3 |
| linsert:在某个值的前或者后面插入一个值 | linsert <key> before|after <value> <newvalue> | 127.0.0.1:6379> rpush name ready tom jack #列表name中添加3个元素 (integer) 3 127.0.0.1:6379> linsert name before tom lily #tom前面添加lily (integer) 4 127.0.0.1:6379> linsert name before xxx lucy # 在元素xxx前面插入lucy,由于xxx元素不存在,插入失败,返回-1 (integer) -1 |
| lrem:删除指定数量的某个元素 | LREM key count value | 127.0.0.1:6379> rpush k1 v1 v2 v3 v2 v2 v1 #k1列表中插入6个元素 (integer) 6 127.0.0.1:6379> lrem k1 2 v2 #k1集合中从左边删除2个v2 (integer) 2 |
| lset:替换指定位置的值 | lset <key> <index> <value> | 127.0.0.1:6379> rpush name tom jack ready #name集合中放入3个元素 (integer) 3 127.0.0.1:6379> lset name 1 lily #将name集合中第2个元素替换为liy OK 127.0.0.1:6379> lset name 10 lily #索引超出范围,报错 (error) ERR index out of range 127.0.0.1:6379> lset course 1 java #course集合不存在,报错 (error) ERR no such key |
2.4 redis集合(Set)
| 命令 | 语法 | 说明 |
|---|---|---|
| sadd:添加一个或多个元素 | sadd <key> <value1> <value2> ... | 127.0.0.1:6379> sadd k1 v1 v2 v1 v3 v2 #k1中放入5个元素,会自动去重,成功插入3个 (integer) 3 |
| smembers:取出所有元素 | smembers <key> | 127.0.0.1:6379> sadd k1 v1 v2 v1 v3 v2 (integer) 3 127.0.0.1:6379> smembers k1 1) "v2" 2) "v1" 3) "v3" |
| sismember:判断集合中是否有某个值 | sismember <key> <value> | 127.0.0.1:6379> sadd k1 v1 v2 v1 v3 v2 #k1集合中成功放入3个元素[v1,v2,v3] (integer) 3 127.0.0.1:6379> sismember k1 v1 #判断k1中是否包含v1,1:有 (integer) 1 127.0.0.1:6379> sismember k1 v5 #判断k1中是否包含v5,0:无 (integer) 0 |
| scard:返回集合中元素的个数 | scard <key> | 127.0.0.1:6379> sadd k1 v1 v2 v1 v3 v2 (integer) 3 127.0.0.1:6379> scard k1 (integer) 3 |
| srem:删除多个元素 | srem key member [member ...] | 127.0.0.1:6379> sadd course java c c++ python #集合course中添加4个元素 (integer) 4 127.0.0.1:6379> srem course java c #删除course集合中的java和c (integer) 2 |
| spop:随机弹出多个值 | spop <key> <count> | 127.0.0.1:6379> sadd course java c c++ python #course集合中添加4个元素 (integer) 4 127.0.0.1:6379> spop course #随机弹出1个元素,被弹出的元素会被删除 "c++" 127.0.0.1:6379> spop course 2 #随机弹出2个元素 1) "java" 2) "python" 127.0.0.1:6379> smembers course #输出剩下的元素 1) "c" |
| srandmember:随机获取多个元素,不会从集合中删除 | srandmember <key> <count> | 127.0.0.1:6379> sadd course java c c++ python #course中放入5个元素 (integer) 4 127.0.0.1:6379> srandmember course 3 #随机获取3个元素,元素并不会被删除 1) "python" 2) "c++" 3) "c" |
| smove:将某个原创从一个集合移动到另一个集合 | smove <source> <destination> member | 127.0.0.1:6379> sadd course1 java php js #集合course1中放入3个元素[java,php,js] (integer) 3 127.0.0.1:6379> sadd course2 c c++ #集合course2中放入2个元素[c,c++] (integer) 2 127.0.0.1:6379> smove course1 course2 js #将course1中的js移动到course2 (integer) 1 |
| sinter:取多个集合的交集 | sinter key [key ...] | 127.0.0.1:6379> sadd course1 java php js #集合course1:[java,php,js] (integer) 3 127.0.0.1:6379> sadd course2 c c++ js #集合course2:[c,c++,js] (integer) 3 127.0.0.1:6379> sadd course3 js html #集合course3:[js,html] (integer) 2 127.0.0.1:6379> sinter course1 course2 course3 #返回三个集合的交集,只有:[js] 1) "js" |
| sinterstore:将多个集合的交集放到一个新的集合中 | sinterstore destination key [key ...] | |
| sunion:取多个集合的并集,自动去重 | sunion key [key ...] | 127.0.0.1:6379> sadd course1 java php js #集合course1:[java,php,js] (integer) 3 127.0.0.1:6379> sadd course2 c c++ js #集合course2:[c,c++,js] (integer) 3 127.0.0.1:6379> sadd course3 js html #集合course3:[js,html] (integer) 2 127.0.0.1:6379> sunion course1 course2 course3 #返回3个集合的并集,会自动去重 1) "php" 2) "js" 3) "java" 4) "html" 5) "c++" 6) "c" |
| sunionstore:将多个集合的并集放到一个新的集合中 | sinterstore destination key [key ...] | |
| sdiff:取多个集合的差集 | sdiff key [key ...] | 127.0.0.1:6379> sadd course1 java php js #集合course1:[java,php,js] (integer) 3 127.0.0.1:6379> sadd course2 c c++ js #集合course2:[c,c++,js] (integer) 3 127.0.0.1:6379> sadd course3 js html #集合course3:[js,html] (integer) 2 127.0.0.1:6379> sdiff course1 course2 course3 #返回course1中有的而course2和course3中都没有的元素 1) "java" 2) "php" |
| sdiffstore:将多个集合的差集放到一个新的集合中 | sdiffstore destination key [key ...] |
2.5 redis哈希(Hash)
| 命令 | 语法 | 说明 |
|---|---|---|
| hset:设置多个field的值 | hset key field value [field value ...] | 127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的值为ready,age的值为30 (integer) 2 |
| hget:获取指定filed的值 | hget key field | 127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的值为ready,age的值为30 (integer) 2 127.0.0.1:6379> hget user name #获取user中的name "ready" |
| hgetall:返回hash表所有的域和值 | hgetall key | 127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的值为ready,age的值为30 (integer) 2 127.0.0.1:6379> hgetall user #获取user所有信息 1) "name" 2) "ready" 3) "age" 4) "30" |
| hmset:和hset类似(已弃用) | hmset key field value [field value ...] | |
| hexists:判断给定的field是否存在,1:存在,0:不存在 | hexists key field | 127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的值为ready,age的值为30 (integer) 2 127.0.0.1:6379> hexists user name #user中存在name域 (integer) 1 127.0.0.1:6379> hexists user address #user中不存在address域,返回0 (integer) 0 127.0.0.1:6379> hexists user1 address #user1这个key不存在,返回0 (integer) 0 |
| hkeys:列出所有的filed | hkeys key | 127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的值为ready,age的值为30 (integer) 2 127.0.0.1:6379> hkeys user #获取user中的所有filed 1) "name" 2) "age" |
| hvals:列出所有的value | hvals key | 127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的值为ready,age的值为30 (integer) 2 127.0.0.1:6379> hvals user #获取user中的所有filed的值列表 1) "ready" 2) "30" |
| hlen:返回filed的数量 | hlen key | 127.0.0.1:6379> hset user name ready age 30 #哈希表user中设置2个域:name和age,name的值为ready,age的值为30 (integer) 2 127.0.0.1:6379> hlen user (integer) 2 |
| hincrby:filed的值加上指定的增量 | hincrby key field increment | 127.0.0.1:6379> hset siteInfo site itsoku.com pv 1000 #hash表siteInfo中有2个域:{site:"itsoku.com",pv:1000} (integer) 2 127.0.0.1:6379> hget siteInfo pv #获取siteInfo中pv的值 "1000" 127.0.0.1:6379> hincrby siteInfo pv 10 #siteInfo中的pv值增加10 (integer) 1010 127.0.0.1:6379> hget siteInfo pv #获取siteInfo中的pv "1010" 127.0.0.1:6379> hincrby siteInfo uv 500 #siteInfo中的uv值增加500,uv这个域不存在,则会先添加,然后再执行hincrby (integer) 500 |
| hsetnx:当filed不存在的时候,设置filed的值 | hsetnx key field value | 127.0.0.1:6379> hset user name ready age 30 #创建user,包含2个域:name、age (integer) 2 127.0.0.1:6379> hsetnx user name tom #name已存在,设置失败,返回0 (integer) 0 127.0.0.1:6379> hget user name #name依旧是ready "ready" 127.0.0.1:6379> hsetnx user address shanghai #address不存在,设置成功 (integer) 1 127.0.0.1:6379> hget user address #输出address的值 "shanghai" |
2.6 redis有序集合zset(sorted set)
| zadd:添加元素 | zadd <key> <score1> <member1> <score2> <member2> ... | 127.0.0.1:6379> zadd topn 100 java 80 c 90 c++ 50 php 70 js #创建名称为topn的zset,添加了5个元素 (integer) 5 |
|---|---|---|
| zrange:score升序,获取指定索引范围的元素 | zrange key start top [withscores] | 127.0.0.1:6379> zadd topn 100 java 80 c 90 c++ 50 php 70 js #创建名称为topn的zset,添加了5个元素 (integer) 5 127.0.0.1:6379> zrange topn 2 4 #返回索引范围[2,4]内的3个元素 1) "c" 2) "c++" 3) "java" |
| zrevrange:score降序,获取指定索引范围的元素 | zrevrange key start stop [WITHSCORES] | 127.0.0.1:6379> zadd topn 100 java 80 c 90 c++ 50 php 70 js #创建名称为topn的zset,添加了5个元素 (integer) 5 127.0.0.1:6379> zrevrange topn 0 2 #按照score降序获取前3名 1) "java" 2) "c++" 3) "c" |
| zrangebyscore:按照score升序,返回指定score范围内的数据 | zrangebyscore key min max [WITHSCORES] [LIMIT offset count] | 127.0.0.1:6379> zadd topn 100 java 80 c 90 c++ 50 php 70 js #创建名称为topn的zset,添加了5个元素 (integer) 5 127.0.0.1:6379> zrangebyscore topn 70 90 #score升序,获取score位于[70,90]区间中的元素值 1) "js" 2) "c" 3) "c++" |
| zrevrangebyscore:按照score降序,返回指定score范围内的数据 | zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count] | 127.0.0.1:6379> zadd topn 100 java 80 c 90 c++ 50 php 70 js #创建名称为topn的zset,添加了5个元素 (integer) 5 127.0.0.1:6379> zrevrangebyscore topn 100 90 #score降序,获取score位于[70,90]区间中的元素值 1) "java" 2) "c++" |
| zincrby:为指定元素的score加上指定的增量 | zincrby key increment member | 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ #集合topx中添加3个元素:java、c、c++,对应的score分别是:90、70、80 (integer) 3 127.0.0.1:6379> zincrby topx 5 java #对topx中的元素java的score加5,变成95了 "95" |
| zrem:删除集合中多个元素 | zrem key member [member ...] | 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ #集合topx中添加3个元素:java、c、c++,对应的score分别是:90、70、80 (integer) 3 127.0.0.1:6379> zrem topx c c++ #删除集合topx中的2个元素:c、c++ (integer) 2 |
| zremrangebyrank:根据索引范围删除元素 | zremrangebyrank key start stop | 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ #集合topx中添加3个元素:java、c、c++,对应的score分别是:90、70、80 (integer) 3 127.0.0.1:6379> zremrangebyrank topx 0 1 #删除索引范围[0,1]的数据 (integer) 2 127.0.0.1:6379> zrange topx 0 -1 #输出鞂topx中所有元素 1) "java" |
| zremrangebyscore:根据score的范围删除元素 | zremrangebyscore key min max | 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ 50 php #topx集合中添加4个元素 (integer) 4 127.0.0.1:6379> zremrangebyscore topx 70 80 #删除score位于[70,80]区间的元素 (integer) 2 |
| zcount:统计指定score范围内元素的个数 | zcount key min max | 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ 50 php #topx集合中添加4个元素 (integer) 4 127.0.0.1:6379> zcount topx 80 100 #统计score位于[80,100]区间中的元素个数 (integer) 2 |
| zrank:按照score升序,返回某个元素在集合中的排名 | zrank key member | 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ 50 php #topx集合中添加4个元素 (integer) 4 127.0.0.1:6379> zrank topx c #获取元素c的排名,返回1表示排名第2 (integer) 1 |
| zrevrank:按照score降序,返回某个元素在集合中的排名 | zrank key member | 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ 50 php #topx集合中添加4个元素 (integer) 4 127.0.0.1:6379> zrevrank topx java #score降序,得到java的排名,排在第1位 (integer) 0 |
| zscore:返回集合中指定元素的score | zscore key member | 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++ 50 php #topx集合中添加4个元素 (integer) 4 127.0.0.1:6379> zscore topx java #获取集合topx中java的score "90" |
2. Redis发布订阅
2.1 subscribe
订阅一个或者多个频道
subscribe channel [channel ...]
订阅给定的一个或多个频道的信息。
**返回值:**接收到的信息(请参见下面的代码说明)。
redis> subscribe msg chat_room
Reading messages... (press Ctrl-C to quit)
1) "subscribe" # 返回值的类型:显示订阅成功
2) "msg" # 订阅的频道名字
3) (integer) 1 # 目前已订阅的频道数量
1) "subscribe"
2) "chat_room"
3) (integer) 2
1) "message" # 返回值的类型:信息
2) "msg" # 来源(从那个频道发送过来)
3) "hello moto" # 信息内容
1) "message"
2) "chat_room"
3) "testing...haha"
2.2 publish
发布消息到指定的频道
publish channel message
将信息 message 发送到指定的频道 channel 。
**返回值:**接收到信息 message 的订阅者数量。
redis> publish bad_channel "can any body hear me?"
(integer) 0
redis> publish msg "good morning"
(integer) 1
redis> publish chat_room "hello~ everyone"
(integer) 3
2.3 psubscribe
订阅一个或多个符合给定模式的频道
psubscribe pattern [pattern ...]
订阅一个或多个符合给定模式的频道。
每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类。
redis> psubscribe news.* tweet.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe" # 返回值的类型:显示订阅成功
2) "news.*" # 订阅的模式
3) (integer) 1 # 目前已订阅的模式的数量
1) "psubscribe"
2) "tweet.*"
3) (integer) 2
1) "pmessage" # 返回值的类型:信息
2) "news.*" # 信息匹配的模式
3) "news.it" # 信息本身的目标频道
4) "Google buy Motorola" # 信息的内容
1) "pmessage"
2) "tweet.*"
3) "tweet.huangz"
4) "hello"
1) "pmessage"
2) "tweet.*"
3) "tweet.joe"
4) "@huangz morning"
1) "pmessage"
2) "news.*"
3) "news.life"
4) "An apple a day, keep doctors away"
3. Redis3种新数据类型
3.1 Bitmaps
| 命令 | 语法 | 说明 |
|---|---|---|
| setbit:设置某个偏移量的值(0或1) | setbit key offset value | redis> setbit bit 10086 1 (integer) 0 redis> getbit bit 10086 (integer) 1 redis> getbit bit 100 # bit 默认被初始化为 0 (integer) 0 |
| getbit:获取某个偏移位的值 | getbit key offset | 127.0.0.1:6379> setbit users 1001 1 #设置偏移量1001的bit位的值为1 (integer) 0 127.0.0.1:6379> getbit users 1001 #获取偏移位1001的bit位的值 (integer) 1 127.0.0.1:6379> getbit users 1000 #获取偏移位1000的bit位的值,未设置,返回0 (integer) 0 |
| bitcount:统计bit位都为1的数量 | bitcount key [start] [end] | 127.0.0.1:6379> setbit user 7 1 # 设置user这个bitmaps中偏移量为7的bit为值为1,也就是第8个bit位的值 (integer) 0 127.0.0.1:6379> setbit user 15 1 # 设置user这个bitmaps中偏移量为15的bit为值为1 (integer) 0 127.0.0.1:6379> bitcount user # 获取user这个bitmaps中1的数量 (integer) 3 127.0.0.1:6379> bitcount user 0 1 # 获取[0,1]这个字节内bit位上1的数量,也就是offset是[0,15]的位置上1的数量,所以是2个 (integer) 2 |
| bittop:对一个多个bitmaps执行位操作 | bitop operation destkey key [key ...] | redis> setbit bits-1 0 1 # bits-1 = 1001 (integer) 0 redis> setbit bits-1 3 1 (integer) 0 redis> setbit bits-2 0 1 # bits-2 = 1011 (integer) 0 redis> setbit bits-2 1 1 (integer) 0 redis> setbit bits-2 3 1 (integer) 0 redis> bitop and and-result bits-1 bits-2 (integer) 1 redis> getbit and-result 0 # and-result = 1001 (integer) 1 redis> getbit and-result 1 |
3.2 HyperLoglog
| 命令 | 语法 | 说明 |
|---|---|---|
| pfadd:添加多个元素 | pfadd key element [element ...] | 127.0.0.1:6379> pfadd program java php c c++ # program中添加4个元素[java,php,c,c++],添加成功发,返回1 (integer) 1 127.0.0.1:6379> pfadd program java # 再次添加java,由于已经存在,所以添加失败,返回0 (integer) 0 127.0.0.1:6379> pfadd program java js # 再次添加2个元素,java已经存在了,但是js不存在,添加成功,返回1 (integer) 1 |
| pfcount:获取多个HLL合并后元素的个数 | pfcount key1 key2 ... | 127.0.0.1:6379> pfadd uv1 a b c d e #uv1中5个元素:[a,b,c,d,e] (integer) 1 127.0.0.1:6379> pfcount uv1 #uv1中数量为5 (integer) 5 127.0.0.1:6379> pfadd uv2 b c d e f #uv2中5个元素:[b,c,d,e,f] (integer) 1 127.0.0.1:6379> pfcount uv2 #uv2中数量为5 (integer) 5 127.0.0.1:6379> pfcount uv1 uv2 # 获取uv1和uv2去重之后数量合集:[a,b,c,d,e,f],数量为5 (integer) 5 |
| pfmerge:将多个HLL合并后元素放入另外一个HLL | pfmerge destkey sourcekey [sourcekey ...] | 127.0.0.1:6379> pfadd uv1 a b c d e #uv1中5个元素:[a,b,c,d,e] (integer) 1 127.0.0.1:6379> pfcount uv1 #uv1中数量为5 (integer) 5 127.0.0.1:6379> pfadd uv2 b c d e f #uv2中5个元素:[b,c,d,e,f] (integer) 1 127.0.0.1:6379> pfcount uv2 #uv2中数量为5 (integer) 5 127.0.0.1:6379> pfmerge uv_dest uv1 uv2 #将uv1和uv2合并后放入uv_dest OK 127.0.0.1:6379> pfcount uv_dest #uv_dest元素个数为6 (integer) 6 |
3.3 Geographic
| 命令 | 语法 | 说明 |
|---|---|---|
| geoadd:添加多个位置的经纬度 | geoadd key longitude latitude member [longitude latitude member ...] | 127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai #添加上海的经纬度 (integer) 1 127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen 116.38 39.90 beijing #添加重庆、深圳、北京 3 个城市的经纬度 (integer) 3 127.0.0.1:6379> type china:city #发现geo实际上使用zset类型存储的 zset 127.0.0.1:6379> zrange china:city 0 -1 1) "chongqing" 2) "shenzhen" 3) "shanghai" 4) "beijing" |
| geopos:获取多个位置的坐标值 | geopos key member [member ...] | 127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai #添加上海的经纬度 (integer) 1 127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen 116.38 39.90 beijing #添加重庆、深圳、北京 3 个城市的经纬度 (integer) 3 127.0.0.1:6379> geopos china:city wuhan beijing chongqing #获取武汉、北京、重庆 3个城市的坐标,由于没有添加武汉的数据,所以没有获取到,其他2个获取到了 1) (nil) 2) 1) "116.38000041246414185" 2) "39.90000009167092543" 3) 1) "106.49999767541885376" 2) "29.52999957900659211" |
| geodist:获取两个位置的直线距离 | geodist key member1 member2 [m|km|ft|mi] | 127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai #添加上海的经纬度 (integer) 1 127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen 116.38 39.90 beijing #添加重庆、深圳、北京 3 个城市的经纬度 (integer) 3 127.0.0.1:6379> geodist china:city beijing chongqing km #获取北京到重庆的直线距离 "1462.9505" |
| georadius:以给定的经纬度为中心,找出某一半径内的元素 | georadius key longitude latitude radius m|km|ft|mi | 127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai #添加上海的经纬度 (integer) 1 127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen 116.38 39.90 beijing #添加重庆、深圳、北京 3 个城市的经纬度 (integer) 3 127.0.0.1:6379> georadius china:city 110 30 1000 km #在china:city中检索:以经纬度(110,30)为中心,半径为1000km内的位置列表 1) "chongqing" 2) "shenzhen" |