首页 > 数据库 >头歌解答 Redis基本命令

头歌解答 Redis基本命令

时间:2024-12-05 11:57:16浏览次数:6  
标签:queue task Redis current 头歌 staff id conn 解答

第1关:字符串、列表与集合

编程要求

根据提示,在右侧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 中
    • 返回(return)staff 的值
  • 在 allocate_task(staff) 方法中:
    • 将参数 staff 的值追加到 Redis 字符串键 current_task 的尾部,中间以 : 间隔
    • 将追加后的字符串键 current_task 从左侧推入列表 task_queue
    • 将字符串键 current_task 的值设置为 “None”

解答

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import redis

conn = redis.Redis()

def task_empty():
    # 请在下面完成判断任务列表是否为空
    #********* Begin *********#
	if conn.llen("task_list")==0:
    	return True
    else:
    	return False
    #********* End *********#

def get_task():
    # 请在下面完成获取一个任务
    #********* Begin *********#
    task = conn.rpop("task_list")
    conn.set("current_task", task)
    #********* End *********#

def get_unallocated_staff():
    # 请在下面完成获取一个未分配的员工
    #********* Begin *********#
    staff = conn.srandmember("unallocated_staff")
    conn.smove("unallocated_staff", "allocated_staff", staff)
    return staff
    #********* End *********#

def allocate_task(staff):
    # 请在下面完成分配任务
    #********* Begin *********#
    conn.append("current_task", ":" + staff)
    conn.lpush("task_queue", "current_task")
    conn.set("current_task", "None")
    #********* End *********#

第2关:哈希与有序集合

编程要求

根据提示,在右侧Begin-End区域补充代码,完成带优先级的队列系统的后端处理逻辑:

  • 在 set_task_info(task_id) 方法中:
    • 使用参数 task_id 作为域,初始状态 “init” 作为值构成域-值对,存放在 task_status 哈希键中。
  • 在 add_task_to_queue(task_id, priority) 方法中:
    • 参数说明:
      • task_id 为任务 ID
      • priority 为任务优先级。
    • 将分值(优先级)为 priority 的成员 task_id 存入有序集合 task_queue 中。
      • 注意将参数 priority 转换为整型
    • 调用 set_task_info() 方法,传入参数 task_id
  • 在 get_task() 方法中:
    • 新建变量 task_list_by_priority,值为:
      • 使用 ZREVRANGE 命令按照分值(优先级)从大到小顺序返回有序集合 task_queue 的全部成员。
    • 新建变量 current_task,值为:
      • task_list_by_priority 中的第一个元素(下标为 0)
    • 将成员 current_task 从有序集合 task_queue 中移除
    • 修改哈希 task_status 中的 current_task 域的值为 “processing”
    • 返回(return)current_task 的值

解答

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import redis

conn = redis.Redis()

# 初始化任务信息到 Redis 中
def set_task_info(task_id):
    # 请在下面完成要求的功能
    #********* Begin *********#
    conn.hset("task_status", task_id, "init")
    #********* End *********#

# 将任务添加至任务队列
def add_task_to_queue(task_id, priority):
    # 请在下面完成要求的功能
    #********* Begin *********#
    conn.zadd("task_queue", task_id, int(priority))
    set_task_info(task_id)
    #********* End *********#

# 从任务队列中取出优先级最高的任务
def get_task():
    # 请在下面完成要求的功能
    #********* Begin *********#
    task_list_by_priority = conn.zrevrange("task_queue", 0, -1)
    current_task = task_list_by_priority[0]
    conn.zrem("task_queue", current_task)
    conn.hset("task_status", current_task, "processing")
    return current_task
    #********* End *********#

第3关:Redis基本事务与其他命令

编程要求

根据提示,在右侧Begin-End区域补充代码,完成网络约车的后端处理逻辑:

  • 在 request_cab(user_id, priority) 方法中:
    • 判断是否存在哈希键 request:info:用户ID 的 time 域:
      • 提示:可使用 HEXISTS 命令
      • 若存在,则直接 return
      • 若不存在,做如下操作
        • 使用事务提交下列命令:
          • 将参数 user_id 从最左侧推入列表 cab:queue
        • 使用 HMSET 命令设置哈希键 request:info:用户ID:
          • 域 time,值为 time.time()
          • 域 priority,值为参数 priority
          • 将上述哈希键的过期时间设置为 10分钟
  • 在 allocate() 方法中:
    • 使用 SORT 命令对列表 cab:queue 排序,并将结果赋值给 cab_queue:
      • 使用 BY 参数
        • 参考键为哈希键 request:info:*,其中 * 为占位符
        • 使用上述参考键中的 priority 域
      • 使用 DESC 参数做倒序排序
    • 取出 cab_queue 的第一个元素(下标为 0)赋值给 current_respond
    • 从列表 cab:queue 中移除变量 current_respond 中包含的元素
    • 返回(return)current_respond

解答

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import time
import redis

conn = redis.Redis()

# 用户端发起派车请求
def request_cab(user_id, priority):
    # 请在下面完成要求的功能
    #********* Begin *********#
    if conn.hexists('request:info:' + str(user_id), 'time'):
        return
    else:
        pipe = conn.pipeline()
        pipe.lpush('cab:queue', user_id)
        pipe.hmset('request:info:' + str(user_id), {'time': time.time(), 'priority': priority})
        pipe.expire('request:info:' + str(user_id), 10*60)
        pipe.execute()
    #********* End *********#

# 平台选择优先级最高的派车请求并派车
def allocate():
    # 请在下面完成要求的功能
    #********* Begin *********#
    cab_queue = conn.sort('cab:queue', by='request:info:*->priority',desc=True)
    current_respond = cab_queue[0]
    conn.lrem('cab:queue', current_respond, 1)
    return current_respond
    #********* End *********#

# 用户端取消派车请求
def cancel_cab(user_id):
    conn.expire('request:info:' + str(user_id), 0)
    conn.lrem('cab:queue', user_id)

标签:queue,task,Redis,current,头歌,staff,id,conn,解答
From: https://blog.csdn.net/TluoshangY/article/details/144261795

相关文章

  • Redis探秘Sentinel(哨兵模式)
    概述Redis的高可用机制有持久化、复制、哨兵和集群。其主要的作用和解决的问题分别是:持久化:持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。复制:复制是高可用Redis的基础,哨兵和集群都是在复制......
  • JVM优化,Redis,MySQL相关面试题
    一、平常对SQL优化的了解1.索引优化创建索引:为常用的查询字段创建索引,可以显著提高查询速度。例如,为订单金额的字段创建索引,可以加速按订单金额的排序操作。优化索引:定期维护索引,避免索引碎片化,保持索引性能。使用覆盖索引:通过创建覆盖索引,可以避免回表操作,进一步提高查......
  • 【Java面试题 | 解答】Dubbo面试八连问,这些你都能答上来吗?
    Dubbo是什么?Dubbo能做什么?Dubbo内置了哪几种服务容器?Dubbo核心的配置有哪些?Dubbo有哪几种集群容错方案,默认是哪种?Dubbo有哪几种负载均衡策略,默认是哪种?Dubbo默认使用的是什么通信框架,还有别的选择吗?你觉得用Dubbo好还是SpringCloud好?1.Dubbo是什么?Dubbo是......
  • Redis指南【5】图解深入 RDB 与 AOF
    前言Redis它是一个键值对的内存数据库,读写数据都是基于内存的,所以它的性能非常高,但同时如果服务器一旦宕机,那么内存的数据是不可恢复的,所以,redis想到了持久化,如何把内存中的数据优雅的同步到磁盘中,以便redis在重启时能够恢复原有的数据,这就是持久化。Redis的持久化有三......
  • 第58篇 Redis常用命令
    1.基本操作2.字符串(Strings)3.列表()4.哈希(Hashes)5.位图(Bitmaps)6.位域(Bitfields)7.集合(Sets)8.有序集合(SortedSets)9.流(Streams)10。地理空间(Geospatial)11.HyperLogLog......
  • Redis——个人笔记留存
    今日内容1.redis1.概念2.下载安装3.命令操作1.数据结构4.持久化操作5.使用Java客户端操作redisRedis1.概念:redis是一款高性能的NOSQL系列的非关系型数据库1.1.什么是NOSQLNoSQL(NoSQL=NotOnlySQL),意即“不仅......
  • filebeat收集日志输出到redis
    目的:使用filebeat收集日志,将日志信息存储到redis---持久化存储,减轻localstorage的压力前提:安装了Elasticsearch跟filebeat,并启动Elasticsearch问题:redis安装成功,配置文件修改成功,重新启动数据库。然后在另一台节点使用nc命令模拟客户端发送数据并指定端口(在.yml......
  • Redis7缓存介绍及在Window下配置启动过程
    Redis介绍Redis(RemoteDictionaryServer),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)......
  • redis开门之批量插入pipeLine
    Redis开门之批量插入Pipeline下发数据同步到Redis中,数据少的话几千条,多则达百万级。其中一个场景是把下发的数据同步到Redis中,数据同步完成后,把数据写入到文件中,下发给客户,客户调用。某天......产品经理:小A,我发现我们这个数据整体下发的流程耗时有点长啊...从拉取数据到处理下发......
  • 建筑行业提高效率靠什么可视化软件?求解答!
    在建筑行业中,高效的团队协作至关重要。随着科技的不断发展,越来越多的可视化团队协同管理办公软件涌现出来,为建筑团队提供了更高效的工作方式。下面,我们将盘点五款可视化提高团队协同管理办公效率的软件,包括板栗看板以及国外的四款相关小众软件。一、板栗看板板栗看板是一款功能......