Redis 基本命令

使用 Redis 字符串、列表和集合的常用命令完成任务分配的后端处理逻辑。

相关知识

你需要掌握:1.常用字符串命令,2.常用列表命令,3.常用集合命令。

常用字符串命令

Redis 的字符串可以存储三种类型的值:

  • 整数
  • 浮点数
  • 字节串

取值范围说明

Redis 中整型数据的长度与系统字长一致(例如:32位系统,整型数据为32位有符号整数)

Redis 中浮点数的取值范围与精度都与双精度浮点数(double)一致

数值操作

所以针对存储整型和浮点型的字符串就有自增自减操作。在需要的时候(例如下表的 INCRBYFLOAT 命令),Redis 还会将整数转换为浮点数。

Redis 字符串执行自增和自减的命令列表如下:

命令用法说明
INCRINCR key将 key 存储的值加上 1
DECRDECR key将 key 存储的值减去 1
INCRBYINCRBY key increment将 key 存储的值加上 increment
DECRBYDECRBY key decrement将 key 存储的值减去 decrement
INCRBYFLOATINCRBYFLOAT key increment将 key 存储的值加上浮点数 increment

注意:INCRBYFLOAT 只能在 Redis 版本 >= 2.6 时可用

当用户将一个值存储到 Redis 字符串中,Redis 会检测这个值是否可以被解释(interpret)为十进制整数或者浮点数。如果可以,则允许用户对该字符串进行自增和自减操作。

在前面也提到过,如果用户对一个不存在的键或者一个保存了空串的键执行了自增或自减操作,Redis 都会:

  • 先将该键的值置为 0
  • 再对该键的值进行自增或自减操作

需要额外提到的是,PythonRedis 库在 incr(key, increment=1) 方法中同时实现了 INCRINCRBY 命令,该方法的第二个参数 increment 是可选的,如果用户没有设置该值,就会使用其默认值 1。例如:

 
  1. >>> conn = redis.Redis()
  2. >>> conn.set('key', '1')
  3. True
  4. >>> conn.incr('key', 10)
  5. 11
  6. >>> conn.decr('key', 5)
  7. 6
  8. >>> conn.incr('key')
  9. 7
字节串操作

Redis 还可以对字节串的一部分内容进行读取/写入:

命令用法说明
APPENDAPPEND key value将 value 追加到 key 键存储的值的末尾
GETRANGEGETRANGE key start end获取 start 到 end 间的子串
SETRANGESETRANGE key offset value从 start 偏移量开始,将与 value 长度一致的子串设置为 value

在使用 GETRANGE 读取字符串时,超出字符串末尾的数据会被视为空串;而在使用 SETRANGE 对字符串进行写入时,如果字符串当前长度不能满足写入要求,Redis 则会自动使用空字节将字符串扩展至所需的长度,然后再执行写入/更新操作。

值得一提的是,Redis 现在的 GETRANGE 命令式以前的 SUBSTR 命令改名而来的,所以,Python 客户端仍然可以使用 substr() 方法获取子串,例如:

  1. >>> conn.set('string', 'hello')
  2. True
  3. >>> conn.append('string', ' educoder')
  4. 14L
  5. >>> conn.substr('string', 0, 4)
  6. 'hello'
  7. >>> conn.setrange('string', 0, 'ByeBye')
  8. 14
  9. >>> conn.get('string')
  10. 'ByeByeeducoder'
  11. >>> conn.getrange('string', 6, -1)
  12. 'educoder'

我们推荐使用 getrange() 方法来获取子串。在上述示例中,我们还将 end 下标传入了 -1 的值,这时 Redis 将会从起始偏移量读取到该字符串的末尾。

常用列表命令

Redis 提供了丰富的列表操作命令,从而使得列表的应用场景非常广泛,例如:存储任务队列,记录最近的操作/数据变化,作为日志收集器等。

首先我们介绍一些常用的列表命令:

命令用法说明
LPUSHLPUSH key value [value ...]将一个或多个 value 推入到列表的左侧
RPUSHRPUSH key value [value ...]将一个或多个 value 推入到列表的右侧
LLENLLEN key返回列表 key 的长度
LREMLREM key count value根据参数 count 的值,移除列表中与参数 value 相等的元素

加上我们在上一个实训中已经介绍过的弹出、获取元素等命令,就构成了最为常用的列表命令。使用 Python 交互的示例如下:

  1. >>> conn.lpush('list', 'a', 'b', 'c', 'd')
  2. 4L
  3. >>> conn.llen('list')
  4. 4
  5. >>> conn.rpush('list', 'a', 'b', 'c', 'd')
  6. 8L
  7. >>> conn.lrange('list', 0, -1)
  8. ['d', 'c', 'b', 'a', 'a', 'b', 'c', 'd']
  9. >>> conn.lrem('list', 'b', 2)
  10. >>> conn.lrange('list', 0, -1)
  11. ['d', 'c', 'a', 'a', 'c', 'd']

我们发现 lrem() 方法与 LREM 命令在参数的顺序上不完全一致,lrem() 方法将 count 参数放至最后,在 PythonRedis 客户端中,大多数命令中的数值型参数都被放到了最后,如果弄不清某个方法的参数,你可以到  redis客户端主页 查看。

我们还可以在两个列表之间移动元素:

RPOPLPUSH source destination

RPOPLPUSH 命令在一个原子时间内,执行以下两个动作:

  • 将列表 source 中的最右侧元素弹出,并返回给客户端。
  • 将 source 弹出的元素推入到列表 destination 的最左侧

例如:

  1. >>> conn.lpush('list2', '1', '2', '3')
  2. >>> conn.rpoplpush('list', 'list2')
  3. 'd'
  4. >>> conn.lrange('list', 0, -1)
  5. ['d', 'c', 'a', 'a', 'c']
  6. >>> conn.lrange('list2', 0, -1)
  7. ['d', '3', '2', '1']

原子时间

不可再拆分的时间段

意指该操作执行时,不可被其他操作打断,也就是包含在一个原子时间内的若干操作要么都成功要么都失败

常用集合命令

与列表有序不同,Redis 中的集合以无序的方式存储多个互不相同的元素,用户可以快速的添加、删除和查找元素。Redis 提供了针对单个集合以及多集合间处理的命令:

命令用法说明
SCARDSCARD key返回集合 key 中元素的数量
SRANDMEMBERSRANDMEMBER key [count]返回集合中的 1 或 count 个随机元素
SPOPSPOP key移除并返回集合中的一个随机元素
SMOVESMOVE source destination member将 member 元素从 source 集合移动到 destination 集合

我们通过一些示例来展示上述命令的用法:

  1. >>> conn.sadd('set', 'a', 'b', 'c', 'a')
  2. >>> conn.scard('set')
  3. 3
  4. >>> conn.srandmember('set')
  5. 'a'
  6. >>> conn.spop('set')
  7. 'b'
  8. >>> conn.smembers('set')
  9. set(['a', 'c'])
  10. >>> conn.smove('set', 'set2', 'a')
  11. >>> conn.smembers('set2')
  12. set(['a'])

Redis 中的许多命令都有着实际的应用场景,例如 SRANDMEMBER 命令从集合中随机选择一个元素并输出,在数据库层面就实现了随机数功能,避免用户将集合的全部成员取出后再随机选择,加快了效率,减少了开发人员的工作量。所以我们一直称 Redis 是基于实用主义的。

SMOVE 命令的示例中你也发现了,如果目的集合是不存在的,我们会先创建目的集合,再将成员从源集合中取出并放入目的集合。但如果指定的成员不存在于源集合中,则该命令不会继续执行。

Redis 集合还有更为强大的功能 —— 组合和关联多个集合:

命令用法说明
SDIFFSDIFF key [key ...]返回所有给定集合之间的差集
SINTERSINTER key [key ...]返回所有给定集合的交集
SUNIONSUNION key [key ...]返回所有给定集合的并集

上述三个命令是差集,交集,并集运算的“返回结果”版本,同时 Redis 还提供了“存储结果”版本,你可以参考 Redis 命令参考 中的 SDIFFSTORESINTERSTORESUNIONSTORE 命令。

编程要求

根据提示,在右侧Begin-End区域补充代码,完成任务分配的后端处理逻辑:

  • 在 task_empty() 方法中:
    • 从 Redis 中获取列表 task_list 的长度,判断是否为 0
      • 若为 0,则返回 True
  • 若不为 0,则返回 False
  • 在 get_task() 方法中:
    • 从列表 task_list 的最右侧弹出一个元素,赋值给 task
    • 将 task 的值设置到 Redis 的字符串键 current_task 中
  • 在 get_unallocated_staff() 方法中:
    • 从集合 unallocated_staff 中随机返回一个元素,赋值给 staff
    • 将上面的 staff 从集合 unallocated_staff 移动到集合 allocated_staff 中
    • 返回(returnstaff 的值
  • 在 allocate_task(staff) 方法中:
    • 将参数 staff 的值追加到 Redis 字符串键 current_task 的尾部,中间以 : 间隔
    • 将追加后的字符串键 current_task 从左侧推入列表 task_queue
    • 将字符串键 current_task 的值设置为 "None"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/186418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器之间的conda环境迁移

有的时候python环境中可能包含了我们编译好的很多库文件,如果在别的服务器想直接使用环境就会比较困难些。最好的办法就是直接迁移环境。而传统的迁移方法导出“*.yaml”环境配置的这种方法,实际是需要重新安装环境,对于这种安装好的环境是不…

数据结构:图文详解顺序表的各种操作(新增元素,查找元素,删除元素,给指定位置元素赋值)

目录 一.顺序表的概念 二.顺序表的实现 新增元素 默认尾部新增 指定位置添加元素 查找元素 查找是否存在 查找元素对应的位置 查找指定位置对应的元素 删除元素 获取顺序表长度 清空顺序表 一.顺序表的概念 在线性数据结构中,我们一般分为俩类&#xf…

在Transformer模型中, Positional Encoding的破坏性分析

在Transformer模型中,Word Embedding 被加上一个Positional Encoding,是否会破坏原来的Word Embedding 的含义 Sinusoidal Positional Encoding的破坏性可以从两个方面来分析:一是对Word Embedding的语义信息的破坏,二是对Word Em…

程序员也需要养生——程序员睡不好,重视一下你的情绪吧

程序员也需要养生——程序员睡不好,重视一下你的情绪吧 睡眠是一个复杂的系统工程,可以促进生长发育,修复受损的组织。促进大脑细胞的修复等等。在情绪的失调会影响到我们的睡眠状况。 一、心情差,压力大,睡不好跟这…

项目设计---MQ

文章目录 一. 项目描述二. 核心技术三. 需求分析概要设计四. 详细设计4.1 服务器模块4.1.1 内存管理4.1.2 硬盘管理4.1.2.1 数据库管理4.1.2.2 文件管理 4.1.3 消息转发 4.2 客户端模块4.2.1 连接管理4.2.2 信道管理 4.3 公共模块4.3.1 通信协议4.3.2 序列化/反序列化 一. 项目…

利润大增,MAU膝斩,谋求转型的新氧头顶“荆棘王冠”

撰稿|行星 来源|贝多财经 近日,医疗美容服务平台新氧科技(NASDAQ:SY,下称“新氧”)发布了2023年第三季度未经审计的财务业绩报告。 财报显示,新氧于2023年第三季度实现收入3.85亿元,同比增长19.2%&#x…

【redis数据结构和高性能原理】

文章目录 Redis的单线程和高性能Redis是单线程吗?Redis 单线程为什么还能这么快?Redis 单线程如何处理那么多的并发客户端连接? Redis的单线程和高性能 Redis是单线程吗? Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是…

【玩转 EdgeOne】| 腾讯云下一代边缘加速CDN EdgeOne 是安全加速界的未来吗?

目录 前言边缘加速与安全加固边缘计算与CDN的融合EdgeOne优秀的安全特性EdgeOne卓越的性能表现灵活的配置和管理生态系统的支持与发展技术创新与未来展望EdgeOne试用结束语 前言 在当下互联网的迅猛发展的时刻,云计算和边缘计算技术的快速发展为网络加速领域带来了…

Linux下查看目录大小

查看目录大小 Linux下查看当前目录大小,可用一下命令: du -h --max-depth1它会从下到大的显示文件的大小。

WARNING: Access control is not enabled for the database.

MongoDB shell version v3.4.24 WARNING: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted. 1)未启用访问控制 2)读写访问不受限制 D:\MongoDB\Server\3.4\bin>mongo MongoDB shell version v3.4.24 c…

【Vulnhub 靶场】【DriftingBlues: 9 (final)】【简单】【20210509】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/driftingblues-9-final,695/ 靶场下载:https://download.vulnhub.com/driftingblues/driftingblues9.ova 靶场难度:简单 发布日期:2021年05月09日 文件大小:738 …

2023.11.27 滴滴P0级故障或为k8s升级造成

滴滴11.27 P0级故障|打车|宕机|网约车|出租车|滴滴出行|系统故障_网易订阅 (163.com) 如何看待滴滴11月27日故障,对日常生产生活有哪些影响? - 知乎 (zhihu.com) 最新消息滴滴P0故障原因,是由于k8s集群升级导致的,后面又进行版本…

每日OJ题_算法_滑动窗口①_力扣209. 长度最小的子数组

力扣209. 长度最小的子数组 209. 长度最小的子数组 - 力扣(LeetCode) 难度 中等 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &…

【JavaEE】多线程 -- 死锁问题

目录 1. 问题引入 2.死锁问题的概念和原因 3. 解决死锁问题 1. 问题引入 在学习死锁之前, 我们先观察下面的代码能否输出正确的结果: 运行程序, 能正常输出结果: 这个代码只管上看起来, 好像是有锁冲突的, 此时的 locker 对象已经是加锁的状态, 在尝试对 locker 加锁, 不应该…

常用Java开发规范整理

常用Java开发规范整理 命名时 接口类中的方法和属性不要加任何修饰符号( public 也不要加),保持代码的简洁性,并加上有效的 javadoc 注释代码中相同意义的概念的单词可能有多种,在业务中应该统一禁止中英文混合使用 …

使用 OpenTelemetry 和 Golang

入门 在本文中,我将展示你需要配置和处理统计信息所需的基本代码。在这个简短的教程中,我们将使用 Opentelemetry 来集成我们的 Golang 代码,并且为了可视化,我们将使用 Jeager。 在开始之前,让我简要介绍一下什么是 …

go学习之json和单元测试知识

文章目录 一、json以及序列化1.概述2.json应用场景图3.json数据格式说明4.json的序列化1)介绍2)应用案例 5.json的反序列化1)介绍2)应用案例 二、单元测试1.引子2.单元测试-基本介绍3.代码实现4.单元测试的细节说明5.单元测试的综…

中国毫米波雷达产业分析4——毫米波雷达企业介绍

一、矽典微 (一)公司简介 矽典微致力于实现射频技术的智能化,专注于研发高性能无线技术相关芯片,产品广泛适用于毫米波传感器、下一代移动通信、卫星通信等无线领域。 整合自身在芯片、系统、软件、算法等领域的专业能力&#xf…

C++学不会?一篇文章带你快速入门

1. 命名空间 1.1 命名空间的概念 C命名空间是一种用于避免名称冲突的机制。它允许在多个文件中定义相同的函数、类或变量,而不会相互干扰。 1.2 命名空间的定义 namespace是命名空间的关键字,后面是命名空间的名字,然后后面一对 {},{}中即…

【论文速递】:老驾驶员轨迹数据中的异常行为检测

给定道路网络和一组轨迹数据,异常行为检测 (ABD) 问题是识别在行程中表现出明显方向偏差、急刹车和加速的驾驶员。ABD 问题在许多社会应用中都很重要,包括轻度认知障碍 (MCI) 检测和老年驾驶员的安全路线建…