redis 的数据类型和数据命令

Posted 风某人~Wind

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis 的数据类型和数据命令相关的知识,希望对你有一定的参考价值。

在了解redis的数据类型前,首先学习一个命令 help。使用命令redis-cli -h查看客户端的帮助信息,输入参数信息等。 执行 redis-cli命令,默认连接6379端口服务。 首先我们需要了解一个知识,redis有16个数据库,这些库的名字为0-15。可以通过 select 0来选择库,默认为0库,不同的库之间数据是隔离的。 然后我们在了解一个命令 help @group,使用这个命令我们可以自己查看redis的各种命令。

目录

string类型

set 添加一条数据

append value追加

get 根据key查询value

del 删除key

incr key 自增命令,每次自增1

incrby key increment 增加指定数字

decr key 自减,每次自减1

decrby key decrement 减少指定数据

incrbyfloat key increment 增加浮点数

strlen key 计算值的长度

setrange 设置指定偏移量的值

getrange 获取指定起始位置的值,终止位置可以为负数(-1),代表从倒数,但是起始位置不能为负数。

setnx 设置值当key不存在时,如果key已经存在,那么设置失败。

setex 设置值的过期时间

mset 设置多个值

mget 查看多个值

getset 获取旧值并设置新值

msetnx 设置多个值,只有当key不存在时才能设置成功,如果有一个key设置失败,那么则全都失败。

psetex 设置值,而且key将在指定毫秒数内过期。

** bitmap位图,下面的内容仍然数据string类型的命令,属于位运算。

getbit 获取二进制位的值

bitfield 对字符串任意位置进行位运算

list类型

lpush 从左边往列表中推数据

lrange 截取列表的元素

lset 设置指定索引的元素值

linsert 插入数据

rpush 从右边向列表中推入元素

llen 统计列表元素个数

lpop 从头部弹出一个元素

rpop 从尾部弹出一个元素

lpushx 当列表存在时,从头部添加数据

rpushx 当列表存在时,从尾部插入元素

rpopLpush 弹出列表的最后一个元素,并将它从头部插入新的列表。

lindex 根据索引查询元素

ltrim 将列表修剪到指定范围

lrem 删除元素,指定元素的值及删除个数

blpop,brpop,brpoplpush 阻塞的单播队列

set类型

sadd 添加集合

smembers 查看所有元素

scard 获取集合元素总数(集合长度)

srandmember key [count] 随机获取count个元素

sdiff key [key1, key2..] 取多个集合的差集

sdiffstore destination key [key1, key2..] 取差集并存入目标集合destination

sinter key [key1,key2..] 取key与多个集合的交集

sinterstore destination key [key1,key2..] 取多个集合的交集并存入新的集合

sunion key [key1,key2..] 取多个集合的并集

sunionstore destination key [key1, key2..] 取多个集合的并集存入新的集合

sismember key member 判断集合中是否存在成员

smove source destination member 移动source中的成员member到一个新的集合destination

spop key [count] 移除[count,默认1]个元素

srem key member [member...] 删除指定元素

sorted_set类型

zadd key [nx|xx] [ch] [incr] score member[score member..] 新增命令

zrange key start end [withsocres] 获取值

zrangebyscore 上面是按照索引取,还可以按照分数

zcard 获取元素总数

zcount key min max 获取某一个分数范围内的元素总数

zincyby key increment member 某一个成员增加分数

zrevrange 倒序按索引取数

zrevrangebyscore 倒序按分数取数

zscore 获取成员的分数

zrank 确定成员在排序集中的索引

zrevrank 确定成员在拍序集中的索引,排序集为倒序排序

zrem 移除指定成员

zunionStore 两个排序集取并集并存入新的排序集

zinterstore 取交集

zpopmax 弹出分数最高的成员

zpopmin 弹出分数最低的成员

zlexcount key min max

hash类型

hset key field value 设置hash类型的值

hgetall key 查看所有的键值对

hget key field 根据key获取value

hlen key 获取总的键值对数

hkeys key 获取所有的key(keySet)

hvals key 获取所有的值(valueSet)

hincrby key field increment 指定key对应的value增加指定数字

hincrbyfloat key field increment 增加float浮点数

hstrlen 值的长度

hsetnx 当key不存在时设置key,value,否则设置失败

hexists key field 查询指定key是否存在

hmset 设置多个值

hmget 获取多个值


使用命令 help @string来查看string类型的命令。根据help来学习string命令

set 添加一条数据

127.0.0.1:6379> set k1 hello
OK

append value追加

127.0.0.1:6379> append k1 redis
(integer) 10

get 根据key查询value

127.0.0.1:6379> get k1
"helloredis"

del 删除key

127.0.0.1:6379> del k1
(integer) 1

del命令不只针对string类型,所有类型的数据都可以通过del key的方式删除,del后面可以跟多个key,可以一次删除多条数据。

incr key 自增命令,每次自增1

127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> incr k1
(integer) 2
127.0.0.1:6379> incr k1
(integer) 3

incrby key increment 增加指定数字

127.0.0.1:6379> INCRBY k1 5
(integer) 8

decr key 自减,每次自减1

有增就有减

127.0.0.1:6379> DECR k1
(integer) 7

decrby key decrement 减少指定数据

127.0.0.1:6379> DECRBY k1 4
(integer) 3

incrbyfloat key increment 增加浮点数

127.0.0.1:6379> INCRBYFLOAT k1 3.5
"6.5"

注意自增浮点数后,数据类型变成了 ""string类型浮点数,之前都是(integer)类型的。浮点数进行整数加减法运算结果仍为浮点数, 而incr,incrby,decr,decrby等运算结果为integer,所以进行incrbyfloat后,如果数字为浮点数,不能使用上面命令, 不过可以使用incrbyfloat key -num来减调浮点数。

strlen key 计算值的长度

127.0.0.1:6379> set a1 "hello"
OK
127.0.0.1:6379> STRLEN a1
(integer) 5
127.0.0.1:6379> set a2 100
OK
127.0.0.1:6379> STRLEN a2
(integer) 3

setrange 设置指定偏移量的值

127.0.0.1:6379> SETRANGE a1 5 redis
(integer) 10
127.0.0.1:6379> get a1
"helloredis"
127.0.0.1:6379> SETRANGE a1 4 " test"
(integer) 10
127.0.0.1:6379> get a1
"hell tests"
127.0.0.1:6379> 

需要注意当值的长度不够偏移量时,往后追加,如果设置的值长度+偏移量小于原值长度时,替换指定长度的值。

getrange 获取指定起始位置的值,终止位置可以为负数(-1),代表从倒数,但是起始位置不能为负数。

127.0.0.1:6379> GETRANGE a1 0 -1
"hell tests"
127.0.0.1:6379> GETRANGE a1 0 5
"hell t"

setnx 设置值当key不存在时,如果key已经存在,那么设置失败。

127.0.0.1:6379> SETNX k1 "redis"
(integer) 0
127.0.0.1:6379> SETNX k5 "redis"
(integer) 1

setex 设置值的过期时间

127.0.0.1:6379> SETEX k3 1000 "expire data"
OK
127.0.0.1:6379> TTL k3
(integer) 994

上面设置了一个key为k3,值为expire data的数据,设置的过期时间是1000 秒, 在redis中,过期时间单位是秒,ttl可以查看指定key还有多久过期。

补充一个命令 expire key seconds 指定key的过期时间 127.0.0.1:6379> expire k1 10 (integer) 1 过十秒后再查看key 127.0.0.1:6379> get k1 (nil)

mset 设置多个值

127.0.0.1:6379> mset b1 "hello" b2 "redis" b3 "java"
OK

mget 查看多个值

127.0.0.1:6379> mget b1 b2 b3
1) "hello"
2) "redis"
3) "java"

getset 获取旧值并设置新值

127.0.0.1:6379> GETSET k2 10
"5"
127.0.0.1:6379> get k2
"10"

msetnx 设置多个值,只有当key不存在时才能设置成功,如果有一个key设置失败,那么则全都失败。

127.0.0.1:6379> MSETNX c1 "hello" c2 "redis" c3 "python"
(integer) 1
127.0.0.1:6379> MSETNX c1 "hello" c2 "redis" b2 "python"
(integer) 0

psetex 设置值,而且key将在指定毫秒数内过期。

127.0.0.1:6379> PSETEX k1 1000 hello
OK
127.0.0.1:6379> get k1
(nil)

上面设置k1在1秒内过期。

** bitmap位图,下面的内容仍然数据string类型的命令,属于位运算。

redis是二进制安全的

什么是二进制安全? redis与外界交互的时候永远都是字节数组。面向流一般有字节流和字符流,那么当别人访问redis的时候,拿到的永远是字节流。 为什么? 因为如果redis只存字节,没有从字节中取出东西,按照某一编码集转换的话,数据就不会被破坏,所以叫二进制安全。

127.0.0.1:6379> set k2 中
OK
127.0.0.1:6379> get k2
"\\xe4\\xb8\\xad"

--raw触发格式化

[root@zhaoshuai ~]# redis-cli --raw
127.0.0.1:6379> get k2
中

关于位图的操作:

setbit 设置二进制位

默认一个字节是8个二进制位,而位操作就是在这八个二进制位上进行操作。二进制只有0和1

127.0.0.1:6379> SETBIT k1 1 1
(integer) 0
127.0.0.1:6379> SETBIT k1 7 1
(integer) 0
127.0.0.1:6379> GET k1
"A"

上面操作,表示将k1的值的第二位设置为1,第7位设置为1。那么此二进制就表示为:01000001,对应的ascii码就是A。那么如何将它变成B呢? B对应的二进制码为:01000010

127.0.0.1:6379> SETBIT k1 6 1
(integer) 0
127.0.0.1:6379> SETBIT k1 7 0
(integer) 1
127.0.0.1:6379> get k1
"B"

bitcount 统计值二进制位中1的个数,可以指定起止字符

127.0.0.1:6379> BITCOUNT k1
(integer) 2

将k1的值设置为4个字符

127.0.0.1:6379> SETBIT k1 9 1
(integer) 0
127.0.0.1:6379> SETBIT k1 15 1
(integer) 0
127.0.0.1:6379> get k1
"BA"
127.0.0.1:6379> APPEND k1 B
(integer) 4
127.0.0.1:6379> get k1
"BACB"

统计最后两个字符CB中的1的个数

127.0.0.1:6379> BITCOUNT k1 2 3
(integer) 5

bitpos 寻找第一个二进制位,start和end参数为可选参数,指定字节数。

127.0.0.1:6379> BITPOS k1 1 0 1
(integer) 1
127.0.0.1:6379> BITPOS k1 1 1 1
(integer) 9
127.0.0.1:6379> BITPOS k1 0 1 1
(integer) 8

bitop 进行位运算,位运算有与/或运算,将两个值进行位运算后赋给一个新值。

127.0.0.1:6379> set k2 A
OK
## A的二进制码为: 01000001
127.0.0.1:6379> set k3 C
OK
## C的二进制码为: 01000011

所以A^C=A;A|C=C

127.0.0.1:6379> BITOP or k4 k2 k3
(integer) 1
127.0.0.1:6379> get k4
"C"
127.0.0.1:6379> bitop and k5 k2 k3
(integer) 1
127.0.0.1:6379> get k5
"A"

getbit 获取二进制位的值

127.0.0.1:6379> get k2
"A"
127.0.0.1:6379> GETBIT k2 7
(integer) 1
127.0.0.1:6379> GETBIT k2 6
(integer) 0

bitfield 对字符串任意位置进行位运算

使用bitfield时,将字符串视为位数组

list类型

list 列表,特点:

  • 有序,双向链表存储

  • 允许重复元素 使用命令help @list查看命令帮助

lpush 从左边往列表中推数据

127.0.0.1:6379> LPUSH k1 1 2 3 4 5 6
(integer) 6

lrange 截取列表的元素

127.0.0.1:6379> LRANGE k1 0 1
1) "6"
2) "5"

查询所有元素:

127.0.0.1:6379> LRANGE k1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"

lset 设置指定索引的元素值

127.0.0.1:6379> lset k1 0 8
OK
127.0.0.1:6379> LRANGE k1 0 -1
1) "8"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"

linsert 插入数据

127.0.0.1:6379> LINSERT k1 before 5 7
(integer) 7
127.0.0.1:6379> LRANGE k1 0 -1
1) "8"
2) "7"
3) "5"
4) "4"
5) "3"
6) "2"
7) "1"

linsert 插入可以选择before或after某一个元素,也就是在指定元素之前或者之后插入数据,不是根据下标操作。

rpush 从右边向列表中推入元素

127.0.0.1:6379> RPUSH k2 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> LRANGE k2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"

在列表的命令以l开头,有两种意思,一种是表示列表,如:lrange,lset。另一种则表示left,从左边操作,如lpush,lpop等。 有左就有右,分别表示从列表头或从列表尾操作列表。

llen 统计列表元素个数

127.0.0.1:6379> llen k1
(integer) 7

lpop 从头部弹出一个元素

127.0.0.1:6379> lpop k1
"8"
127.0.0.1:6379> lpop k1
"7"
127.0.0.1:6379> lpop k1
"5"

rpop 从尾部弹出一个元素

127.0.0.1:6379> lrange k2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> RPOP k2 
"6"
127.0.0.1:6379> RPOP k2 
"5"
127.0.0.1:6379> RPOP k2 
"4"

根据lpush,rpush,lpop,rpop可以组成常见数据结构,如栈、队列 栈:先进后出 127.0.0.1:6379> lpush k3 1 2 3 4 5 6 (integer) 6 127.0.0.1:6379> lpop k3 "6" 127.0.0.1:6379> lpop k3 "5" 127.0.0.1:6379> lpop k3 "4" 127.0.0.1:6379> lpop k3 "3" 127.0.0.1:6379> lpop k3 "2" 127.0.0.1:6379> lpop k3 "1" 队列:先进先出 127.0.0.1:6379> lpush k4 1 2 3 4 5 6 (integer) 6 127.0.0.1:6379> rpop k4 "1" 127.0.0.1:6379> rpop k4 "2" 127.0.0.1:6379> rpop k4 "3" 127.0.0.1:6379> rpop k4 "4" 127.0.0.1:6379> rpop k4 "5" 127.0.0.1:6379> rpop k4 "6"

lpushx 当列表存在时,从头部添加数据

学习一个新命令: keys [pattern] 根据指定的模式匹配key,*匹配所有 127.0.0.1:6379> keys * 1) "k1" 2) "k2" 表示当前有两个key,k1,k2

127.0.0.1:6379> LRANGE k2 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> LPUSHX k2 4 5 6
(integer) 6
127.0.0.1:6379> LPUSHX k3 1 2 3
(integer) 0

rpushx 当列表存在时,从尾部插入元素

127.0.0.1:6379> RPUSHX k3 4 5 6
(integer) 0
127.0.0.1:6379> RPUSHX k2 7 8 9
(integer) 9
127.0.0.1:6379> LRANGE k2 0 -1
1) "6"
2) "5"
3) "4"
4) "1"
5) "2"
6) "3"
7) "7"
8) "8"
9) "9"

rpopLpush 弹出列表的最后一个元素,并将它从头部插入新的列表。

127.0.0.1:6379> RPOPLPUSH k2 k4
"9"
127.0.0.1:6379> LRANGE k4 0 -1
1) "9"
127.0.0.1:6379> RPOPLPUSH k2 k4
"8"
127.0.0.1:6379> LRANGE k4 0 -1
1) "8"
2) "9"
127.0.0.1:6379> RPOPLPUSH k2 k4
"7"
127.0.0.1:6379> LRANGE k4 0 -1
1) "7"
2) "8"
3) "9"
127.0.0.1:6379> LRANGE k2 0 -1
1) "6"
2) "5"
3) "4"
4) "1"
5) "2"
6) "3"

lindex 根据索引查询元素

127.0.0.1:6379> LINDEX k2 0
"6"
127.0.0.1:6379> LINDEX k2 4
"2"

ltrim 将列表修剪到指定范围

这个命令和lrange看起来很像,lrange命令,截取指定索引的字符串,例如:

127.0.0.1:6379> LRANGE k2 0 3
1) "6"
2) "5"
3) "4"
4) "1"

返回指定范围的数据,但是列表k2的长度并没有改变

127.0.0.1:6379> lrange k2 0 -1
1) "6"
2) "5"
3) "4"
4) "1"
5) "2"
6) "3"

ltrim命令则会保留指定的返回的元素,删除范围之外的元素,执行结果输出为成功或失败。

127.0.0.1:6379> LTRIM k2 2 4
OK
127.0.0.1:6379> LRANGE k2 0 -1
1) "4"
2) "1"
3) "2"

可以看出ltrim会修改列表的长度。ltrim和lrange两个命令的输出也是不一样的,lrange输出的是截取返回的元素值,而ltrim返回截取成功或失败。

lrem 删除元素,指定元素的值及删除个数

127.0.0.1:6379> lpush k5 1 2 3 2 1 2 2 1 3 2
(integer) 10
127.0.0.1:6379> LRANGE k5 0 -1
 1) "2"
 2) "3"
 3) "1"
 4) "2"
 5) "2"
 6) "1"
 7) "2"
 8) "3"
 9) "2"
10) "1"   

下面我们删掉3个2,会从左边开始统计,删除三个2结束

127.0.0.1:6379> LREM k5 3 2
(integer) 3
127.0.0.1:6379> LRANGE k5 0 -1
1) "3"
2) "1"
3) "1"
4) "2"
5) "3"
6) "2"
7) "1"

再删除一个1

127.0.0.1:6379> LRANGE k5 0 -1
1) "3"
2) "1"
3) "2"
4) "3"
5) "2"
6) "1"

lrem输出的是删除的元素个数,当元素不存在时,输出0,列表没变化

127.0.0.1:6379> LREM k5 1 4
(integer) 0
127.0.0.1:6379> LRANGE k5 0 -1
1) "3"
2) "1"
3) "2"
4) "3"
5) "2"
6) "1"

当要删除的元素个数超过列表中的元素个数时,则删除所有并返回删除的元素个数

127.0.0.1:6379> LREM k5 4 3
(integer) 2
127.0.0.1:6379> LRANGE k5 0 -1
1) "1"
2) "2"
3) "2"
4) "1"

blpop,brpop,brpoplpush 阻塞的单播队列

启动三个客户端redis-cli,打开一个查看

127.0.0.1:6379> keys *
1) "k4"
2) "k1"
3) "k2"
4) "k5"

查看没有k6的键,两个客户端输入

127.0.0.1:6379> BLPOP k6 0
​
127.0.0.1:6379> BLPOP k6 0
​

会阻塞 然后在另一台上往k6中推入一个元素

127.0.0.1:6379> LPUSH k6 1
(integer) 1

查看阻塞的两个客户端

127.0.0.1:6379> BLPOP k6 0
1) "k6"
2) "1"
(47.36s)
127.0.0.1:6379> 
127.0.0.1:6379> BLPOP k6 0
​

一台客户端结束阻塞,另一个仍在阻塞

set类型

list是列表,set是集合。 set的特征:

  • 无序

  • 去重 使用命令 help @set查看set命令的帮助文档

  • 使用元素的交集,并集,差集功能比较多。

sadd 添加集合

127.0.0.1:6379> sadd k1 a b c d e 
(integer) 5

smembers 查看所有元素

127.0.0.1:6379> SMEMBERS k1
1) "c"
2) "d"
3) "b"
4) "a"
5) "e"

scard 获取集合元素总数(集合长度)

127.0.0.1:6379> scard k1
(integer) 5

srandmember key [count] 随机获取count个元素

随机获取元素,但是元素仍在集合中,并没有取出来

127.0.0.1:6379> srandmember k1 
"c"
127.0.0.1:6379> srandmember k1 3
1) "a"
2) "d"
3) "e"
127.0.0.1:6379> SMEMBERS k1
1) "d"
2) "b"
3) "a"
4) "c"
5) "e"

sdiff key [key1, key2..] 取多个集合的差集

从参数可以看出,查询的是key与 key1,key2..的差集

127.0.0.1:6379> SADD k2 b c d e f
(integer) 5
127.0.0.1:6379> SDIFF k1 k2
1) "a"

sdiffstore destination key [key1, key2..] 取差集并存入目标集合destination

127.0.0.1:6379> sadd k3 c d e f g
(integer) 5
127.0.0.1:6379> SDIFFSTORE k4 k1 k3
(integer) 2
127.0.0.1:6379> SMEMBERS k4
1) "b"
2) "a"
127.0.0.1:6379> SDIFFSTORE k5 k3 k1
(integer) 2
127.0.0.1:6379> SMEMBERS k5
1) "f"
2) "g"

sinter key [key1,key2..] 取key与多个集合的交集

127.0.0.1:6379> SINTER k1 k2 k3
1) "c"
2) "d"
3) "e"
127.0.0.1:6379> SINTER k1 k2
1) "b"
2) "c"
3) "d"
4) "e"

sinterstore destination key [key1,key2..] 取多个集合的交集并存入新的集合

127.0.0.1:6379> SINTERSTORE k6 k1 k2 k3
(integer) 3
127.0.0.1:6379> SMEMBERS k6
1) "c"
2) "d"
3) "e"

sunion key [key1,key2..] 取多个集合的并集

127.0.0.1:6379> SUNION k1 k2
1) "b"
2) "a"
3) "f"
4) "c"
5) "d"
6) "e"
127.0.0.1:6379> SUNION k1 k2 k3
1) "b"
2) "a"
3) "f"
4) "c"
5) "g"
6) "d"
7) "e"

sunionstore destination key [key1, key2..] 取多个集合的并集存入新的集合

127.0.0.1:6379> SUNIONSTORE k7 k1 k2 k3
(integer) 7
127.0.0.1:6379> SMEMBERS k7
1) "b"
2) "a"
3) "f"
4) "c"
5) "g"
6) "d"
7) "e"

sismember key member 判断集合中是否存在成员

127.0.0.1:6379> SMEMBERS k1
1) "b"
2) "a"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> SISMEMBER k1 a
(integer) 1
127.0.0.1:6379> SISMEMBER k1 g
(integer) 0

smove source destination member 移动source中的成员member到一个新的集合destination

127.0.0.1:6379> SMEMBERS k4
1) "b"
2) "a"
127.0.0.1:6379> SMOVE k1 k4 c
(integer) 1
127.0.0.1:6379> SMEMBERS k4
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> SMEMBERS k1
1) "b"
2) "a"
3) "d"
4) "e"

spop key [count] 移除[count,默认1]个元素

127.0.0.1:6379> SPOP k1 3
1) "b"
2) "a"
3) "d"
127.0.0.1:6379> SMEMBERS k1
1) "e"
127.0.0.1:6379> SMEMBERS k2
1) "b"
2) "c"
3) "f"
4) "d"
5) "e"
127.0.0.1:6379> SPOP k2
"d"
127.0.0.1:6379> SMEMBERS k2
1) "b"
2) "c"
3) "f"
4) "e"

srem key member [member...] 删除指定元素

127.0.0.1:6379> SREM k2 b c e
(integer) 3
127.0.0.1:6379> SMEMBERS k2
1) "f"

sorted_set类型

sorted_set和set的区别? 之前已经有了一个Set类型,为什么还要有一个sorted_set类型呢?这两个类型的具体区别:

  • set是无序的,sorted_set是有序的,但是要注意这个有序是排序,与list不同,list的有序是指输入顺序与输出顺序一致,也就是存储的顺序。 而sorted_set每个元素都有一个score分值,根据这个分值对元素进行排序,因此通过更改分值就可以更改元素的位置。

使用命令 help @sort_set来查看帮助信息

zadd key [nx|xx] [ch] [incr] score member[score member..] 新增命令

[nx|xx]: nx: 当member成员不存在时,插入成员信息 xx: 当member成员存在时,更新成员分数 将班级学生按照语文成绩进行排序,那么这个集合应该是这样的

127.0.0.1:6379> zadd k1 100 zhangsan 80 lisi 90 wangwu 50 maliu
(integer) 4
127.0.0.1:6379> ZADD k1 nx 75 xiaoming
(integer) 1
127.0.0.1:6379> ZADD k1 nx 84 lisi
(integer) 0

zrange key start end [withsocres] 获取值

127.0.0.1:6379> ZRANGE k1 0 -1 withscores
 1) "maliu"
 2) "50"
 3) "xiaoming"
 4) "75"
 5) "lisi"
 6) "80"
 7) "wangwu"
 8) "90"
 9) "zhangsan"
10) "100"
127.0.0.1:6379> ZRANGE k1 0 -1
1) "maliu"
2) "xiaoming"
3) "lisi"
4) "wangwu"
5) "zhangsan"

学习这个命令后再回头看zadd命令的xx命令

 127.0.0.1:6379> ZADD k1 xx 70 maliu
 (integer) 0
 127.0.0.1:6379> ZRANGE k1 0 -1 withscores
  1) "maliu"
  2) "70"
  3) "xiaoming"
  4) "75"
  5) "lisi"
  6) "80"
  7) "wangwu"
  8) "90"
  9) "zhangsan"
 10) "100"

zrangebyscore 上面是按照索引取,还可以按照分数

127.0.0.1:6379> ZRANGEBYSCORE k1 0 100 withscores
 1) "xiaoming"
 2) "75"
 3) "lisi"
 4) "80"
 5) "wangwu"
 6) "90"
 7) "maliu"
 8) "100"
 9) "zhangsan"
10) "100"
127.0.0.1:6379> ZRANGEBYSCORE k1 75 90
1) "xiaoming"
2) "lisi"
3) "wangwu"

zcard 获取元素总数

127.0.0.1:6379> ZCARD k1
(integer) 5

zcount key min max 获取某一个分数范围内的元素总数

127.0.0.1:6379> ZCOUNT k1 50 80
(integer) 3

zincyby key increment member 某一个成员增加分数

127.0.0.1:6379> ZINCRBY k1 30 maliu
"100"
127.0.0.1:6379> ZRANGE k1 0 -1 withscores
 1) "xiaoming"
 2) "75"
 3) "lisi"
 4) "80"
 5) "wangwu"
 6) "90"
 7) "maliu"
 8) "100"
 9) "zhangsan"
10) "100"

zrevrange 倒序按索引取数

127.0.0.1:6379> ZREVRANGE k1 0 -1 withscores
 1) "zhangsan"
 2) "100"
 3) "maliu"
 4) "100"
 5) "wangwu"
 6) "90"
 7) "lisi"
 8) "80"
 9) "xiaoming"
10) "75"

zrevrangebyscore 倒序按分数取数

127.0.0.1:6379> ZREVRANGEBYSCORE k1 90 40
1) "wangwu"
2) "lisi"
3) "xiaoming"

zscore 获取成员的分数

127.0.0.1:6379> ZSCORE k1 zhangsan
"100"

zrank 确定成员在排序集中的索引

127.0.0.1:6379> ZRANGE k1 0 -1
1) "xiaoming"
2) "lisi"
3) "wangwu"
4) "xiaohong"
5) "zhaosi"
6) "maliu"
7) "zhangsan"
127.0.0.1:6379> ZRANK k1 xiaoming
(integer) 0
127.0.0.1:6379> ZRANK k1 lisi
(integer) 1
127.0.0.1:6379> ZRANK k1 zhangsan
(integer) 6

zrevrank 确定成员在拍序集中的索引,排序集为倒序排序

127.0.0.1:6379> ZREVRANK k1 zhangsan
(integer) 0
127.0.0.1:6379> ZREVRANK k1 xiaoming
(integer) 6
127.0.0.1:6379> ZREVRANK k1 maliu
(integer) 1

zrem 移除指定成员

127.0.0.1:6379> ZREM k1 xiaohong
(integer) 1
127.0.0.1:6379> ZRANGE k1 0 -1
1) "xiaoming"
2) "lisi"
3) "wangwu"
4) "zhaosi"
5) "maliu"
6) "zhangsan"

zunionStore 两个排序集取并集并存入新的排序集

127.0.0.1:6379> zadd k2 1 a 2 b 3 c
(integer) 4
127.0.0.1:6379> zadd k3 5 b 3 c 2 d
(integer) 4
127.0.0.1:6379> ZUNIONSTORE k4 2 k2 k3 
(integer) 4
127.0.0.1:6379> ZRANGE k4 0 -1
1) "a"
2) "c"
3) "d"
4) "b"
127.0.0.1:6379> ZRANGE k4 0 -1 withscores
1) "a"
2) "1"
3) "d"
4) "2"
5) "c"
6) "6"
7) "b"
8) "7"

两个集合取并集时,如果有相同的元素,会重新计算分值,计算规则有 min/max/sum,可以计算分值的权重

zinterstore 取交集

127.0.0.1:6379> ZINTERSTORE k5 2 k2 k3
(integer) 2
127.0.0.1:6379> ZRANGE k5 0 -1
1) "c"
2) "b"

zpopmax 弹出分数最高的成员

127.0.0.1:6379> ZRANGE k1 0 -1
 1) "a"
 2) "b"
 3) "c"
 4) "d"
 5) "xiaoming"
 6) "lisi"
 7) "wangwu"
 8) "zhaosi"
 9) "maliu"
10) "zhangsan"
127.0.0.1:6379> ZPOPMAX k1 2
1) "zhangsan"
2) "100"
3) "maliu"
4) "100"

zpopmin 弹出分数最低的成员

127.0.0.1:6379> ZPOPMIN k1 3
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
127.0.0.1:6379> ZRANGE k1 0 -1 withscores
 1) "d"
 2) "4"
 3) "xiaoming"
 4) "75"
 5) "lisi"
 6) "80"
 7) "wangwu"
 8) "90"
 9) "zhaosi"
10) "90"

zlexcount key min max

sorted_set 使用skip_list跳表做存储保证增删改的速度

hash类型

hash用来存放键值对,类似于java中的hashmap 使用命令 help @hash查看hash相关的命令

hset key field value 设置hash类型的值

127.0.0.1:6379> HSET h1 name zhangsan
(integer) 1
127.0.0.1:6379> HSET h1 age 18
(integer) 1

hgetall key 查看所有的键值对

Redis的数据类型详解和使用:List类型

redis 列表list操作命令

Redis 数据类型--list

redis中list和hash的基本命令和使用场景

Redis——五大数据类型的基本操作(字符串类型,哈希类型,列表类型,集合类型,有序集合类型)

Redis入门详解之五种基本数据结构