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
储存的字符串值的指定部分, 字符串的截取范围由start
和end
两个偏移量决定 (包括 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 a
、LPUSH mylist b
和LPUSH 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 a
、RPUSH mylist b
、RPUSH 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
列表的的头元素
举个例子,你有两个列表source
和destination
,source
列表有元素a, b, c
,destination
列表有元素x, y, z
,执行RPOPLPUSH source destination
之后,source
列表包含元素a, b
,destination
列表包含元素c, x, y, z
,并且元素c
会被返回给客户端。
如果source
不存在,值nil
被返回,并且不执行其他动作。
如果source
和destination
相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(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)参数start
和stop
都以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
中指定区间内的元素,区间以偏移量start
和stop
指定。
下标(index)参数start
和stop
都以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
已经是有序集的成员,那么更新这个member
的score
值,并通过重新插入这个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
中,成员member
的score
值;不存在,返回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
的成员member
的score
值加上增量increment
。
可以通过传递一个负数值increment
,让score
减去相应的值,比如ZINCRBY key -5 member
,就是让member
的score
值减去 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的比特位的数量
一般情况下,给定的整个字符串都会被进行计数,通过指定额外的start
或end
参数,可以让计数只在特定的位上进行
start
和end
参数的设置,可以使用负数值: 比如-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