Redis的五种基础数据类型

Redis是非关系型数据库,它是以键值对的形式将数据存储在内存中的,当然它有完善持久化的机制保证服务的HA,这里所说的数据类型是指value的数据类型。以reidis5.0.4版本为例,记录这五种基础数据类型的用法和注意事项。
在linux上安装redis服务后启动,使用redis自带的客户端连接工具,连接到redis服务,通过输入help @ + 对应的数据类型的名称,就可以看到和该数据类型相关的指令,下面我是把bitmap这种高级数据类型,也放在下面,待五种基础数据类型都补充完, 会把bitmap迁到高级数据类型中去。

1.字符串(String)

输入 help @String

redis基线是什么_redis

redis基线是什么_键值对_02


String类型的数值操作有这么多指令,那我们一一来看

1.1 set、get指令

redis基线是什么_redis基线是什么_03

指令

解释说明

set

给键设置值

get

获取键对应的值

set还有一些复杂的操作,我们看图中指令的提示

redis基线是什么_redis_04

1.2 getset指令

redis基线是什么_有序集合_05

指令

解释说明

getset key value

设置key对应的新值,返回旧值

1.3 setex、psetex、ttl指令

redis基线是什么_有序集合_06

指令

解释说明

setex key second value

设置键过期时间(单位秒)再设置值

ttl

获取键的有效期是多久,也就是还有多久这个键值对就会被redis清除掉。

相同的指令如下:

redis基线是什么_redis_07

指令

解释说明

set key ex 5

设置key的过期时间为5秒

redis基线是什么_redis_08

指令

解释说明

psetex key milliseconds value

设置键过期时间(单位毫秒)再设置值

redis基线是什么_redis基线是什么_09

指令

解释说明

set key value px

设置键过期时间(单位毫秒)再设置值

那么说到有效期的事情,todo 待补充 可以看下redis的缓存过期清除策略

1.4 setnx指令

redis基线是什么_redis_10

指令

解释说明

setnx key value

当键不存在时,才会将键值对添加到redis中

redis基线是什么_有序集合_11

指令

解释说明

set key value nx

当键不存在时,才会将键值对添加到redis中

redis基线是什么_键值对_12

指令

解释说明

set key value xx

当键存在时,才会将键值对添加(本质是覆盖)到redis中

1.5 mset、msetnx、mget指令

redis基线是什么_有序集合_13

指令

解释说明

mset key value key value …

批量添加键值对

mget key key …

批量获取键值对的值

mset key value key value …

批量添加的键值对都不存在时,才会将所有的键值对添加到redis中

1.6 setrange、getrange指令

redis基线是什么_redis_14

列1

列2

列3

列4

列5

列6

列7

列8

列9

列10

列11

正向索引

0

1

2

3

4

5

6

7

8

9

value

0

1

2

3

4

5

6

7

8

9

反向索引

-10

-9

-8

-7

-6

-5

-4

-3

-2

-1

指令

解释说明

getrange key start end

当end为正数时,获取索引start到end为止的值;

当end为负数,且为-1时,获取start到最后一个索引的值

当end为负数,且超过范围时默认返回start索引位置的值

(例子中最大的反向索引是-10,你可以说是最小的因为是负值)

1.7 strlen、append指令

redis基线是什么_redis基线是什么_15

指令

解释说明

strken key

获取key对应值的长度

append key value

在key对应的值后追加字符串value

1.8 incr、decr、incrby、decrby、incrbyfloat指令

redis基线是什么_redis_16

指令

解释说明

incr key

对key的value数值加1

decr key

对key的value数值减1

incrby key increment

对key的value数值加指定的数

decrby key increment

对key的value数值减指定的书

incrbyfloat key incement

对key的value数值加指定的浮点数

2.散列(hash)

涉及到相关指令如下

redis基线是什么_redis_17

2.1 hset、hget、hdel指令

redis基线是什么_键值对_18


把hash想成java数据结构中的的map

指令

解释说明

hset key field vaue

设置key对应map的键值对,field和value为map新增的键值对

hget key field

获取key对应map键field映射的值

hdel key field

删除key对应map键fied及其映射的值

2.2 hmset、hmget指令

redis基线是什么_键值对_19

指令

解释说明

hmset key field value field value …

批量设置key对应map的键值对,field和value为map新增的键值对

hmget key field field …

批量获取key对应map中field对应的值

2.3 hsetnx指令

redis基线是什么_键值对_20

指令

解释说明

hsetnx key field vaue

key对应的map中,不存在field的键,再进行添加,同setnx指令是一样的道理

2.4 hexists指令

redis基线是什么_有序集合_21

指令

解释说明

hexists key field

key对应的map中,是否存在field键,0 不存在 1 存在

2.5 hkeys、hvals、hgetall指令

redis基线是什么_redis基线是什么_22

指令

解释说明

hkeys key

获取key对应map所有的键

hvals key

获取key对应map所有的值

hgetall

获取key对应map所有的键值对

2.6 hlen、hstrlen指令

redis基线是什么_redis基线是什么_23

指令

解释说明

hlen key

获取key对应map中键的数量

hstrlen key field

获取key对应map中,键对应值的长度

2.7 hscan指令

redis基线是什么_键值对_24

指令

解释说明

hscan key cursor match pattern count num

从某个游标开始获取key对应map中,匹配表达式的游标位置、键、值

2.8 hincrby、hincrbyfloat指令

redis基线是什么_redis基线是什么_25

指令

解释说明

hincrby key field increment

增加指定数量,key对应map的field的值

hincrbyfloat key field increment

增加指定浮点数,key对应map的field的值

3.列表(lists)

涉及到的指令如下

redis基线是什么_有序集合_26


redis基线是什么_redis基线是什么_27

3.1 lpush、lpop、rpush、rpop指令

redis基线是什么_redis基线是什么_28


可以将list理解为一个队列

指令

解释说明

指令执行完成后的值

lpush key value value value

从左侧向队列列表添加值

4 3 2 1

rpush key value value value

从右侧向队列列表添加值

4 3 2 1 5 6 7 8

lpop key

从左侧移除第一个元素并返回

3 2 1 5 6 7 8

rpop key

从左侧移除第一个元素并返回

3 2 1 5 6 7

3.2 blpop、brpop指令

redis基线是什么_键值对_29


todo 搞成动图

指令

解释说明

blpop key timeout

阻塞从左侧获取元素,直到超时,如果timeou为0则一直阻塞

brpop key timeout

阻塞从右侧获取元素,直到超时,如果timeou为0则一直阻塞

3.3 rpoplpush、brpoplpush指令

todo 搞成动图

指令

解释说明

rpoplpush source destination

从一个list右侧获取元素,添加到另一个list的最左侧

brpoplpush source destination timeout

阻塞从一个list右侧获取元素,添加到另一个list的最左侧

如果timeout为0,获取不到元素就一直阻塞

如果timeout不为0就阻塞指定的时间后结束指令

3.4 lpushx、rpushx、llen指令

redis基线是什么_有序集合_30

指令

解释说明

lpushx key value

当列表存在时,才向左侧添加元素

rpushx key value

当列表存在时,才向右侧添加元素

3.5 lset、lrem、lrange指令

redis基线是什么_redis基线是什么_31


redis基线是什么_redis_32

指令

解释说明

lset key index vaue

lset 设置指定索引位置的值

lrem key count value

移除list中指定元素,当count=0,移除全部指定元素;

当count>0,从左侧移除count个指定元素;当count<0,从右侧移除count个指定元素

lrange key start end

获取list,索引start到end的元素,支持正反向索引

3.6 lindex、linsert指令

redis基线是什么_redis_33

指令

解释说明

lindex key index

获取list指定索引位置的元素

linsetr key after/before pivot value

在list从左查找到的元素前或后,添加元素

3.7 ltrim指令

redis基线是什么_键值对_34

指令

解释说明

ltrim key start stop

移除指定start到stop索引区间外的元素,支持正反向索引

4. 集合(sets)

redis基线是什么_redis_35

4.1 sadd、srem、smembers、sismember指令

redis基线是什么_redis基线是什么_36

指令

解释说明

sadd key member member…

向key的集合中添加元素(自带去重)

smembers key

获取key对应集合中所有的元素

srem key member member …

移除key对应集合中的指定的元素

sismember key member

判断给定的元素是否为key对应集合中的元素

4.2 spop、srandmember、smove指令

redis基线是什么_有序集合_37

指令

解释说明

spop key count

从key对应的集合中随机移除count个元素并返回

srandmember key count

从key对应的集合中随机获取(不移除)count个元素并返回

smove source destination member

将元素从source移除添加到destination集合中

4.3 scard、sscan指令

redis基线是什么_redis基线是什么_38

指令

解释说明

scard key

获取key对应集合的元素数量

sscan key cursor match pattern count num

从某个游标开始获取key对应集合中,匹配表达式的元素,count表示每次获取的数量

4.4 sinter、sinterstore指令

redis基线是什么_redis基线是什么_39

指令

解释说明

sinter key key …

获取多个key对应集合中元素的交集

sinterstore destination key key …

获取多个key对应集合中元素的交集并保存到destination集合中

4.5 sunion、sunionstore指令

redis基线是什么_redis基线是什么_40

指令

解释说明

sunion key key …

获取多个key对应集合中元素的并集

sunionstore destination key key …

获取多个key对应集合中元素的并集并保存到destination集合中

4.6 sdiff、sdiffstore指令

redis基线是什么_redis基线是什么_41

指令

解释说明

sdiff key key …

获取多个key对应集合中元素的差集

sdiffstore destination key key …

获取多个key对应集合中元素的差集(实际获取是和第一个key对应的集合相比,缺少的元素)并保存到destination集合中

5. 有序集合(sorted sets)

redis基线是什么_redis_42


redis基线是什么_redis_43


有序集合,那么是怎么样达到有序的呢?按照什么排序呢?

5.1 zadd、zrange、zrevrange、zcard、zrem指令

redis基线是什么_redis_44

指令

解释说明

zadd key [nx xx] score member [score member…]

添加一个元素及其分数到有序集合中,nx就是不存在再添加,xx就是存在再添加

zrange key start stop

获取有序集合中,获取指定升序序索引范围内元素

zrevrange key start stop

获取有序集合中,获取指定降序索引范围内元素

zcard key

获取有序集合中元素的数量

zrem key

移除有序集合中指定元素

5.2 zincrby、zscore、zcount指令

redis基线是什么_有序集合_45

指令

解释说明

zincrby key increment member

增加有序集合中指定元素的分数

zscore key member

获取有序集合对应元素的分数

zcount key min max

统计有序集合中分数再max和min之间的元素

5.3 zpopmax、zpopmin指令

redis基线是什么_redis基线是什么_46

指令

解释说明

zpopmax key count

移除有序集合中分数最大的count个元素

zpopmin key count

移除有序集合中分数最小的count个元素

5.4 zrank、zrevrank指令

redis基线是什么_有序集合_47

指令

解释说明

zrank key member

获取有序集合中指定元素升序排序索引

zrevrank key member

获取有序集合中指定元素降序排序索引

5.5 zrangebyscore、zrevrangebyscore、zrangebylex、zrevrangebylex指令

redis基线是什么_redis_48

指令

解释说明

zrangebyscore key min max

根据分数范围获取有序集合中的元素按照升序排序返回

zrevreangebyscore key max min

根据分数范围获取有序集合中的元素按照降序排序返回

zrangebylex key min max

todo 待补充

zrevrangebylex key

todo 待补充

5.6 zremrangebyrank、zremrangebyscore、zremrangebylex指令

redis基线是什么_键值对_49

指令

解释说明

zremrangebyrank key start stop

根据降序索引范围移除有序集合中的元素

zremrangebyscore key min max

根据分数范围移除有序集合中的元素

zremrangebylex key min max

todo 待补充

5.7 zscan、zlexcount指令

指令

解释说明

zscan key cursor match pattern count count

从某个游标开始获取有序集合中,匹配表达式的元素,count表示每次获取的数量

zlexcount key min max

todo 待补充

5.8 zinterstore、zunionstore指令

redis基线是什么_redis基线是什么_50

指令

解释说明

zinterstore destination key key weight agreegate [max min sum]

去多个集合的交集中的元素,weight权重,argeegate取最大值 最小值或者和,保存到另一个集合中

zunionstore destination key key weight agreegate [max min sum]

去多个集合的集中的元素,weight权重,argeegate取最大值 最小值或者和,保存到另一个集合中

5.9 bzpopmax、bzpopmin指令

redis基线是什么_有序集合_51

指令

解释说明

bzpopmax key timeout

阻塞获取有序集合中分数最大的元素及其分数,timeout为-1则会一直阻塞,直到有序集合中有元素

bzpopmin key timeout

阻塞获取有序集合中分数最小的元素及其分数,timeout为-1则会一直阻塞,直到有序集合中有元素

那我们通过这些指令的学习可以得出上面问题的结论,有序集合是按照什么排序的,是按照设置的score进行排序的,他支持降序查询、升序查询等等复杂的查询。

我们是不是应该思考为什么redis为我们提供了这么多的数据类型?
思考1:是不是为了减少网络io的数据量,才这么涉及的,我们知道影响请求和响应速度的瓶颈是io,各种io,磁盘IO,网络IO等
思考2:计算向数据移动,也是为了减少IO