redis基础

redis学习

Redis简介

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型

Redis安装

redis可以安装在linux、window等平台上,在这里我们主要学习安装到doker中

#1.下载redis镜像
docker pull redis  

#2.启动redis容器, 
# -v 绑定宿主机的配置文件到容器内的配置文件,这样以后修改配置,直接改宿主机的配置就行
# -v 将redis持久化数据目录映射到宿主机,方便以后迁移 
# -p 将宿主机的3306端口与容器的3306端口映射起来
docker run -d -v /e/docker-config/redis/redis.conf:/usr/local/etc/redis/redis.conf  -v /e/docker-config/redis/data/:/data -p 6379:6379 --name myredis --restart always redis:latest redis-server /usr/local/etc/redis/redis.conf 

基础数据结构

字符串(String)

基本信息

string是最基本的类型,一个key对应一个value

string是二进制安全的(在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译等,如果被攻击,能够及时检测出来),意味着redis可以存储任何类型的数据,例如图片或者是序列化的Java对象

栗子:c中strlen()函数如果这样使用strlen("123\0222"),结果是3,因为c中是以\0作为结尾分隔符号,只能识别123。简而言之,传过来的是什么就是什么,不会因为其他改变就是二进制安全

常用命令

SET key value [EX seconds] [px milliseconds] [NX|XX]

可用版本:>=1.0.0

将字符串值value关联到key,如果key已经持有其他值,SET 就覆写旧值, 无视类型;当SET命令对一个带有生存时间(TTL)的键进行设置之后,该键原有的 TTL 将被清除

从 Redis 2.6.12 版本开始, SET 命令的行为可以通过一系列参数来修改:

  • EX seconds: 将键的过期时间设置为 seconds 秒, 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value
  • PX milliseconds: 将键的过期时间设置为milliseconds毫秒, 执行 SET key value PX milliseconds的效果等同于执行PSETEX key milliseconds value
  • NX:只在键不存在时, 才对键进行设置操作。 执行SET key value NX的效果等同于执行SETNX key value
  • XX:只在键已经存在时, 才对键进行设置操作

GET key

可用版本:>= 1.0.0

返回与键 key 相关联的字符串值,如果键 key 不存在,那么返回特殊值nil;否则,返回键key的值;如果键 key 的值并非字符串类型,那么返回一个错误,因为 GET 命令只能用于字符串值


GET SET key value

可用版本:>= 1.0.0

将键key的值设为value, 并返回键key在被设置之前的旧值

# 没有旧值,返回 nil
> getset zzz 123  
null
> get zzz
123
 # 返回旧值 mongodb
> getset zzz 456
123
> get zzz
456

STRLEN key

可用版本:>= 1.0.0

STRLEN 命令返回字符串值的长度

> set ceshi "123456"
OK
> strlen ceshi
6
#当key不存在时,返回0
> strlen nothing
0
> set ceshi2 1
OK

APPEND key value

可用版本:>= 2.0.0

如果键key已经存在并且它的值是一个字符串,APPEND命令将把value追加到键key现有值的末尾。

如果key不存在,APPEND就简单地将键key的值设为value, 就像执行SET key value一样。

#确保test不存在
> EXISTS  test  
0
# 对不存在的 key 进行 APPEND ,等同于 SET myphone "nokia"
> APPEND test "123"
3
# 字符长度
> GET test
123
# 长度从 3 个字符增加到 11 个字符
> APPEND test " -- 6666"
11
> GET test
123 -- 6666

SETRANGE key offset value

可用版本:>= 2.2.0

从偏移量offset开始, 用value参数覆写(overwrite)键key储存的字符串值。

不存在的键key当作空白字符串处理

> SET test2 "12345678"
OK
> SETRANGE test2 6 "OOO"
9
> GET test2
123456OOO

> EXISTS emp_str
0
# 对不存在的 key 使用 SETRANGE
> SETRANGE emp_str 6 "TTT"
9
# 空白处被"\x00"填充
> GET emp_str
\x00\x00\x00\x00\x00\x00TTT
GETRANGE key start end

可用版本:>= 2.2.0

返回键key储存的字符串值的指定部分, 字符串的截取范围由startend两个偏移量决定 (包括 start 和 end 在内)。

负数偏移量表示从字符串的末尾开始计数,-1表示最后一个字符,-2表示倒数第二个字符, 以此类推。

GETRANGE通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。

> SET RD "hello_redis"
OK
# 返回索引0-4的字符,包括4。
> GETRANGE RD 0 4
hello
# 不支持回绕操作
> GETRANGE RD -1 -5
""
# 负数索引
> GETRANGE RD -3 -1
dis
# 从第一个到最后一个
> GETRANGE RD 0 -1
hello_redis
# 值域范围不超过实际字符串,超过部分自动被符略
> GETRANGE RD 0 1008611
hello_redis
INCR key

可用版本:>= 1.0.0

为键key储存的数字值加上一。如果key不存在,那么它的值会被初始化0,在执行INCR命令,如果key存储的值不能被解释为数字,会返回一个错误

INCRBY key increment

可用版本:>= 1.0.0

为键key储存的数字值加上增量increment,其他表现与INCR key类似

INCRBYFLOAT key increment

可用版本:>= 2.6.0

DECR key

可用版本:>= 1.0.0

为键key储存的数字值减去一,是INCR的反操作

DECRBY key decrement

可用版本:>= 1.0.0

将键key储存的整数值减去减量decrement

MSET key value [key value …]

可用版本:>= 1.0.1

同时为多个键设置值

如果某个给定键已经存在, 那么MSET将使用新值去覆盖旧值, 如果这不是你所希望的效果, 请考虑使用MSETNX命令, 这个命令只会在所有给定键都不存在的情况下进行设置

MSET是一个原子性(atomic)操作, 所有给定键都会在同一时间内被设置, 不会出现某些键被设置了但是另一些键没有被设置的情况

#同时对多个键进行设置
redis> MSET date "z1" time "z2" weather "z3"
OK

redis> MGET date time weather
1) "z1"
2) "z2"
3) "z3"

#覆盖已有的值
redis> MGET k1 k2
1) "hello"
2) "world"

redis> MSET k1 "good" k2 "bye"
OK

redis> MGET k1 k2
1) "good"
2) "bye"
MSETNX key value [key value …]

可用版本: >= 1.0.1

当且仅当所有给定键都不存在时, 为所有给定键设置值,
即使只有一个给定键已经存在,MSETNX命令也会拒绝执行对所有键的设置操作。

MSETNX是一个原子性(atomic)操作, 所有给定键要么就全部都被设置, 要么就全部都不设置, 不可能出现第三种状态

MGET key [key …]

可用版本: >= 1.0.0

返回给定的一个或多个字符串键的值,如果给定的字符串键里面, 有某个键不存在, 那么这个键的值将以特殊值nil表示

哈希表(Hash)

基本信息

哈希类型 是指键值本身又是一个 键值对结构

常用命令

HSET hash field value

可用版本: >= 2.0.0

将哈希表hash中域field的值设置为value

如果给定的哈希表并不存在,那么一个新的哈希表将被创建并执行HSET操作

如果域field已经存在于哈希表中, 那么它的旧值将被新值value覆盖

#设置一个新值,返回1
redis> HSET user name 1
(integer) 1

redis> HGET user name
"1"

#对一个已存在的值进行更新,返回0
redis> HSET user name zxxx
(integer) 0

redis> HGET user name
"zxxx"s

HSETNX hash field value

可用版本: >= 2.0.0

当且仅当域field尚未存在于哈希表的情况下,将它的值设置为value

如果给定域已经存在于哈希表当中, 那么命令将放弃执行设置操作

如果哈希表hash不存在, 那么一个新的哈希表将被创建并执行HSETNX命令

#设置一个新值
redis> HSETNX users name zhangshan
(integer) 1

redis> HGET users name
"zhangshan"

#设置一个已存在的值
redis> HSETNX users name lisi
(integer) 0

redis> HGET users name
"zhangshan"

HEXISTS hash field

可用版本: >= 2.0.0

检查给定域field是否存在于哈希表hash当中

#不存在
redis> HEXISTS user lisi
(integer) 0

#存在
redis> HEXISTS user lisi
(integer) 1

HDEL key field [field …]

可用版本: >= 2.0.0

删除哈希表key中的一个或多个指定域,不存在的域将被忽略

redis> hgetall user
1) "name"
2) "zxxx"
3) "age"
4) "111"
5) "role"
6) "admin"

#删除一个
redis> HDEL user name
(integer) 1

#删除不存在的key
redis> HDEL user not-exists-field
(integer) 0

#删除多个
# 删除多个域
redis> HDEL user zxxx age
(integer) 2

HLEN key

可用版本: >= 2.0.0

返回哈希表key中域的数量


HSTRLEN key field

可用版本: >= 3.2.0

返回哈希表key中,与给定域field相关联的值的字符串长度(string length)

如果给定的键或者域不存在, 那么命令返回 0 。


HINCRBY key field increment

可用版本: >= 2.0.0

为哈希表key中的域field的值加上增量increment

增量也可以为负数,相当于对给定域进行减法操作

如果key不存在,一个新的哈希表被创建并执行HINCRBY命令

如果域field不存在,那么在执行命令前,域的值被初始化为0

对一个储存字符串值的域field执行HINCRBY命令将造成一个错误

# increment 为正数

redis> HEXISTS counter page_view    # 对空域进行设置
(integer) 0

redis> HINCRBY counter page_view 200
(integer) 200

redis> HGET counter page_view
"200"


# increment 为负数

redis> HGET counter page_view
"200"

redis> HINCRBY counter page_view -50
(integer) 150

redis> HGET counter page_view
"150"


# 尝试对字符串值的域执行HINCRBY命令

redis> HSET myhash string hello,world       # 设定一个字符串值
(integer) 1

redis> HGET myhash string
"hello,world"

redis> HINCRBY myhash string 1              # 命令执行失败,错误。
(error) ERR hash value is not an integer

redis> HGET myhash string                   # 原值不变
"hello,world"

HINCRBYFLOAT key field increment

可用版本: >= 2.6.0

为哈希表key中的域field加上浮点数增量increment

当以下任意一个条件发生时,返回一个错误:

  • field的值不是字符串类型(因为redis中的数字和浮点数都以字符串的形式保存,所以它们都属于字符串类型)

  • field当前的值或给定的增量increment不能解释(parse)为双精度浮点数(double precision floating point number)


HMSET key field value [field value …]

可用版本: >= 2.0.0

同时将多个field-value(域-值)对设置到哈希表key

此命令会覆盖哈希表中已存在的域,如果key不存在,一个空哈希表被创建并执行HMSET操作。


HKEYS key

可用版本: >= 2.0.0

返回哈希表key中的所有域

列表(List)

基本信息

Redis列表是简单的字符串列表,按照插入顺序排序。可以对列表的两端插入和弹出元素(在列表中的字符串都可以称之为元素),除此之外还可以获取指定的元素列表,并且还可以通过索引下标获取指定元素等等

LPUSH key value [value …]

可用版本: >= 1.0.0

将一个或多个值value插入到列表key的表头

如果有多个value值,那么各个value值按从左到右的顺序依次插入到表头:比如说,对空列表mylist执行命令LPUSH mylist a b c,列表的值将是c b a,这等同于原子性地执行LPUSH mylist aLPUSH mylist bLPUSH mylist c三个命令

如果key不存在,一个空列表会被创建并执行LPUSH操作

key存在但不是列表类型时,返回一个错误

> lpush list1 zhangshan lisi wangwu
(integer) 3

> lrange list1 0 -1
1) "wangwu"
2) "lisi"
3) "zhangshan"

LPUSHX key value

可用版本: >= 2.2.0

将值value插入到列表key的表头,当且仅当key存在并且是一个列表。当key不存在时,LPUSHX命令什么也不做。

#对不存在的key执行lpushx
> lrange test 0 -1
(empty list or set)
> lpushx test qqq
(integer) 0
> lrange test 0 -1
(empty list or set)

#对存在的key执行lpushx
> lrange exitlist 0 -1
1) "qqq"
> lpushx exitlist "www"
(integer) 2
> lrange exitlist 0 -1
1) "www"
2) "qqq"

RPUSH key value [value …]

可用版本: >= 1.0.0

将一个或多个值value插入到列表key的表尾(最右边)

如果有多个value值,那么各个value值按从左到右的顺序依次插入到表尾:比如对一个空列表mylist执行RPUSH mylist a b c,得出的结果列表为a b c,等同于执行命令RPUSH mylist aRPUSH mylist bRPUSH mylist c

如果key不存在,一个空列表会被创建并执行RPUSH操作

key存在但不是列表类型时,返回一个错误

> rpush test "a"
(integer) 1
> rpush test "b"
(integer) 2
> lrange test 0 -1
1) "a"
2) "b"
RPUSHX key value

可用版本: >= 2.2.0

将值value插入到列表key的表尾,当且仅当key存在并且是一个列表,当key不存在时,RPUSHX命令什么也不做


LPOP key

可用版本: >= 1.0.0

移除并返回列表key的头元素。

> lpush test 111
(integer) 3
> lpush test 222
(integer) 4
> lrange test 0 -1
1) "222"
2) "111"
3) "a"
4) "b"
> lpop test
"222"
> lrange test 0 -1
1) "111"
2) "a"
3) "b"

RPOP key

可用版本: >= 1.0.0

移除并返回列表key的尾元素

> lrange test 0 -1
1) "111"
2) "a"
3) "b"
> rpop test
"b"
> lrange test 0 -1
1) "111"
2) "a"

RPOPLPUSH source destination

可用版本: >= 1.2.0

命令RPOPLPUSH在一个原子时间内,执行以下两个动作:

  • 将列表source中的最后一个元素(尾元素)弹出,并返回给客户端。
  • source弹出的元素插入到列表destination,作为destination列表的的头元素

举个例子,你有两个列表sourcedestinationsource列表有元素a, b, cdestination列表有元素x, y, z,执行RPOPLPUSH source destination之后,source列表包含元素a, bdestination列表包含元素c, x, y, z,并且元素c会被返回给客户端。

如果source不存在,值nil被返回,并且不执行其他动作。

如果sourcedestination相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。


LREM key count value

可用版本: >= 1.0.0

根据参数count的值,移除列表中与参数value相等的元素

count的值可以是以下几种:

  • count > 0: 从表头开始向表尾搜索,移除与value相等的元素,数量为count
  • count < 0: 从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值
  • count = 0: 移除表中所有与value相等的值
# 先创建一个表,内容排列是
# morning hello morning helllo morning

redis> LPUSH greet "morning"
(integer) 1
redis> LPUSH greet "hello"
(integer) 2
redis> LPUSH greet "morning"
(integer) 3
redis> LPUSH greet "hello"
(integer) 4
redis> LPUSH greet "morning"
(integer) 5

redis> LRANGE greet 0 4         # 查看所有元素
1) "morning"
2) "hello"
3) "morning"
4) "hello"
5) "morning"

redis> LREM greet 2 morning     # 移除从表头到表尾,最先发现的两个 morning
(integer) 2                     # 两个元素被移除

redis> LLEN greet               # 还剩 3 个元素
(integer) 3

redis> LRANGE greet 0 2
1) "hello"
2) "hello"
3) "morning"

redis> LREM greet -1 morning    # 移除从表尾到表头,第一个 morning
(integer) 1

redis> LLEN greet               # 剩下两个元素
(integer) 2

redis> LRANGE greet 0 1
1) "hello"
2) "hello"

redis> LREM greet 0 hello      # 移除表中所有 hello
(integer) 2                    # 两个 hello 被移除

redis> LLEN greet
(integer) 0

LLEN key

可用版本: >= 1.0.0

返回列表key的长度。如果key不存在,则key被解释为一个空列表,返回0;如果key不是列表类型,返回一个错误。


LINDEX key index

可用版本: >= 1.0.0

返回列表key中,下标为index的元素。

下标(index)参数startstop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。

你也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。


LINSERT key BEFORE|AFTER pivot value

可用版本: >= 2.2.0

将值value插入到列表key当中,位于值pivot之前或之后。

pivot不存在于列表key时,不执行任何操作。

key不存在时,key被视为空列表,不执行任何操作。

如果key不是列表类型,返回一个错误。


LSET key index value

将列表key下标为index的元素的值设置为value

index参数超出范围,或对一个空列表(key不存在)进行LSET时,返回一个错误。


LRANGE key start stop

返回列表key中指定区间内的元素,区间以偏移量startstop指定。

下标(index)参数startstop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推

你也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推

集合(Set)

基本信息

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据

SADD key member1 [member2]

可用版本: >= 1.0.0

将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略


SISMEMBER key member

可用版本: >= 1.0.0

判断member元素是否集合key的成员


SPOP key

可用版本: >= 1.0.0

移除并返回集合中的一个随机元素。

如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用SRANDMEMBER key [count]命令


SRANDMEMBER key [count]

可用版本: >= 1.0.0

如果命令执行时,只提供了key参数,那么返回集合中的一个随机元素。

从 Redis 2.6 版本开始,SRANDMEMBER命令接受可选的count参数:

如果count为正数,且小于集合基数,那么命令返回一个包含count个元素的数组,数组中的元素各不相同。如果count大于等于集合基数,那么返回整个集合。

如果count为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为count的绝对值。

该操作和SPOP key相似,但SPOP key将随机元素从集合中移除并返回,而 SRANDMEMBER 则仅仅返回随机元素,而不对集合进行任何改动


SREM key member [member …]

可用版本: >= 1.0.0

移除集合key中的一个或多个member元素,不存在的member元素会被忽略


SMOVE source destination member

可用版本: >= 1.0.0

member元素从source集合移动到destination集合

SMOVE是原子性操作

> SMEMBERS songs
1) "Billie Jean"
2) "Believe Me"

> SMEMBERS my_songs
(empty list or set)

> SMOVE songs my_songs "Believe Me"
(integer) 1

> SMEMBERS songs
1) "Billie Jean"

> SMEMBERS my_songs
1) "Believe Me"

SCARD key

可用版本: >= 1.0.0

返回集合key的基数(集合中元素的数量)


SMEMBERS key

可用版本: >= 1.0.0

返回集合key中的所有成员


SSCAN key cursor [MATCH pattern] [COUNT count]

可用版本: >= 1.0.0

迭代集合中键的元素

> SADD myset1 "hello"
(integer) 1
> SADD myset1 "hi"
(integer) 1
> SADD myset1 "bar"
(integer) 1
> sscan myset1 0 match h*
1) "0"
2) 1) "hello"
2) "hi"

SINTER key [key …]

可用版本: >= 1.0.0

返回一个集合的全部成员,该集合是所有给定集合的交集

> SMEMBERS myset1
1) "hello"
2) "hi"
3) "bar"
> SMEMBERS myset2
1) "qqwr"
2) "hello"
> SINTER myset1 myset2
1) "hello"

SINTERSTORE destination key [key …]

可用版本: >= 1.0.0

这个命令类似于SINTER key [key …]命令,但它将结果保存到destination集合,而不是简单地返回结果集。如果destination集合已经存在,则将其覆盖destination可以是key本身。


SUNION key [key …]

可用版本: >= 1.0.0

返回一个集合的全部成员,该集合是所有给定集合的并集

> smembers myset1
1) "hello"
2) "hi"
3) "bar"
> smembers myset2
1) "qqwr"
2) "hello"
> SUNION myset1 myset2
1) "qqwr"
2) "hello"
3) "hi"
4) "bar"

SUNIONSTORE destination key [key …]

可用版本: >= 1.0.0

这个命令类似于SUNION key [key …]命令,但它将结果保存到destination集合,而不是简单地返回结果集。如果destination已经存在,则将其覆盖。destination可以是key本身。


SDIFF key [key …]

可用版本: >= 1.0.0

返回一个集合的全部成员,该集合是所有给定集合之间的差集

> smembers myset1
1) "hello"
2) "hi"
3) "bar"
> smembers myset2
1) "qqwr"
2) "hello"
> SDIFF myset1 myset2
1) "hi"
2) "bar"

SDIFFSTORE destination key [key …]

可用版本: >= 1.0.0

这个命令的作用和SDIFF key [key …]类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。如果destination已经存在,则将其覆盖。destination可以是key本身。

有序集合(ZSet)

基本信息

Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复

ZADD key score member [[score member] [score member] …]

可用版本: >= 1.2.0

将一个或多个member元素及其score值加入到有序集key当中

如果某个member已经是有序集的成员,那么更新这个memberscore值,并通过重新插入这个member元素,来保证该member在正确的位置上。

score值可以是整数值或双精度浮点数

> ZADD rank 9 baidu.com 8 bing.com
(integer) 2
> ZRANGE rank 0 -1 WITHSCORES
1) "bing.com"
2) 8.0
3) "baidu.com"
4) 9.0

ZSCORE key member

可用版本: >= 1.2.0

返回有序集key中,成员memberscore值;不存在,返回nil

> ZRANGE rank 0 -1 WITHSCORES
1) "bing.com"
2) 8.0
3) "baidu.com"
4) 9.0
> ZSCORE key bing.com
(nil)
> ZSCORE rank bing.com
8.0
ZINCRBY key increment member

可用版本: >= 1.2.0

为有序集key的成员memberscore值加上增量increment

可以通过传递一个负数值increment,让score减去相应的值,比如ZINCRBY key -5 member,就是让memberscore值减去 5 。

key不存在,或member不是key的成员时,ZINCRBY key increment member等同于ZADD key increment member


ZCARD key

可用版本: >= 1.2.0

获取有序集合的成员数


ZCOUNT key min max

可用版本: >= 2.0.0

计算在有序集合中指定区间分数的成员数

# 测试数据
> ZRANGE salary 0 -1 WITHSCORES    
1) "jack"
2) "2000"
3) "peter"
4) "3500"
5) "tom"
6) "5000"
# 计算薪水在 2000-5000 之间的人数
> ZCOUNT salary 2000 5000          
(integer) 3
# 计算薪水在 3000-5000 之间的人数
> ZCOUNT salary 3000 5000          
(integer) 2

ZRANGE key start stop [WITHSCORES]

可用版本: >= 1.2.0

通过索引区间返回有序集合指定区间内的成员

# 显示整个有序集成员
> ZRANGE salary 0 -1 WITHSCORES 
1) "jack"
2) "3500"
3) "tom"
4) "5000"
5) "boss"
6) "10086"
# 显示有序集下标区间 1 至 2 的成员
> ZRANGE salary 1 2 WITHSCORES              
1) "tom"
2) "5000"
3) "boss"
4) "10086"
 # 测试 end 下标超出最大下标时的情况
> ZRANGE salary 0 200000 WITHSCORES        
1) "jack"
2) "3500"
3) "tom"
4) "5000"
5) "boss"
6) "10086"
# 测试当给定区间不存在于有序集时的情况
> ZRANGE salary 200000 3000000 WITHSCORES                  
(empty list or set)

ZREVRANGE key start stop [WITHSCORES]

可用版本: >= 1.2.0

返回有序集中指定区间内的成员,通过索引,分数从高到低


ZRANK key member

可用版本: >= 2.0.0

返回有序集合中指定成员的索引。如果成员是有序集key的成员,返回member的排名。如果成员不是有序集key的成员,返回nil


ZREVRANK key member

可用版本: >= 2.0.0

返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序


ZREM key member [member …]

可用版本: >= 1.2.0

移除有序集合中的一个或多个成员

高级数据结构

HyperLogLog

基本信息

HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的

PFADD key element [element …]

可用版本: >= 2.8.9

添加指定元素到 HyperLogLog 中

> PFADD myloglog a b c d e f g h i j
(integer) 0
> PFCOUNT myloglog
(integer) 10

PFCOUNT key [key …]

可用版本: >= 2.8.9

返回给定 HyperLogLog 的基数值,如果多个 HyperLogLog 则返回基数估值之和

> PFADD hll foo bar zap
(integer) 1
> PFADD hll zap zap zap
(integer) 0
> PFADD hll foo bar
(integer) 0
> PFCOUNT hll
(integer) 3

PFMERGE destkey sourcekey [sourcekey …]

可用版本: >= 2.8.9

将多个HyperLogLog合并为一个HyperLogLog,合并后的HyperLogLog的基数估算值是通过对所有 给定HyperLogLog进行并集计算得出的

> PFADD hll1 foo bar zap a
(integer) 1
> PFADD hll2 a b c foo
(integer) 1
> PFMERGE hll3 hll1 hll2
"OK"
> PFCOUNT hll3
(integer) 6

地理位置(GEO)

基本信息

这个功能可以将用户给定的地理位置(经度和纬度)信息储存起来,并对这些信息进行操作

GEOADD key longitude latitude member [longitude latitude member …]

可用版本: >= 3.2.0

将给定的空间元素(纬度、经度、名字)添加到指定的键里面。 这些数据会以有序集合的形式被储存在键里面

> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2

GEOPOS key member [member …]

可用版本: >= 3.2.0

从键里面返回所有给定位置元素的位置(经度和纬度)

> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2

> GEOPOS Sicily Palermo Catania NonExisting
1) 1) "13.361389338970184"
   2) "38.115556395496299"
2) 1) "15.087267458438873"
   2) "37.50266842333162"
3) (nil)

GEODIST key member1 member2 [unit]

可用版本: >= 3.2.0

返回两个给定位置之间的距离。

如果两个位置之间的其中一个不存在, 那么命令返回空值。

指定单位的参数unit必须是以下单位的其中一个

  • m 表示单位为米
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

如果用户没有显式地指定单位参数, 那么GEODIST默认使用米作为单位

> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2

> GEODIST Sicily Palermo Catania
"166274.15156960039"

> GEODIST Sicily Palermo Catania km
"166.27415156960038"

> GEODIST Sicily Palermo Catania mi
"103.31822459492736"

> GEODIST Sicily Foo Bar
(nil)

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]

可用版本: >= 3.2.0

以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素

> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2

> GEORADIUS Sicily 15 37 200 km WITHDIST
1) 1) "Palermo"
   2) "190.4424"
2) 1) "Catania"
   2) "56.4413"

> GEORADIUS Sicily 15 37 200 km WITHCOORD
1) 1) "Palermo"
   2) 1) "13.361389338970184"
      2) "38.115556395496299"
2) 1) "Catania"
   2) 1) "15.087267458438873"
      2) "37.50266842333162"

> GEORADIUS Sicily 15 37 200 km WITHDIST WITHCOORD
1) 1) "Palermo"
   2) "190.4424"
   3) 1) "13.361389338970184"
      2) "38.115556395496299"
2) 1) "Catania"
   2) "56.4413"
   3) 1) "15.087267458438873"
      2) "37.50266842333162"
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]

可用版本: >= 3.2.0

这个命令和GEORADIUS命令一样, 都可以找出位于指定范围内的元素, 但是GEORADIUSBYMEMBER的中心点是由给定的位置元素决定的, 而不是像GEORADIUS那样, 使用输入的经度和纬度来决定中心点。

> GEOADD Sicily 13.583333 37.316667 "Agrigento"
(integer) 1

> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2

> GEORADIUSBYMEMBER Sicily Agrigento 100 km
1) "Agrigento"
2) "Palermo"

GEOHASH key member [member …]

可用版本: >= 3.2.0

返回一个或多个位置元素的 Geohash 表示。

> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2

> GEOHASH Sicily Palermo Catania
1) "sqc8b49rny0"
2) "sqdtr74hyu0"

位图(bitmaps)

基本信息

Bitmaps 并不是实际的数据类型,而是定义在String类型上的一个面向字节操作的集合,Bitmaps 的最大优势之一在存储信息时极其节约空间

SETBIT key offset value

可用版本: >= 2.2.0

key所储存的字符串值,设置或清除指定偏移量上的位(bit)

> SETBIT bit 10086 1
(integer) 0

> GETBIT bit 10086
(integer) 1
GETBIT key offset

可用版本: >= 2.2.0

key所储存的字符串值,获取指定偏移量上的位(bit)

> SETBIT bit 10086 1
(integer) 0

> GETBIT bit 10086
(integer) 1
BITCOUNT key [start] [end]

可用版本: >= 2.6.0

计算给定字符串中,被设置为1的比特位的数量

一般情况下,给定的整个字符串都会被进行计数,通过指定额外的startend参数,可以让计数只在特定的位上进行

startend参数的设置,可以使用负数值: 比如-1表示最后一个字节,-2表示倒数第二个字节,以此类推

> BITCOUNT bits
(integer) 0

> SETBIT bits 0 1          # 0001
(integer) 0

> BITCOUNT bits
(integer) 1

> SETBIT bits 3 1          # 1001
(integer) 0

> BITCOUNT bits
(integer) 2
BITPOS key bit [start] [end]

可用版本: >= 2.8.7

返回位图中第一个值为bit的二进制位的位置

在默认情况下, 命令将检测整个位图, 但用户也可以通过可选的start参数和end参数指定要检测的范围

> SETBIT bits 3 1    # 1000
(integer) 0

> BITPOS bits 0
(integer) 0

> BITPOS bits 1
(integer) 3