Redis的数据结构与基本操作(一)

277 阅读8分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

Redis 简介

Redis是一个速度非常快的非关系数据库,它可以存储键(key) 与5种不同类型的值(value)之间的映射,可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片1来扩展写性能。

Redis的数据结构

​ Redis共有5种数据结构,分别为字符串(STRING)、列表(LIST)、集合(SET)、散列(HASH)、有序集合(ZSET)。

1. 字符串(STRING)

通过key-value的方法去存储字符串,字符串可以存储字符串、整数、浮点数这三种类型的值。

常见的命令操作

命令描述
GET key-name获取指定键存储的值,获取失败会返回nil
SET key-name value存储值到指定键上,成功返回OK
DEL key-name删除键值对,成功返回1
INCR key-name对键存储的值加1,若该键不存在或值为空,则会当作0做处理;若对应的值不能被解析为整数或浮点数,则会返回一个错误。
DECR key-name对键存储的值减1
INCRBY key-name amount对键存储的值加上amount
DECRBY key-name amount对键存储的值减去amount
INCRBYFLOAT key-name amount对键存储的值加上浮点数amount,在Redis2.6版本以上可用

处理子串的命令

命令描述
APPEND key-name value将value值追加到key-name原先的值后
GETRANGE key-name start end获取[start,end]的子串,就是subStr
SETRANGE key-name offset value在偏移量offset开始的字串给定值

2. 列表(LIST)

一个列表结构可以有序地存储多个字符串

常见的命令操作

命令描述
rpush(lpush) key-name value向key-name这个键右边(左边)增加一个value值
lrange key-name start end获取key-name这个键上从start到end的所有值
lindex key-name index向key-name这个列表中获取下标为index的值
lpop(rpop) key-name从key-name这个列表中最左(右)边弹出一个值
ltrim key-name start end保留key-name这个列表中从start到end的所有值,相当于subList(start,end);

3. 集合(SET)

Redis的集合以无序的方法来存储多个各不相同的元素,用户可以快速地对集合执行添加元素操作、移除元素操作以及检查一个元素是否存在于集合里。与列表的不同在于,列表可以存储多个相同的字符串,而集合则通过使用散列表来保证自己存储的每个字符串都是不同的。

常用的命令

命令描述
sadd key-name value [valu2...]添加元素到key-name集合中,后面可接多个
smembers key-name返回key-name集合中的所有元素(当集合中元素非常多的时候,执行速度会很慢,所以要谨慎使用该命令 --- 大查询了)
sismember key-name value检查value元素是否在key-name的集合里
srem key-name value在key-name集合中删除value这个元素
scard key-name返回key-name这个集合中的元素数量
srandmember key-name [count]从key-name这个集合中随机返回一个或多个元素。count的作用在于命令返回的随机元素会不会重复(正值不会重复)
spop key-name随机删除集合中的一个元素,并返回
smove source-key dest-key item如果source-key中包含Item,则在source-key中删除元素item,并将元素item添加到dest-key集合中;成功移除则返回1,否则返回0

用于组合和处理多个集合的命令

命令描述
sdiff key-name [key-name ...]差集。返回存在第一个集合、但不存在其他集合中的元素
sdiffstrore dest-key key-name [key-name ...]差集。与前面类似,但该命令会把结果存储到dest-key这个集合中
sinter key-name [key-name ...]交集。返回同时存在所有集合的元素
sinterstrore dest-key key-name [key-name ...]交集结果存储到desy-key这个集合上
sunion key-name [key-name ...]并集。
sunionstrore dest-key key-name [key-name ...]并集结果存储到desy-key这个集合上

4. 散列(HASH)

Redis中的散列可以让用户将多个键值对存储到一个Redis键里面。就是有着一个标识的map,类比关系型数据库中的行。

常用的命令

命令描述
hset key-name sub-key1 value1添加sub-key1 : value1 这样的键值对存储在key-name这个散列中
hget key-name sub-key1从key-name这个散列值中获取sub-key1这个键对应的值
hgetall key-name获取key-name这个散列的所有键值对 (尽量避免使用,量大会堵塞)
hdel key-name sub-key1在key-name这个散列中删除sub-key1这个键值对,若该键存在,会返回1,否则返回0
批量处理的命令描述
hmget key-name key [key...]从散列中获取一个或多个键对应的值
hmset key-name key value [key value ...]在key-name这个散列中设置一个或多个键值对
hmdel key-name key [key...]删除key-name这个散列值中的多个键值对,返回成功找到并删除的数量
hlen key-name返回key-name这个散列中键值对的数量

其它命令

命令描述
hexists key-name key检查key-name这个散列是否存在这个key
hkeys key-name获取散列中所有的键
hvals key-name获取散列中所有的值
hincrby key-name key increment在散列中的key对应的值加上整数increment
hincrbyfloat key-name key increment同上,针对浮点数

5. 有序集合(ZSET)

有序集合与散列一样,存储的都是键值对。有序集合中的键被称为成员,是唯一的;值被成功为分值(score), 分值必须为浮点数。

有序集合是Redis里面唯一一个既可以根据成员访问元素(这点和散列是一样的),又可以根据分值以及分值的排列顺序来访问元素的结构。

常用的命令

命令描述
zadd key-name score member [score member ...]添加一个分值为score的成员到key-name这个有序集合中
zrange key-name start end [withscores]根据元素在有序排列中所处的位置,从有序集合里面获取多个元素,会并返回对应的分值(如果有withscores的话)
zrangebyscore key-name min-score max-score withscores获取分值在[min-score,max-score]的成员和分值
zrem key-name member [member...]删除有序集合中的成员
zcard key-name返回有序集合中的数量
zincrby key-name increment member将member成员的分值加上increment
zcount key-name min max返回分值介于min和max之间的成员数量
zrank key-name member返回member成员在有序集合中的排名
zscore key-name member返回成员member的分值

此外,有序集合还支持获取指定分值范围内的成员列表,并对它们进行排序。以及 交集、并集等操作。

其它命令

发布与订阅

发布/订阅的特点是订阅者负责订阅频道,发送者负责向频道发送二进制字符串消息。每当有消息被发送到频道时,频道中的所有订阅者都会收到消息。

排序

可以将sort命令看作是SQL中的order by语句

sort source-key [by pattern] [limit offset count] [get pattern] [asc|desc] [store dest-key]

事务

有时候需要同时提交几个命令,Redis提供了事务可以让一个客户端在不被其他客户端打断的情况下执行多个命令。使用事务可减少Redis与客户端的通信往返次数。

要想使用事务,则在先执行multi命令,后输入想放到这个事务的所有命令,输完后,最后输入exec命令提交事务。事务会将所有命令一次性发给Redis。

过期命令

给键一个过期时间,留内存一条生路。过期后,Redis会自动删除该键。

命令描述
persist key-name移除键的过期时间
ttl key-name查看key-name这个键距离过期还有多少秒
expire key-name seconds对key-name这个键设置seconds秒的过期时间
expireat key-name timestamp对key-name这个键设置给定的UNIX时间戳
pttl key-name查看给定键距离过期还有多少毫秒(Redis2.6以上)
pexpire key-name milliseconds对key-name这个键设置milliseconds毫秒的过期时间(Redis2.6以上)
pexpireeat key-name timestamp-milliseconds对key-name这个键设置给定毫秒精度的UNIX时间戳

​ 过期时间的设置对于列表、集合、散列和有序集合这样的容器来说,键过期命令只能为整个键设置过期时间,而没办法为键里面的单个元素设置过期时间。为解决这个问题,可以考虑采用存储时间戳的有序集合来实现对单个元素的过期操作。

其它命令链接

redisdoc.com/

www.redis.cn/

Footnotes

  1. 分片是一种将数据划分为多个部分的方法,对数据的划分可以基于键包含的ID、基于键的散列值,或者基于以上两者的某种结合。通过对数据进行分片,用户可以将数据存储到多台机器里面,也可以从多台机器里面获取数据,这种方法在解决某些问题时可以获得线性级别的性能提升。