Redis常用数据类型操作指令有哪些

52次阅读
没有评论

共计 6661 个字符,预计需要花费 17 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章将为大家详细讲解有关 Redis 常用数据类型操作指令有哪些,丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

Redis 命令用于在 redis 服务上执行操作。要在 redis 服务上执行命令需要一个 redis
客户端。可以使用 redis-cli 命令启动 Redis 客户端。完整的启动命令是 redis-cli -h host -p port -a password。

Redis 常用的数据类型有五种:string、hash、list、set 及 zset(sorted set 有序集合)。学习这些类型之前还需要学习常用命令 Key 的管理。下面详细介绍这些类型:更详细的 API 可以参照此处

常用命令 Key 管理

Key 的应用场景:

限时的优惠活动信息。

网站的数据缓存(对于一些需要定时更新的数据,如积分排行榜)

手机验证码

限制网站访客访问频率(例如 1 分钟最多访问 10 次)

Key 的命名建议:
key 名称区分大小写;key 不要太长,尽量不超过 1024 字节,太长会降低查找效率;在一个项目中 key 最好使用统一的命名模式,如 user:id:password

keys pattern 返回满足给定 pattern 的所有 key,可以模糊匹配,如 keys abc* 代表 abc 开头的 key
exists key 判断一个 key 是否存在,存在返回 1,不存在返回 0
expire key second 设定一个 key 的活动时间(秒)
pexpire key milliseconds 设定一个 key 的活动时间(毫秒)
del key 删除一个 key
ttl key 返回一个 key 的剩余时间,key 不存在时返回 -2;key 存在但未设置剩余生存时间返回 -1
persist key 取消过期时间
select dbindex 选择数据库,默认有 16 个,索引从 0 开始
move key, dbindex 移动当前数据库中的 key 到 dbindex 数据库
randomkey 随机返回一个 key
keyrename key, key2 重命名 key
dbsize 返回当前数据库中 key 的数量
info 查看数据库信息
config get * 实时存储收到的请求,返回相关的配置
type(key) 返回值的类型

flushdb 删除当前选择数据库中的所有 key
flushall 删除所有数据库中的所有 key

一、字符串 String

String 是 redis 最基本的类型,一个键最大能存储 523MB。String 类型是二进制安全的。意思是 redis 的 String 可以包含任何数据。比如图片或者序列化的对象。

String 的应用场景:

String 通常用于保存单个字符串或 JSON 字符串数据。

因为 String 是二进制安全的,可以把图片文件的内容作为字符串来存储。

计数器(常规 key-value 缓存应用,粉丝数、微博数量,投票等)

INCR 等指令本身就具有原子操作的特性,所以完全可以利用 Redis 的 NCR、INCRBY、DECR、DECRBY 等指令来实现原子计数的效果。假如,在某种场景下有 3 个客户端同时读取了 minum 的值(值为 2),然后对其同时进行了加 1 的操作,那么,最后 bynum 的值一定是 5。不少网站都利用 reds 的这个特性来实现业务上的统计计数需求。

赋值语法
set key value 为 key 赋予值 value,多次设置会覆盖旧值且无视类型
setnx key value 为 key 赋予值 value,如果 key 已存在,则不设置并返回 0,否则设置并返回 1。是解决分布式锁的方案之一。
setex key time value 为 key 赋予值 value 并设定过期时间 time,到期后 key 和 value 都清除。
setrange key start end 设置指定区间范围内的值,下标从 0 开始,替换字符串。

取值语法

get key 获取指定 key 的 value 值,key 不存在则返回 nil
getrange key start end 获取指定 key 的 value 的子字符串,包括 start 和 end 角标
getbit key offset 对 key 所储存的字符串值,获取指定偏移量的 bit(二进制)
getset key value 为 key 设新值,同时返回旧值,key 不存在返回 nil
substr(key, start, end) 返回名称为 key 的 string 的 value 的子串
删值语法
del key 同 Key

批量写入
mset k1 v1 k2 v2…kn vn 批量设置多个的值

批量读出

mget k1 k2 … kn 获取多个 key 的值
自增自减
incr key key 的 value 对应 +1
incrby key integer key 的 value 对应 +integer
decr key key 的 value 对应 -1
decrby key integer key 的 value 对应 -integer

字符串拼接
append key value 将 value 附加到指定 key 的末尾

msetnx(key1, value1…keyN, valueN) 同时设置多个 key 和 value,仅 key 之前都不存在时生效
字符串长度
strlen key 返回 key 的字符长度

二、双重键值对 Hash

Hash 类型是 String 类型的 field 和 value 的映射表。Hash 特别适合用于存储对象,相比 String 可以占用更少的磁盘空间,可以看成具有 key 和 value 的 map 容器。Redis 中每个 hash 可以存储(2^32)- 1 个键值对。

Hash 的应用场景:

通常用来存储一个用户信息对象数据。

Redis 的 Hash 实际是将内部存储的 value 作为一个 HashMap。

赋值语法

hset key field value 为指定 key 设置 field 和 value
hsetnx key field value 为指定 key 设置 field 和 value,如果 key 已存在则不生效。
hmset key f1 v1 f2 v2 … fn vn 同时将多个 field-value(域值对)设置到哈希表的 key 中。

取值语法

hget key field 根据 field 获取 value 值
hmget key f1 f2 … fn 根据多个 field 获取所有的 value 值
hgetall key 获取 Hash 表中所有的字段和值
hkeys key 获取所有 Hash 表中的字段
hvals key 获取所有 Hash 表中的字段对应的 value
hexists key field 查看 Hash 表 Key 中,指定的字段是否存在
hlen key 获取 Hash 表中字段的数量

删除语法

hdel key field1 field2 … fieldn 删除一个或多个 Hash 表的字段
del key 同 Key

增减语法

hincrby key field integer 为 Hash 表 Key 中 field 对应的 value 增加 integer
hincrbyfloat key field increment 为 Hash 表 Key 中 field 对应的 value 增加 increment

三、双端链表 List

List 类型是一个链表结构的集合,主要功能有 push、pop、获取元素等。更详细的说,List 类型是一个双端链表的结构,可以通过相关的操作进行集合头部或者尾部元素的添加和删除,List 既可以作为栈,又可以作为队列,能够满足绝大多数需求。

如果键不存在,创建新的链表。

如果键已存在,新增内容。

如果值全移除,对应的键也就消失了。

链表操作无论是头和尾效率都极高,但中间元素的操作效率很低。

应用场景

对数据量大的集合数据删减
列表数据显示、关注列表、粉丝列表、留言评价等…分页、热点新闻(Top10) 等。利用 lrange 可以很方便的实现分页的功能,在博客系统中,每篇博文的评论也可以存入一个单独的 list 中。

任务队列
在处理 web 客户端发送的命令请求时,某些操作的执行时间可能会比我们预期的更长一些,通过将待执行任务的相关信息放入队列里面,并在之后对队列进行处理,用户可以推迟执行那些需要一段时间才能完成的操作,这种将工作交给任务处理器来执行的做法被称为任务队列(task queue)。list 通常可以用来实现一个消息队列,而且可以确保先后顺序。

赋值语法

lpush key value1 value2 … valueN 将一个或多个值插入到列表头部(从左侧添加)
rpush key value1 value2 … valueN 将一个或多个值插入到列表头部(从右侧添加)
lpushx key value 将一个值插入到已存在的列表头部(最左边),如果列表不存在,操作无效。
rpushx key value 将一个值插入到已存在的列表尾部(最右边),如果列表不存在,操作无效。

取值语法

llen key 获取列表长度
lindex key index 通过索引获取列表的元素
lrange key start stop 获取列表指定范围内的元素

删除语法

lpop key 移除并获取列表的第一个元素(从左侧移除)
lpop key 移除并获取列表的最后一个元素(从右侧移除)
lrem key count value 删除 count 个值为 value 的 key
blpop key1 key2 timeout 移除并获取列表的第一个元素,如果列表没有元素会阻塞列表,直到等待超时或发现可弹出元素为止
brpop key1 key2 timeout 移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表,直到等待超时或发现可弹出元素为止
ltrim key start stop 对一个列表进行修剪,只保留指定区间内的元素,不在指定区间内的元素都删除。

修改语法

lset key index value 通过索引设置列表元素的值
linsert key before|after world value 在列表的某个元素 world 前或者后插入元素 value。

高级命令

rpoplpush source destination 移除 source 列表的最后一个元素,并将该元素添加到 destination 列表,并返回。(可以对自己本身操作,类似队列)
brpoplpush source destination timeout 移除 source 列表的最后一个元素,并将该元素添加到 destination 列表,并返回;如果 source 列表没有元素会阻塞列表知道等待超时或发现可移除元素为止。

四、无序集合 Set

Set 是 String 类型的无序集合。集合成员是唯一的,集合中不能出现重复的数据。
Redis 中的集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 – 1 (4294967295, 每个集合可存储 40 多亿个成员)。
类似于 JAVA 中的 Hashtable 集合

Redis 的 set 的底层存储结构特别神奇,底层使用了 intset 和 hashtable 两种数据结构存储的,intset 我们可以理解为数组,hashtable 就是普通的哈希表(key 为 set 的值,value 为 null)。

intset 内部其实是一个数组(int8_t coentents[]数组),而且存储数据的时候是有序的,因为在查找数据的时候是通过二分查找来实现的。

应用场景

对两个集合间的数据 [计算] 进行交集、并集、差集运算

以非常方便的实现如共同关注、共同喜好、二度好友等功能。对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存储到一个新的集合中。

利用唯一性,可以统计访问网站的所有独立 IP

赋值语法

sadd key member1 member2 … memberN 向集合添加一个或多个成员

取值语法

scard key 获取集合的成员数
smembers key 返回集合中的所有成员
sismember key member 判断 member 元素是否是集合 key 的成员(开发中:验证是否存在判断)
srandmember key count 返回集合中一个或多个随机数

删除语法

srem key member1 member2…memberN 移除集合中一个或多个成员
spop kye count 移除并返回集合中的一个或多个随机元素

smove source destincation member 将 member 元素从 source 集合移动到 destination 集合

差集语法

sdiff key1 key2 返回给定所有集合的差集(左侧)
sdiffstore destination key1 key2 返回给定所有集合的差集并存储在 destination 中(destination 中原有的数据清除)

交集语法

sinter key1 key2 返回给定所有集合的交集(共有数据)
sinterstore destination key1 key2 返回给定所有集合的交集并存储在 destination 中

并集语法
sunion key1 key2 返回所有给定集合的并集
sunionstore destination key1 key2 所有给定集合的并集存储在 destination 集合中

五、有序集合 Zset

Redis zset 和 set 一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。zset 的成员是唯一的,但分数 (score) 却可以重复。

之前的 set 是 k1 v1 v2

现在的 zset 是 k1 score1 v1 score2 v2

应用场景

排行榜
①twitter 的 public timeline 可以以发表时间作为 score 来存储,这样获取时就是自动按时间排好序的。
②一个存储全班同学成绩的 Sorted Set,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。
③用 Sorted Set 来做带权重的队列,比如普通消息的 score 为 1,重要消息的 score 为 2,然后工作线程可以选择按 score 的倒序来获取工作任务。让重要的任务优先执行。

赋值语法
zadd key score1 member1 score2 member2 向有序集合添加一个或多个成员,或者更新已存在成员的分数

取值语法
zcard key 获取有序集合的成员数
zcount key min max 计算在有序集合中指定区间分数的成员数
zrank key member 返回有序集合中指定成员的索引
zrange key start stop [withscores] 通过索引区间返回有序集合成指定区间内的成员(低到高)
zrevrange key start stop [withscores] 通过索引区间返回有序集合成指定区间内的成员(高到低)
zlexcount key,min,max 在有序集合中计算指定字典区间内成员数量

删除语法
del key 移除集合
zrem key member [member …] 移除有序集合中的一个或多个成员
zremrangebyrank key start stop 移除有序集合中给定的排名区间的所有成员(第一名是 0)(低到高排序)
zremrangebyscore key min max 移除有序集合中给定的分数区间的所有成员

分数自增
zincrby key ncrement member 有序集合中对指定成员的分数加上增量 increment

六、HyperLoglog

Redis 在 2.8.9 版本添加了 HyperLoglog 结构。该结构是用来做基数统计的算法,

优点:无论输入元素多少,计算基数所需要的空间总是固定的,并且很小。

缺点:只会根据输入元素的计算基数,而不会存储输入元素本身,索引不能像集合那样,返回输入的各个元素。

什么是基数?
比如数据集 {1,2,3,3,4,5,5},那么这个数据集的基数集为{1,2,3,4,5},基数为 5。所谓基数估计就是在误差可接受的范围内,快速计算基数。
为什么要使用 HyperLogLog?
传统的统计一个对象的基数值需要 12M 内存,如果统计 1 万个对象,需要将近 120G 内存,无法广泛应用于大数据场景;而使用了 HyperLogLog,统计 1 亿个数据的基数值,大约需要 12M,内存占用减少明显。

Redis 常用数据类型操作指令有哪些
pfadd key element1 element2 … elementN 添加指定元素到 HyperLogLog 中
pfcount key 返回给定 HyperLogLog 的基数估算值
pfmerge destkey sourcekey1 sourcekey2 …sourcekeyN 将多个 HyperLogLog 合并为一个 HyperLogLog

关于“Redis 常用数据类型操作指令有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计6661字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)