数据操作

Readme

所有命令及其选项都大小写不敏感

默认情况下所有区间都是闭区间

通过(修饰可以实现开区间,例如: (3,5指(3.5] 3,(5指[3,5)

-inf指负无穷大 +inf指正无穷大

位图部分行为以字节为单位

Database

数据库命令

SELECT

# 默认进入O号数据库,redis默认有0-15共16个数据库
[root@cloudhost ~]# redis-cli
# 切换数据库
127.0.0.1:6379> SELECT 3
OK

DBSIZE

# 输出的是键值对数量
127.0.0.1:6379[3]> 
(integer) 0
127.0.0.1:6379[3]> SET name ssydx
OK
127.0.0.1:6379[3]> DBSIZE
(integer) 1

FLUSHDB

# 清空当前数据库
127.0.0.1:6379[3]> FLUSHDB
OK
127.0.0.1:6379[3]> DBSIZE
(integer) 0

FLUSHALL

# 清空所有数据库
127.0.0.1:6379[3]> FLUSHALL
OK

Key

键命令

KEYS

# 获取所有键
127.0.0.1:6379> KEYS *
1) "age"
2) "set"
3) "hash"
4) "ls"
5) "name"

TYPE

# 查看键类型
127.0.0.1:6379> TYPE ls
list
127.0.0.1:6379> TYPE set
set
127.0.0.1:6379> TYPE hash
hash
127.0.0.1:6379> TYPE name
string

RANDOMKEY

# 随机获取键名
127.0.0.1:6379> RANDOMKEY
"age"
127.0.0.1:6379> RANDOMKEY
"set"

EXISTS

# 判断是否存在指定键
127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> EXISTS name1
(integer) 0

MOVE

# 将键值对移动到其他数据库
127.0.0.1:6379> MOVE age 1
(integer) 1

DEL

# 删除键值对
127.0.0.1:6379[1]> DEL age
(integer) 1

EXPIRE|PEXPIRE

# 设置过期时间-时间间隔,单位秒
127.0.0.1:6379> EXPIRE name 10
(integer) 1
# 等待10秒
127.0.0.1:6379> get name
(nil)
# 设置过期时间-时间间隔,单位毫秒
127.0.0.1:6379> PEXPIRE name 1000000
(integer) 1
# EXPIREAT
# PEXPIREAT

TTL|PTTL

# 查看距离过期剩余秒数
127.0.0.1:6379> TTL name
(integer) 995
# 查看距离过期剩余毫秒数
127.0.0.1:6379> PTTL name
(integer) 989586

PERSIST

# 设置键永不过期
127.0.0.1:6379> PERSIST name
(integer) 1
127.0.0.1:6379> TTL name
(integer) -1

其他命令

RENAME
RENAMENX
DUMP

String

字符串命令

SET

127.0.0.1:6379> SELECT 1
# 设置键值对,永不过期
127.0.0.1:6379[1]> SET k1 v1
OK
# 1000秒后过期
127.0.0.1:6379[1]> SET k2 v2 EX 1000
OK
# 10000000毫秒后过期
127.0.0.1:6379[1]> SET k3 v3 PX 10000000
OK
127.0.0.1:6379[1]> KEYS *
1) "k2"
2) "k1"
3) "k3"
127.0.0.1:6379[1]> TTL k1
(integer) -1
127.0.0.1:6379[1]> TTL k2
(integer) 961
127.0.0.1:6379[1]> PTTL k3
(integer) 9971520
# 存在该键才设置
127.0.0.1:6379[1]> SET k3 v4 NX
(nil)
# 不存在该键才设置
127.0.0.1:6379[1]> SET k4 v4 XX
(nil)

SETEX|PSETEX

# SET 命令也能实现以下操作

# 设置键值对并指定1000秒后过期
127.0.0.1:6379[1]> SETEX k5 1000 v5
OK
127.0.0.1:6379[1]> GET k5
"v5"
127.0.0.1:6379[1]> PTTL k5
(integer) 988009
# 设置键值对并指定10000毫秒后过期
127.0.0.1:6379[1]> PSETEX k6 10000 v6
OK
127.0.0.1:6379[1]> TTL k6
(integer) 3

GET

# 获取键对应的值
127.0.0.1:6379[1]> GET k1
"v1"

APPEND

127.0.0.1:6379[1]> EXISTS k1
(integer) 1
# 追加子串,已存在
127.0.0.1:6379[1]> APPEND k1 hello
(integer) 7
127.0.0.1:6379[1]> GET k1
"v1hello"
# 追加子串,不存在
127.0.0.1:6379[1]> EXISTS k4
(integer) 0
127.0.0.1:6379[1]> APPEND k4 hello
(integer) 5

STRLEN

127.0.0.1:6379[1]> STRLEN k1
(integer) 7

SETRANGE

127.0.0.1:6379[1]> GET k1
"v1hello"
# 设置子串,长度相等
127.0.0.1:6379[1]> SETRANGE k1 2 world
(integer) 7
127.0.0.1:6379[1]> GET k1
"v1world"
# 设置子串,旧短新长
127.0.0.1:6379[1]> SETRANGE k1 1 zhangsan
(integer) 9
127.0.0.1:6379[1]> GET k1
"vzhangsan"
# 设置子串,旧长新短
127.0.0.1:6379[1]> SETRANGE k1 1 aaaaa
(integer) 9
127.0.0.1:6379[1]> GET k1
"vaaaaasan"

GETRANGE

# 注意:和很多语言不同,其为闭区间,而不是左闭右开
127.0.0.1:6379[1]> SET k1 'hello world'
OK
127.0.0.1:6379[1]> GET k1
"hello world"
# 获取子串,只能到末尾
127.0.0.1:6379[1]> GETRANGE k1 3 8
"lo wor"
# 获取子串,直到末尾
127.0.0.1:6379[1]> GETRANGE k1 3 -1
"lo world"

MSET|MGET

# 批量设置
127.0.0.1:6379[1]> MSET key1 val1 key2 val2
OK
# 批量获取
127.0.0.1:6379[1]> MGET key1 key2
1) "val1"
2) "val2"
127.0.0.1:6379[1]> 

SETNX|MSETNX

# SETNX 和 SETEX 常常用来实现分布式锁,实际更推荐使用 SET, 可以在一个原子操作中完成两者,释放锁需要借助Lua脚本
# 看门狗机制实现自动续期,REDLOCK实现锁的一致性和可用性(即锁本身的分布式)
# 不存在时才设置
127.0.0.1:6379[1]> SETNX key1 value1
(integer) 0
# 不存在时才设置,注意:任意一个存在都会导致整体失败
127.0.0.1:6379[1]> MSETNX key1 value1 key3 value3
(integer) 0
127.0.0.1:6379[1]> MGET key1 key2 key3
1) "val1"
2) "val2"
3) (nil)

GETSET

# 获取并设置,键存在
127.0.0.1:6379[1]> GETSET key1 value1
"val1"
127.0.0.1:6379[1]> GET key1
"value1"
# 获取并设置,键不存在
127.0.0.1:6379[1]> GETSET key3 value3
(nil)
127.0.0.1:6379[1]> GET key3
"value3"

INCRE|INCREBY

# 注意:redis字符串类型其实是支持数字的,redis会自动进行推断
127.0.0.1:6379[1]> SET num1 5
OK
127.0.0.1:6379[1]> GET num1
"5"
# 自增
127.0.0.1:6379[1]> INCR num1
(integer) 6
127.0.0.1:6379[1]> GET num1
# 增加3
"6"
127.0.0.1:6379[1]> INCRBY num1 3
(integer) 9

# 字符型数字也会被视为数字
127.0.0.1:6379[1]> SET num2 "5"
OK
127.0.0.1:6379[1]> INCR num2
(integer) 6

# 非数字类型会报错
127.0.0.1:6379[1]> SET num3 str
OK
127.0.0.1:6379[1]> INCR num3
(error) ERR value is not an integer or out of range

DECR|DECRBY

# 逻辑同 INCRE|INCREBY
127.0.0.1:6379[1]> DECR num1
(integer) 8
127.0.0.1:6379[1]> DECRBY num1 5
(integer) 3

其他命令

INCRBYFLOAT

List

列表命令

LPUSH|RPUSH|LRANGE|LLEN|LPOP|RPOP

127.0.0.1:6379[1]> SELECT 2
# 头插
127.0.0.1:6379[2]> LPUSH ls1 one two three
(integer) 3
# 尾插
127.0.0.1:6379[2]> RPUSH ls1 1 2 3
(integer) 6
# 查看列表
127.0.0.1:6379[2]> LRANGE ls1 0 -1
1) "three"
2) "two"
3) "one"
4) "1"
5) "2"
6) "3"
# 列表长度
127.0.0.1:6379[2]> LLEN ls1
(integer) 6
# 头删
127.0.0.1:6379[2]> LPOP ls1
"three"
# 尾删
127.0.0.1:6379[2]> RPOP ls1
"3"

LINDEX|LINSERT|LREM|LTRIM

127.0.0.1:6379[2]> LRANGE ls1 0 -1
1) "two"
2) "one"
3) "1"
4) "2"
# 获取指定索引处的值
127.0.0.1:6379[2]> LINDEX ls1 1
"one"

# 设置指定索引处的值
127.0.0.1:6379[2]> LSET ls1 1 hello
OK
127.0.0.1:6379[2]> LINDEX ls1 1
"hello"
127.0.0.1:6379[2]> LINSERT ls1 BEFORE hello world
(integer) 5

# 前插
127.0.0.1:6379[2]> LRANGE ls1 0 -1
1) "two"
2) "world"
3) "hello"
4) "1"
5) "2"
# 后插
127.0.0.1:6379[2]> LINSERT ls1 AFTER hello ssydx
(integer) 6
127.0.0.1:6379[2]> LRANGE ls1 0 -1
1) "two"
2) "world"
3) "hello"
4) "ssydx"
5) "1"
6) "2"

# 删除指定数量的指定值
127.0.0.1:6379[2]> LRANGE ls1 0 -1
1) "two"
2) "world"
3) "hello"
4) "ssydx"
5) "1"
6) "ssydx"
7) "2"
# 删除超过存在的个数的指定值,不报错,返回实际删除的个数
127.0.0.1:6379[2]> LREM ls1 5 two
(integer) 1
# 删除少于存在的个数的指定值,从左(头)开始删除
127.0.0.1:6379[2]> LREM ls1 1 ssydx
(integer) 1
127.0.0.1:6379[2]> LRANGE ls1 0 -1
1) "world"
2) "hello"
3) "1"
4) "ssydx"
5) "2"

# 保留指定索引范围的值
127.0.0.1:6379[2]> LTRIM ls1 1 3
OK
127.0.0.1:6379[2]> LRANGE ls1 0 -1
1) "hello"
2) "1"
3) "ssydx"

LPUSHX|RPUSHX|RPOPLPUSH

# 列表存在才头插,此处不存在不插入
127.0.0.1:6379[2]> LPUSHX ls2 zhangsan
(integer) 0
# 列表存在才头插
127.0.0.1:6379[2]> LPUSHX ls1 zhangsan
(integer) 4
# 列表存在才尾插
127.0.0.1:6379[2]> RPUSHX ls1 lisi
(integer) 5
127.0.0.1:6379[2]> LRANGE ls1 0 -1
1) "zhangsan"
2) "hello"
3) "1"
4) "ssydx"
5) "lisi"

# 原列表进行尾删并头插到新列表,新列表不存在时会自动创建
127.0.0.1:6379[2]> RPOPLPUSH ls1 ls2
"lisi"
127.0.0.1:6379[2]> LRANGE ls1 0 -1
1) "zhangsan"
2) "hello"
3) "1"
4) "ssydx"
127.0.0.1:6379[2]> LRANGE ls2 0 -1
1) "lisi"

BLPOP|BRPOP

127.0.0.1:6379[2]> LPUSH ls3 one
(integer) 1
# 阻塞型头删
# 等待指定时间,一旦列表不为空就立刻返回键名和头删的元素,否则等待至超时,等待时间的单位是秒
127.0.0.1:6379[2]> BLPOP ls3 3
1) "ls3"
2) "one"
127.0.0.1:6379[2]> EXISTS ls3
(integer) 0
# 等待指定时间,一旦列表不为空就立刻返回键名和尾删的元素,否则等待至超时,等待时间的单位是秒
127.0.0.1:6379[2]> BLPOP ls3 3
(nil)
(3.05s)

# 同理,阻塞型尾删
127.0.0.1:6379[2]> BRPOP ls3 3
(nil)
(3.00s)

# 多列表阻塞型头删
# 按照给定的顺序,此处ls3(空),ls2(非空),返回首个非空列表的尾删结果
127.0.0.1:6379[2]> BLPOP ls3 ls2 3
1) "ls2"
2) "lisi"

# 多列表阻塞型尾删
# 按照给定的顺序,此处ls1(非空),ls3(空),返回首个非空列表的尾删结果
127.0.0.1:6379[2]> BRPOP ls1 ls3 3
1) "ls1"
2) "ssydx"
# 按照给定的顺序,此处ls1(非空),ls2(非空),返回首个非空列表的尾删结果
127.0.0.1:6379[2]> BRPOP ls1 ls2 3
1) "ls1"
2) "1"


# 同理,阻塞型尾删头插
127.0.0.1:6379[2]> BRPOPLPUSH ls3 ls2 3
(nil)
(3.10s)

Set

集合命令

SADD|SCARD|SMEMBERS|SRANDMEMBER|SISMEMBER

127.0.0.1:6379[2]> SELECT 3
# 添加元素,重复元素被忽略
127.0.0.1:6379[3]> SADD set1 one two three one four five
(integer) 5
# 元素个数
127.0.0.1:6379[3]> SCARD set1
(integer) 5
# 查看集合
127.0.0.1:6379[3]> SMEMBERS set1
1) "four"
2) "one"
3) "three"
4) "two"
5) "five"

# 随机获取指定个数,小于元素个数
127.0.0.1:6379[3]> SRANDMEMBER set1 3
1) "one"
2) "five"
3) "two"
# 随机获取指定个数,大于元素个数,返回全部
127.0.0.1:6379[3]> SRANDMEMBER set1 10
1) "four"
2) "one"
3) "two"
4) "three"
5) "five"

# 判断是否存在于集合
127.0.0.1:6379[3]> SISMEMBER set1 one
(integer) 1
# 判断是否存在于集合
127.0.0.1:6379[3]> SISMEMBER set1 ten
(integer) 0

SPOP|SREM|SMOVE

# 随机删除指定个数
127.0.0.1:6379[3]> SPOP set1 3
1) "three"
2) "two"
3) "one"
127.0.0.1:6379[3]> SCARD set1
(integer) 2

# 删除指定元素
127.0.0.1:6379[3]> SREM set1 ten
(integer) 0
# 删除指定元素
127.0.0.1:6379[3]> SREM set1 four
(integer) 1

# 移动集合的指定元素到另一集合
127.0.0.1:6379[3]> SMOVE set1 set2 five
(integer) 1
127.0.0.1:6379[3]> SMEMBERS set1
(empty list or set)
127.0.0.1:6379[3]> SMEMBERS set2
1) "five"

SDIFF|SINTER|SUNION

127.0.0.1:6379[3]> SADD seta a b c d e
(integer) 5
127.0.0.1:6379[3]> SADD setb a c d f g h
(integer) 6
# 差集
127.0.0.1:6379[3]> SDIFF seta setb
1) "e"
2) "b"
# 交集
127.0.0.1:6379[3]> SINTER seta setb
1) "d"
2) "a"
3) "c"
# 并集
127.0.0.1:6379[3]> SUNION seta setb
1) "b"
2) "d"
3) "e"
4) "g"
5) "f"
6) "a"
7) "h"
8) "c"

# 以上三个命令不仅支持两个集合的差交并,也支持更多集合的

其他命令

SDIFFSTORE
SINTERSTORE
SUNIONSTORE
SSCAN

Hash

哈希命令

HSET|HLEN|HEXISTS|HSTRLEN|HGET

127.0.0.1:6379[3]> SELECT 4
# 设置子键值对
127.0.0.1:6379[4]> HSET hash1 k1 v1
(integer) 1
127.0.0.1:6379[4]> HSET hash1 k2 v2
(integer) 1
127.0.0.1:6379[4]> HSET hash1 k3 v3
(integer) 1
# 子键值对数量
127.0.0.1:6379[4]> HLEN hash1
(integer) 3

# 指定子键是否存在
127.0.0.1:6379[4]> HEXISTS hash1 k1
(integer) 1
# 指定子键是否存在
127.0.0.1:6379[4]> HEXISTS hash1 k4
(integer) 0

# 指定子键对应的值的字符串长度
127.0.0.1:6379[4]> HSTRLEN hash1 k1
(integer) 2
# 获取子键对应的值
127.0.0.1:6379[4]> HGET hash1 k1
"v1"

HGETALL|HKEYS|HVALS

# 获取所有子键值对
127.0.0.1:6379[4]> HGETALL hash1
1) "k1"
2) "v1"
3) "k2"
4) "v2"
5) "k3"
6) "v3"
# 获取所有子键
127.0.0.1:6379[4]> HKEYS hash1
1) "k1"
2) "k2"
3) "k3"
# 获取所有子键对应的值
127.0.0.1:6379[4]> HVALS hash1
1) "v1"
2) "v2"
3) "v3"

HMSET|HMSET

# 批量设置子键值对
127.0.0.1:6379[4]> HMSET hash1 key1 val1 key2 val2 key3 val3
OK
# 批量获取子键对应的值
127.0.0.1:6379[4]> HMSET hash1 key1 key2 key3
1) "val1"
2) "val2"
3) "val3"

HSETNX

# 不存在时才设置
127.0.0.1:6379[4]> HSETNX hash1 key1 value1
(integer) 0
127.0.0.1:6379[4]> HSETNX hash1 key4 value4
(integer) 1

HDEL

# 删除指定子键
127.0.0.1:6379[4]> HDEL hash1 key1 key2 key3 key4
(integer) 4

HINCRBY

127.0.0.1:6379[4]> HMSET hash2 k1 5 k2 15
OK
127.0.0.1:6379[4]> HINCRBY hash2 k1 3
(integer) 8
127.0.0.1:6379[4]> HINCRBY hash2 k2 -3
(integer) 12

其他命令

HINCRBYFLOAT
HSCAN

Zset

有序集合命令

ZADD|ZCARD|ZRANGE|ZREVRANGE

127.0.0.1:6379[4]> SELECT 5
OK
# 设置集合元素,还有一些附带选项,自行探索
127.0.0.1:6379[5]> ZADD zset1 1 one 2 two 3 three 4 four
(integer) 4

# 集合元素数量
127.0.0.1:6379[5]> ZCARD zset1
(integer) 4

# 权重在指定范围的元素数量
127.0.0.1:6379[5]> ZCOUNT zset2 3 7
(integer) 2

# 注意:0 -1 前者表示start -1表示stop
# 查看集合
127.0.0.1:6379[5]> ZRANGE zset1 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
# 带权重查看
127.0.0.1:6379[5]> ZRANGE zset1 0 -1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "four"
8) "4"

# 逆序
127.0.0.1:6379[5]> ZREVRANGE zset1 0 -1
1) "ten"
2) "eight"
3) "six"
4) "four"
5) "three"
6) "two"
7) "one"

ZRANGEBYSCORE|ZREVRANGEBYSCORE

127.0.0.1:6379[5]> ZADD zset1 6 six 8 eight 10 ten
(integer) 3
127.0.0.1:6379[5]> ZRANGEBYSCORE zset1 -inf +inf
1) "one"
2) "two"
3) "three"
4) "four"
5) "six"
6) "eight"
7) "ten"
# 带权重输出
127.0.0.1:6379[5]> ZRANGEBYSCORE zset1 (2 +inf WITHSCORES
 1) "three"
 2) "3"
 3) "four"
 4) "4"
 5) "six"
 6) "6"
 7) "eight"
 8) "8"
 9) "ten"
10) "10"
# 指定范围排序后偏移几条记录后取指定个数的记录
127.0.0.1:6379[5]> ZRANGEBYSCORE zset1 (2 +inf WITHSCORES LIMIT 1 3
1) "four"
2) "4"
3) "six"
4) "6"
5) "eight"
6) "8"

# ZREVRANGEBYSCORE 逆序后输出

ZRANK|ZREVRANK

127.0.0.1:6379[5]> ZRANGE zset1 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
5) "six"
6) "eight"
7) "ten"
# 排序从0开始
127.0.0.1:6379[5]> ZRANK zset1 eight
(integer) 5

# ZREVRANK 逆序后获取排名

ZSCORE

127.0.0.1:6379[5]> ZSCORE zset1 ten
"10"

ZREM

127.0.0.1:6379[5]> ZREM zset1 ten one
(integer) 2

ZINCREBY

127.0.0.1:6379[5]> ZINCRBY zset1 10 six
"16"
127.0.0.1:6379[5]> ZRANGE zset1 0 -1
1) "two"
2) "three"
3) "four"
4) "eight"
5) "six"
127.0.0.1:6379[5]> ZINCRBY zset1 10 six
"16"
127.0.0.1:6379[5]> ZINCRBY zset1 1 two
"3"
127.0.0.1:6379[5]> ZRANGE zset1 0 -1 WITHSCORES
 1) "three"
 2) "3"
 3) "two"
 4) "3"
 5) "four"
 6) "4"
 7) "eight"
 8) "8"
 9) "six"
10) "16"

ZREMRANGEBYRANK|ZREMRANGEBYSCORE

# 删除指定排名范围的元素
127.0.0.1:6379[5]> ZREMRANGEBYRANK zset1 3 4
(integer) 2
127.0.0.1:6379[5]> ZRANGE zset1 0 -1 WITHSCORES
1) "three"
2) "3"
3) "two"
4) "3"
5) "four"
6) "4"

# ZREMRANGEBYSCORE 同理删除指定权重范围的元素

字典区间类命令

# 只适用于权重值相同的集合元素,用于按字典序进行操作
ZLEXCOUNT key min max
ZRANGEBYLEX key min max [LIMIT offset count]
ZREVRANGEBYLEX key max min [LIMIT offset count]
ZREMRANGEBYLEX key min max

队列操作命令

# 非阻塞队列
ZPOPMIN key [count]
ZPOPMAX key [count]
# 阻塞队列
BZPOPMIN key [key...] timeout
BZPOPMAX key [key...] timeout

集合操作命令

ZDIFF numkeys key [key...] [WITHSCORES]
ZINTER numkeys key [key...]
ZUNION numkeys key [key...]

其他命令

ZDIFFSTORE destination numkeys key [key...]
ZINTERSTORE destination numkeys key [key...]
ZUNIONSTORE destination numkeys key [key...]
ZSCAN key cursor [MATCH pattern] [COUNT count]

Geo

地理位置命令

测试数据

城市	经度		 纬度		 拼音
北京	116.407001 39.904600 beijing
上海	121.474000 31.230001 shanghai
广州	113.264999 23.129101 guangzhou
深圳	114.058000 22.542800 shenzhen
苏州	120.585999 31.297301 suzhou
杭州	120.209000 30.247100 hangzhou
南京	118.796000 32.058300 nanjing
武汉	114.305001 30.592800 wuhan
宁波	121.624273 29.860428 ningbo
重庆	116.407001 39.904600 chongqing
成都	104.066284 30.572939 chengdu
西安	108.940000 34.341101 xian
郑州	113.625000 34.747201 zhengzhou
青岛	120.383000 36.066099 qingdao

GEOADD

127.0.0.1:6379[5]> SELECT 6
OK
# 插入地理位置
# GEOADD key longitude latitude member [longitude latitude member ...]
127.0.0.1:6379[6]> GEOADD china 116.407001 39.904600 beijing 121.474000 31.230001 shanghai 113.264999 23.129101 guangzhou 114.058000 22.542800 shenzhen 120.585999 31.297301 suzhou 120.209000 30.247100 hangzhou 118.796000 32.058300 nanjing 114.305001 30.592800 wuhan 121.624273 29.860428 ningbo 116.407001 39.904600 chongqing 104.066284 30.572939 chengdu 108.940000 34.341101 xian 113.625000 34.747201 zhengzhou 120.383000 36.066099 qingdao

GEOPOS

# 查看指定城市的经纬度
# GEOPOS key member [member ...]
127.0.0.1:6379[6]> GEOPOS china beijing ningbo
1) 1) "116.40699952840805054"
   2) "39.9046006105751232"
2) 1) "121.62427157163619995"
   2) "29.86042836405917456"

GEOHASH

# 获取指定城市的经纬度hash后的字符串,字符串越相似距离越近
# GEOHASH key member [member ...]
127.0.0.1:6379[6]> GEOHASH china shanghai shenzhen
1) "wtw3sjnxvq0"
2) "ws105ry9240"

GEODIST

# 直线距离
# GEODIST key member1 member2 [m|km|ft|mi]
# m:米,默认单位	km:千米	mi:英里	ft :英尺。
127.0.0.1:6379[6]> GEODIST china suzhou shanghai
"84757.3936"
127.0.0.1:6379[6]> GEODIST china beijing shanghai km
"1067.7185"

GEORADIUS|GEORADIUSBYMEMBER

# 基于指定经纬度查询指定半径的城市及其直线距离和经纬度
# GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
# GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
# 注意:所有with的选项和store的选项互斥,store选项之间也互斥
# store选项会把数据存储到有序集合中
127.0.0.1:6379[6]> GEORADIUS china 115 35 300 km WITHHASH
1) 1) "zhengzhou"
   2) (integer) 4064941973330510
127.0.0.1:6379[6]> GEORADIUS china 115 35 800 km WITHCOORD WITHDIST 
 1) 1) "zhengzhou" # 城市名称
    2) "128.5818" # 直线距离
    3) 1) "113.62500160932540894" # 经度
       2) "34.74720093294700263" # 纬度
 2) 1) "nanjing"
    2) "480.4742"
    3) 1) "118.79600018262863159"
       2) "32.0583002896489333"
 3) 1) "qingdao"
    2) "501.3811"
    3) 1) "120.38299888372421265"
       2) "36.06609999794931554"
 4) 1) "beijing"
    2) "559.4648"
    3) 1) "116.40699952840805054"
       2) "39.9046006105751232"
 5) 1) "chongqing"
    2) "559.4648"
    3) 1) "116.40699952840805054"
       2) "39.9046006105751232"
 6) 1) "wuhan"
    2) "494.4799"
    3) 1) "114.30500060319900513"
       2) "30.59280055695393941"
 7) 1) "hangzhou"
    2) "719.1873"
    3) 1) "120.20899862051010132"
       2) "30.24710007691633251"
 8) 1) "suzhou"
    2) "663.2751"
    3) 1) "120.58599919080734253"
       2) "31.29730095598060302"
 9) 1) "shanghai"
    2) "734.2831"
    3) 1) "121.47399812936782837"
       2) "31.23000157447899738"
10) 1) "xian"
    2) "559.0813"
    3) 1) "108.93999785184860229"
       2) "34.34110058240350583"
# 基于指定经纬度查询指定半径的城市及其直线距离和经纬度,按距离升序取出前五个
# 即使不指定ASC也可以,默认即取出距离最近的n个
127.0.0.1:6379[6]> GEORADIUS china 115 35 800 km WITHCOORD WITHDIST COUNT 5 ASC
1) 1) "zhengzhou"
   2) "128.5818"
   3) 1) "113.62500160932540894"
      2) "34.74720093294700263"
2) 1) "nanjing"
   2) "480.4742"
   3) 1) "118.79600018262863159"
      2) "32.0583002896489333"
3) 1) "wuhan"
   2) "494.4799"
   3) 1) "114.30500060319900513"
      2) "30.59280055695393941"
4) 1) "qingdao"
   2) "501.3811"
   3) 1) "120.38299888372421265"
      2) "36.06609999794931554"
5) 1) "xian"
   2) "559.0813"
   3) 1) "108.93999785184860229"
      2) "34.34110058240350583"
# 把结果存储到有序集合中,注意此处的权重是经纬度hash后的整数
127.0.0.1:6379[6]> GEORADIUS china 115 35 800 km COUNT 5 ASC STORE citys
(integer) 5
127.0.0.1:6379[6]> TYPE citys
zset
127.0.0.1:6379[6]> ZRANGE citys 0 -1 WITHSCORES
 1) "xian"
 2) "4040116417781167"
 3) "wuhan"
 4) "4052121461471153"
 5) "zhengzhou"
 6) "4064941973330510"
 7) "nanjing"
 8) "4066006847772383"
 9) "qingdao"
10) "4067545186376599"
# 把结果存储到有序集合中,注意此处的权重是距指定经纬度的距离
127.0.0.1:6379[6]> GEORADIUS china 115 35 800 km COUNT 5 ASC STOREDIST city_dists
(integer) 5
127.0.0.1:6379[6]> TYPE city_dists
zset
127.0.0.1:6379[6]> ZRANGE city_dists 0 -1 WITHSCORES
 1) "zhengzhou"
 2) "128.58183420777524"
 3) "nanjing"
 4) "480.4742301934462"
 5) "wuhan"
 6) "494.47987039655112"
 7) "qingdao"
 8) "501.38111037505377"
 9) "xian"
10) "559.08132388792546"

# GEORADIUSBYMEMBER 同理

其他命令

# 只读形式的方法,ro即readonly
georadius_ro
georadiusbynumber_ro

HyperLogLog

基数统计命令

PFADD

# 添加元素
# PFADD key element [element ...]
127.0.0.1:6379[6]> SELECT 7
OK
127.0.0.1:6379[7]> PFADD hp 1 2 3 4 5 6 7 8 9 2 4 6 14 67 24 56 23 45 23 76 45 23 12 45 67 32 45 57 89 32 43
(integer) 1

PFCOUNT

# 获取基数
# PFCOUNT key [key ...]
127.0.0.1:6379[7]> PFCOUNT hp
(integer) 21
127.0.0.1:6379[7]> PFADD hp 34 35 67 23 65 78 43 12 67 f hg sadf dgh est wer dg dfg adf
(integer) 1
127.0.0.1:6379[7]> PFCOUNT hp
(integer) 34

PFMERGE

# 合并基数
# PFMERGE destkey sourcekey [sourcekey ...]
127.0.0.1:6379[7]> PFADD hp1 1 2 3 4 5 6 2 3
(integer) 1
127.0.0.1:6379[7]> PFADD hp2 2 4 5 6 7 8 8 7
(integer) 1
127.0.0.1:6379[7]> PFADD hp3 1 3 6 7 
(integer) 1
127.0.0.1:6379[7]> PFCOUNT hp1
(integer) 6
127.0.0.1:6379[7]> PFCOUNT hp2
(integer) 6
127.0.0.1:6379[7]> PFCOUNT hp3
(integer) 4
127.0.0.1:6379[7]> PFMERGE hp_merge hp1 hp2 hp3
OK
127.0.0.1:6379[7]> PFCOUNT hp_merge
(integer) 8

Bitmaps

位图命令

SETBIT|GETBIT

127.0.0.1:6379[7]> SELECT 8
OK
# 设置位
127.0.0.1:6379[8]> SETBIT login 0 1
(integer) 0
127.0.0.1:6379[8]> SETBIT login 1 1
(integer) 0
127.0.0.1:6379[8]> SETBIT login 2 1
(integer) 0
127.0.0.1:6379[8]> SETBIT login 3 0
(integer) 0
127.0.0.1:6379[8]> SETBIT login 4 0
(integer) 0
127.0.0.1:6379[8]> SETBIT login 5 0
(integer) 0
127.0.0.1:6379[8]> SETBIT login 6 1
(integer) 0
127.0.0.1:6379[8]> SETBIT login 7 1
(integer) 0
127.0.0.1:6379[8]> SETBIT login 8 0
(integer) 0
127.0.0.1:6379[8]> SETBIT login 9 0
(integer) 0
127.0.0.1:6379[8]> SETBIT login 10 1
(integer) 0
127.0.0.1:6379[8]> SETBIT login 11 1
(integer) 0
127.0.0.1:6379[8]> SETBIT login 12 1
(integer) 0
127.0.0.1:6379[8]> SETBIT login 13 1
(integer) 0
127.0.0.1:6379[8]> SETBIT login 14 0
(integer) 0
127.0.0.1:6379[8]> SETBIT login 15 0
(integer) 0
127.0.0.1:6379[8]> SETBIT login 16 0
(integer) 0

127.0.0.1:6379[8]> TYPE login
string
# 获取位
127.0.0.1:6379[8]> GETBIT login 3
(integer) 0

BITCOUNT

# 获取整个位图的1位的个数
127.0.0.1:6379[8]> BITCOUNT login
(integer) 9
# 等价
127.0.0.1:6379[8]> BITCOUNT login 0 -1
(integer) 9
# 此处也等价(特殊)
127.0.0.1:6379[8]> BITCOUNT login 0 1
(integer) 9
# 注意:按字节偏移而不是位
127.0.0.1:6379[8]> BITCOUNT login 0 0
(integer) 5
# 注意:按字节偏移而不是位
127.0.0.1:6379[8]> BITCOUNT login 1 1
(integer) 4

BITPOS

# 返回的是整个位图中 bit 级别的索引,而不是相对于你传入的起始字节的偏移。
# 整个位图从左起第一个设置为0的位的索引
127.0.0.1:6379[8]> BITPOS login 0
(integer) 3
# 整个位图从左起第一个设置为1的位的索引
127.0.0.1:6379[8]> BITPOS login 1
(integer) 0
# 注意偏移按字节,此处指第二个字节中,也即8~15位中左数第一个0位在整个位图中的索引
127.0.0.1:6379[8]> BITPOS login 0 1 1
(integer) 8
# 注意偏移按字节,此处指第二个字节中,也即8~15位中左数第一个1位在整个位图中的索引
127.0.0.1:6379[8]> BITPOS login 1 1 1
(integer) 10

BITOP

# # 支持 AND | OR | XOR | NOT
# 操作以字节为单位

# 例如:对两个位图 bita, bitb(其中 bita 长度大于 bitb )进行操作
# bita 会扩展到整数字节 bita',bitb 扩展到跟 bita' 一样长的 bitb'

# 例如:对单个位图 bit 进行操作,会扩展到整数字节 bit'

# 扩展用0填充尾部

# 位图1
127.0.0.1:6379[8]> SETBIT bit1 0 1
(integer) 0
127.0.0.1:6379[8]> SETBIT bit1 1 1
(integer) 0
127.0.0.1:6379[8]> SETBIT bit1 2 0
(integer) 0
127.0.0.1:6379[8]> SETBIT bit1 3 0
(integer) 0
127.0.0.1:6379[8]> SETBIT bit1 4 1
(integer) 0
# 位图2
127.0.0.1:6379[8]> SETBIT bit2 0 0
(integer) 0
127.0.0.1:6379[8]> SETBIT bit2 1 1
(integer) 0
127.0.0.1:6379[8]> SETBIT bit2 2 1
(integer) 0

# 实际 bit1: 11001000
# 实际 bit2: 01100000

# 或运算
127.0.0.1:6379[8]> BITOP OR bit_or bit1 bit2
(integer) 1
127.0.0.1:6379[8]> BITCOUNT bit_or
(integer) 4

# 且运算
127.0.0.1:6379[8]> BITOP AND bit_and bit1 bit2
(integer) 1
127.0.0.1:6379[8]> BITCOUNT bit_and
(integer) 1

# 异或运算
127.0.0.1:6379[8]> BITOP XOR bit_xor bit1 bit2
(integer) 1
127.0.0.1:6379[8]> BITCOUNT bit_xor
(integer) 3

# 非运算,此处结果是5,原因依然是操作以字节为单位
127.0.0.1:6379[8]> BITOP NOT bit_not bit1
(integer) 1
127.0.0.1:6379[8]> BITCOUNT bit_not
(integer) 5

其他命令

BITFIELD

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务