Redis系列-2.Redis数据结构及使用(上)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis系列-2.Redis数据结构及使用

Redis命令


Redis 根据命令所操作对象的不同,可以分为三大类:对 Redis 进行基础性操作的命令,对 Key 的操作命令,对 Value 的操作命令。


Redis 基本命令


首先通过 redis-cli 命令进入到 Redis 命令行客户端,然后再运行下面的命令。


心跳命令 ping


键入 ping 命令,会看到 PONG 响应,则说明该客户端与 Redis 的连接是正常的。该命令亦称为心跳命令。


读写键值命令


set key value 会将指定 key-value 写入到 DB。get key 则会读取指定 key 的 value 值。


DB 切换 select


Redis 默认有 16 个数据库。这个在 Redis Desktop Manager(RDM)图形客户端中可以直观地看到。

默认使用的是 0 号 DB,可以通过 select db 索引来切换 DB。例如,如下命令会切换到DB3,并会将 age-23 写入到 DB3 中。

select 3
set age 23
get age

并且这个结果在 RDM 中是可以直观地看到的。


查看 key 数量 dbsize


dbsize 命令可以查看当前数据库中 key 的数量。


删除当前库中数据 flushdb


flushdb 命令仅仅删除的是当前数据库中的数据,不影响其它库。


删除所有库中数据命令 flushall


flushall 命令可以删除所有库中的所有数据。所以该命令的使用一定要慎重。


退出客户端命令


使用 exit 或 quit 命令均可退出 Redis 命令行客户端。


Key 操作命令


Redis 中存储的数据整体是一个 Map,其 key 为 String 类型,而 value 则可以是 String、Hash 表、List、Set 等类型。


keys


格式:KEYS pattern


功能:查找所有符合给定模式 pattern 的 key,pattern 为正则表达式。


说明:KEYS 的速度非常快,但在一个大的数据库中使用它可能会阻塞当前服务器的服务。所以生产环境中一般不使用该命令。


exists


格式:EXISTS key


功能:检查给定 key 是否存在。


说明:若 key 存在,返回 1 ,否则返回 0 。


del


格式:DEL key [key …]


功能:删除给定的一个或多个 key 。不存在的 key 会被忽略。


说明:返回被删除 key 的数量。


rename


格式:RENAME key newkey


功能:将 key 改名为 newkey。


说明:当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。当 newkey 已经存在时, RENAME 命令将覆盖旧值。改名成功时提示 OK ,失败时候返回一个错误。


move


格式:MOVE key db


功能:将当前数据库的 key 移动到给定的数据库 db 当中。


说明:如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。移动成功返回 1 ,失败则返回 0 。


type


格式:TYPE key


功能:返回 key 所储存的值的类型。


说明:返回值有以下六种


  • none (key 不存在)
  • string (字符串)
  • list (列表)
  • set (集合)
  • zset (有序集)
  • hash (哈希表)


expire 与 pexpire


格式:EXPIRE key seconds


功能:为给定 key 设置生存时间。当 key 过期时(生存时间为 0),它会被自动删除。expire 的时间单位为秒,pexpire 的时间单位为毫秒。在 Redis 中,带有生存时间的 key被称为“易失的”(volatile)。


说明:生存时间设置成功返回 1。若 key 不存在时返回 0 。rename 操作不会改变 key的生存时间。


ttl 与 pttl


格式:TTL key


功能:TTL, time to live,返回给定 key 的剩余生存时间。


说明:其返回值存在三种可能:


  • 当 key 不存在时,返回 -2 。
  • 当 key 存在但没有设置剩余生存时间时,返回 -1 。
  • 否则,返回 key 的剩余生存时间。ttl 命令返回的时间单位为秒,而 pttl 命令返回的时间单位为毫秒。


persist


格式:PERSIST key


功能:去除给定 key 的生存时间,将这个 key 从“易失的”转换成“持久的”。


说明:当生存时间移除成功时,返回 1;若 key 不存在或 key 没有设置生存时间,则返回 0。


randomkey


格式:RANDOMKEY


功能:从当前数据库中随机返回(不删除)一个 key。


说明:当数据库不为空时,返回一个 key。当数据库为空时,返回 nil。


String 型 Value


Redis 存储数据的 Value 可以是一个 String 类型数据。String 类型的 Value 是 Redis 中最基本,最常见的类型。String 类型的 Value 中可以存放任意数据,包括数值型,甚至是二进制的图片、音频、视频、序列化对象等。一个 String 类型的 Value 最大是 512M 大小。


set


格式:SET key value [EX seconds | PX milliseconds] [NX|XX]


功能:SET 除了可以直接将 key 的值设为 value 外,还可以指定一些参数。


  • EX seconds:为当前 key 设置过期时间,单位秒。等价于 SETEX 命令。
  • PX milliseconds:为当前 key 设置过期时间,单位毫秒。等价于 PSETEX 命令。
  • NX:指定的 key 不存在才会设置成功,用于添加指定的 key。等价于 SETNX 命令。
  • XX:指定的 key 必须存在才会设置成功,用于更新指定 key 的 value。


说明:如果 value 字符串中带有空格,则该字符串需要使用双引号或单引号引起来,否则会认为 set 命令的参数数量不正确,报错。


setex 与 psetex


格式:SETEX/PSETEX key seconds value


功能:set expire,其不仅为 key 指定了 value,还为其设置了生存时间。setex 的单位为秒,psetex 的单位为毫秒。


说明:如果 key 已经存在, 则覆写旧值。该命令类似于以下两个命令,不同之处是,SETEX 是一个原子性操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。


SET key value


EXPIRE key seconds # 设置生存时间


setnx


格式:SETNX key value


功能:SET if Not eXists,将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key已经存在,则 SETNX 不做任何动作。成功,返回 1,否则,返回 0。


说明:该命令等价于 set key value nx


getset


格式:GETSET key value


功能:将给定 key 的值设为 value ,并返回 key 的旧值。


说明:当 key 存在但不是字符串类型时,返回一个错误;当 key 不存在时,返回 nil 。


mset 与 msetnx


格式:MSET/MSETNX key value [key value …]


功能:同时设置一个或多个 key-value 对。


说明:如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用 MSETNX 命令:它只会在所有给定 key 都不存在的情况下进行设置操作。MSET/MSETNX 是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况不可能发生。该命令永不失败。


mget


格式:MGET key [key …]


功能:返回所有(一个或多个)给定 key 的值。


说明:如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。


append


格式:APPEND key value


功能:如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。


说明:追加 value 之后, key 中字符串的长度。


incr 与 decr


格式:INCR key 或 DECR key


功能:


increment,自动递增。将 key 中存储的数字值增一。

decrement,自动递减。将 key 中存储的数字值减一。


说明:如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行增一/减一操作。如果值不能表示为数字,那么返回一个错误提示。如果执行正确,则返回增一/减一后的值。


incrby 与 decrby


格式:INCRBY key increment 或 DECRBY key decrement


功能:将 key 中存储的数字值增加/减少指定的数值,这个数值只能是整数,可以是负数,但不能是小数。


说明:如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行增/减操作。如果值不能表示为数字,那么返回一个错误提示。如果执行正确,则返回增/减后的值。


incrbyfloat


格式:INCRBYFLOAT key increment


功能:为 key 中所储存的值加上浮点数增量 increment 。


说明:与之前的说明相同。没有 decrbyfloat 命令,但 increment 为负数可以实现减操作效果。


strlen


格式:STRLEN key


功能:返回 key 所储存的字符串值的长度。


说明:当 key 储存的不是字符串值时,返回一个错误;当 key 不存在时,返回 0 。


getrange


格式:GETRANGE key start end


功能:返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定,包括 start 和 end 在内。


说明:end 必须要比 start 大。支持负数偏移量,表示从字符串最后开始计数,-1 表示最后一个字符,-2 表示倒数第二个,以此类推。


setrange


格式:SETRANGE key offset value


功能:用 value 参数替换给定 key 所储存的字符串值 str,从偏移量 offset 开始。


说明:当 offset 值大于 str 长度时,中间使用零字节\x00 填充,即 0000 0000 字节填充;对于不存在的 key 当作空串处理。


典型应用场景


Value 为 String 类型的应用场景很多,这里仅举这种典型应用场景的例子:


数据缓存


Redis 作为数据缓存层,MySQL 作为数据存储层。应用服务器首先从 Redis 中获取数据,如果缓存层中没有,则从 MySQL 中获取后先存入缓存层再返回给应用服务器。


计数器


在 Redis 中写入一个 value 为数值型的 key 作为平台计数器、视频播放计数器等。每个有效客户端访问一次,或视频每播放一次,都是直接修改 Redis 中的计数器,然后再以异步方式持久化到其它数据源中,例如持久化到 MySQL。


共享 Session


对于一个分布式应用系统,如果将类似用户登录信息这样的 Session 数据保存在提供登录服务的服务器中,那么如果用户再次提交像收藏、支付等请求时可能会出现问题:在提供收藏、支付等服务的服务器中并没有该用户的 Session 数据,从而导致该用户需要重新登录。对于用户来说,这是不能接受的。


此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从 Redis 中查找相应的 Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。这样就不会引发“重新登录”问题。


限速器


现在很多平台为了防止 DoS(Denial of Service,拒绝服务)攻击,一般都会限制一个 IP不能在一秒内访问超过 n 次。而 Redis 可以可以结合 key 的过期时间与 incr 命令来完成限速功能,充当限速器。


注意,其无法防止 DDoS(Distributed Denial of Service,分布式拒绝服务)攻击。

// 客户端每提交一次请求,都会执行下面的代码
// 等价于 set 192.168.192.55 1 ex 60 nx
// 指定新 ip 作为 key 的缓存过期时间为 60 秒
Boolean isExists = redis.set(ip, 1, “EX 60”, “NX”);
if(isExists != null || redis.incr(ip) <= 5) {
 // 通过
} else {
// 限流
}


Hash 型 Value


Redis 存储数据的 Value 可以是一个 Hash 类型。Hash 类型也称为 Hash 表、字典等。


Hash 表就是一个映射表 Map,也是由键-值对构成,为了与整体的 key 进行区分,这里的键称为 field,值称为 value。注意,Redis 的 Hash 表中的 field-value 对均为 String 类型。


hset


格式:HSET key field value


功能:将哈希表 key 中的域 field 的值设为 value 。


说明:如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。如果域 field 已经存在于哈希表中,旧值将被覆盖。如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1 。如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0 。


hget


格式:HGET key field


功能:返回哈希表 key 中给定域 field 的值。


说明:当给定域不存在或是给定 key 不存在时,返回 nil 。


hmset


格式:HMSET key field value [field value …]


功能:同时将多个 field-value (域-值)对设置到哈希表 key 中。


说明:此命令会覆盖哈希表中已存在的域。如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。如果命令执行成功,返回 OK 。当 key 不是哈希表(hash)类型时,返回一个错误。


hmget


格式:HMGET key field [field …]


功能:按照给出顺序返回哈希表 key 中一个或多个域的值。


说明:如果给定的域不存在于哈希表,那么返回一个 nil 值。因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。


hgetall


格式:HGETALL key


功能:返回哈希表 key 中所有的域和值。


说明:在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。若 key 不存在,返回空列表。若 key 中包含大量元素,则该命令可能会阻塞 Redis 服务。所以生产环境中一般不使用该命令。


hsetnx


格式:HSETNX key field value


功能:将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。


说明:若域 field 已经存在,该操作无效。如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。


hdel


格式:HDEL key field [field …]


功能:删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。


说明:返回被成功移除的域的数量,不包括被忽略的域。


hexits


格式:HEXISTS key field


功能:查看哈希表 key 中给定域 field 是否存在。


说明:如果哈希表含有给定域,返回 1 。如果不含有给定域,或 key 不存在,返回 0 。


hincrby 与 hincrbyfloat


格式:HINCRBY key field increment


功能:为哈希表 key 中的域 field 的值加上增量 increment 。hincrby 命令只能增加整数值,而 hincrbyfloat 可以增加小数值。


说明:增量也可以为负数,相当于对给定域进行减法操作。如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。如果域 field 不存在,那么在执行命令前,域的值被初始化为 0。对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。


hkeys 与 hvals


格式:HKEYS key 或 HVALS key


功能:返回哈希表 key 中的所有域/值。


说明:当 key 不存在时,返回一个空表。


hlen


格式:HLEN key


功能:返回哈希表 key 中域的数量。


说明:当 key 不存在时,返回 0 。


hstrlen


格式:HSTRLEN key field


功能:返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度(string length)。


说明:如果给定的键或者域不存在, 那么命令返回 0 。


Redis系列-2.Redis数据结构及使用(下):https://developer.aliyun.com/article/1414456

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
20天前
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
25天前
|
存储 消息中间件 NoSQL
Redis 数据结构与对象
【10月更文挑战第15天】在实际应用中,需要根据具体的业务需求和数据特点来选择合适的数据结构,并合理地设计数据模型,以充分发挥 Redis 的优势。
54 8
|
24天前
|
存储 NoSQL Java
介绍下Redis 的基础数据结构
本文介绍了Redis的基础数据结构,包括动态字符串(SDS)、链表和字典。SDS是Redis自实现的动态字符串,避免了C语言字符串的不足;链表实现了双向链表,提供了高效的操作;字典则类似于Java的HashMap,采用数组加链表的方式存储数据,并支持渐进式rehash,确保高并发下的性能。
介绍下Redis 的基础数据结构
|
20天前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
20天前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
16天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
91 9
|
7天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
16 1
|
10天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
13天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
15天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
43 4