Redis的一个典型应用

1.redis服务器与python编程环境

#install server

sudo apt update

sudo apt install redis-server

#install python api

pip install redis --timeout 200 -i http://mirrors.aliyun.com/pypi/simple/  --trusted-host mirrors.aliyun.com 

1.1 测试代码

# 创建Redis客户端实例
r = redis.Redis(host='localhost', port=6379, db=0)# 设置键值对
r.set('key', 'value')# 获取值
value = r.get('key')
print(value)  # 输出: b'value',b表示bytes类型# 删除键
r.delete('key')

2.接口封装1:命令行sh脚本的模式

使用redis缺省配置,就可以达到异常关机后,队列数据自动复原 

2.1 enqueue.sh

#!/bin/bash
# usage: enqueue key1 value1 5
# key1, push value1, the queue max length is 5.
# 陈旧数据会被抛弃# 设置 Redis 连接信息
REDIS_CLI="redis-cli"  # 替换为你的 redis-cli 路径,或者如果已在 PATH 中,直接使用 redis-cli
REDIS_HOST="localhost"          # Redis 服务器主机名或 IP
REDIS_PORT="6379"               # Redis 服务器端口号
KEY=$1                          # 要设置的 Redis 键名
VALUE=$2                        # 要设置的 Redis 值
MAX_LENGTH=$3                   # 最大长度# 检查列表当前长度
current_length=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT LLEN $KEY)# 如果列表长度小于最大长度,则添加新元素
if [ $current_length -gt $MAX_LENGTH ]; then$REDIS_CLI -h $REDIS_HOST -p $REDIS_PORT RPOP $KEY
fi# 使用 redis-cli 执行 SET 命令
$REDIS_CLI -h $REDIS_HOST -p $REDIS_PORT LPUSH $KEY $VALUE

2.2 fetch_top.sh

#!/bin/bash
#usage: fetch_top key1
#得到某个队列的最新值# 设置 Redis 连接信息
REDIS_CLI="redis-cli"  # 替换为你的 redis-cli 路径,或者如果已在 PATH 中,直接使用 redis-cli
REDIS_HOST="localhost"          # Redis 服务器主机名或 IP
REDIS_PORT="6379"               # Redis 服务器端口号
KEY="$1"                    # Redis 列表键名# 使用 redis-cli 执行 LINDEX 命令获取列表的首个元素
FIRST_ELEMENT=$($REDIS_CLI -h $REDIS_HOST -p $REDIS_PORT LINDEX $KEY 0)# 检查 LINDEX 命令执行结果
if [ -n "$FIRST_ELEMENT" ]; thenecho "$FIRST_ELEMENT"
elseecho ""
fi

 2.3 dequeue.sh 

#!/bin/bash
#将当前队列最新的元素丢弃# 设置 Redis 连接信息
REDIS_CLI="redis-cli"  # 替换为你的 redis-cli 路径,或者如果已在 PATH 中,直接使用 redis-cli
REDIS_HOST="localhost"          # Redis 服务器主机名或 IP
REDIS_PORT="6379"               # Redis 服务器端口号
KEY="$1"                    # Redis 列表键名# 使用 redis-cli 执行 LINDEX 命令获取列表的首个元素
FIRST_ELEMENT=$($REDIS_CLI -h $REDIS_HOST -p $REDIS_PORT LPOP $KEY)# 检查 LINDEX 命令执行结果
if [ -n "$FIRST_ELEMENT" ]; thenecho 0
elseecho 1
fi

3.接口封装2:python的格式,包含结构化对象的定义

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 获取当前脚本文件所在目录的父目录,并构建相对路径
import os
import sys
current_dir = os.path.dirname(os.path.abspath(__file__))
project_path = os.path.join(current_dir, '..')
sys.path.append(project_path)
sys.path.append(current_dir)
import datetime
import paho.mqtt.client as mqtt
import cat4Config
import struct
import subprocess
import time
import json
import queue
import numpy as np
import threading
import subprocess
import pickle
import redisclass GpPublishMsg:def __init__(self, time, ar_class, pic, addr_web_api):self.time = timeself.ar_class = ar_class,self.pic = picself.addr_web_api = addr_web_apiclass GpPublicMsgQueue:def __init__(self):self.MAX_QUEUE_LEN = 3600self.errCnt = 0self.keyname = current_dir.replace('/', ':').replace('\\', ':').replace('.', ':')def enqueue(self, msg:GpPublishMsg):try:# 创建Redis客户端实例r = redis.Redis(host='localhost', port=6379, db=0)size = r.llen(self.keyname)if(size>self.MAX_QUEUE_LEN):r.rpop(self.keyname)r.lpush(self.keyname, pickle.dumps(msg))except:self.errCnt = self.errCnt+1def dequeue(self) -> GpPublishMsg:try:# 创建Redis客户端实例r = redis.Redis(host='localhost', port=6379, db=0)br = r.lpop(self.keyname)if(br is not None):return pickle.loads(br)else:return Noneexcept:self.errCnt = self.errCnt+1return Nonedef fetch_queue_top(self) -> GpPublishMsg:try:# 创建Redis客户端实例r = redis.Redis(host='localhost', port=6379, db=0)size = r.llen(self.keyname)if(size==0):return Nonebr = r.lindex(self.keyname, 0)if(br is not None):return pickle.loads(br)else:return Noneexcept:self.errCnt = self.errCnt+1return Nonedef test(self):item1 = GpPublishMsg(2024, 'class1', 'pic1', "http://1")item2 = GpPublishMsg(2024, 'class1', 'pic2', "http://1")item3 = GpPublishMsg(2024, 'class1', 'pic3', "http://1")dumb = self.fetch_queue_top()print('before first enqueue, top() = ', dumb)self.enqueue(item1)print('enqueue item1, top() = ', self.fetch_queue_top().pic)self.enqueue(item2)print('enqueue item2, top() = ', self.fetch_queue_top().pic)self.dequeue()print('first dequeue, top() = ', self.fetch_queue_top().pic)self.enqueue(item3)print('enqueue(item3), top() = ', self.fetch_queue_top().pic)self.dequeue()print('dequeue(), top() = ', self.fetch_queue_top().pic)self.dequeue()print('dequeue(), top() = ', self.fetch_queue_top())

3.1 python封装测试

'''
>>> import ext_pic_out_offline_queue as gpqueue
>>> q = gpqueue.GpPublicMsgQueue()
>>> q.test()
before first enqueue, top() =  None
enqueue item1, top() =  pic1
enqueue item2, top() =  pic2
first dequeue, top() =  pic1
enqueue(item3), top() =  pic3
dequeue(), top() =  pic1
dequeue(), top() =  None
'''def test(self):item1 = GpPublishMsg(2024, 'class1', 'pic1', "http://1")item2 = GpPublishMsg(2024, 'class1', 'pic2', "http://1")item3 = GpPublishMsg(2024, 'class1', 'pic3', "http://1")dumb = self.fetch_queue_top()print('before first enqueue, top() = ', dumb)self.enqueue(item1)print('enqueue item1, top() = ', self.fetch_queue_top().pic)self.enqueue(item2)print('enqueue item2, top() = ', self.fetch_queue_top().pic)self.dequeue()print('first dequeue, top() = ', self.fetch_queue_top().pic)self.enqueue(item3)print('enqueue(item3), top() = ', self.fetch_queue_top().pic)self.dequeue()print('dequeue(), top() = ', self.fetch_queue_top().pic)self.dequeue()print('dequeue(), top() = ', self.fetch_queue_top())

4.为什么要用redis

在编程模式上,订阅模式在分布式环境的一个实现形式,就是mqtt。它可以非常方便地处理消息分发。甚至可以将这个应用添加进嵌入式系统——这个分布式协同机制的开销极小。但是mqtt不负责持久化。顶多,它会保留同一个topic下的最后一笔数据,它不进行数据保存,只是把信息分发给当前在线的用户。

如果你需要一个存储缓冲的机制,那么redis就是非常适合的选择。

你可以手工实现,但是它有代价——你无法方便地调试,然后你会遇到重复发明轮子过程中必然遭遇的各种技术细节。

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

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

相关文章

树状数组(Binary Indexed Tree, BIT)

树状数组(Binary Indexed Tree, BIT) 树状数组(Binary Indexed Tree, BIT),也称为 Fenwick Tree,是一种用于高效处理数组前缀和查询和单点更新的数据结构。它能够在 (O(\log n)) 时间内完成单点更新和前缀…

python作业二

# 二进制转化为十进制 num input("num:")def binaryToDecimal(binaryString):he 0length len(binaryString)for i in range(length):he int(binaryString[i]) * 2 ** (length - i - 1)return heprint(binaryToDecimal(num))代码运行如下: import math…

特种设备管理为什么这么难?为何它是安全生产的重中之重?

随着工业化进程的加速和科技水平的不断提升,特种设备作为工业生产、公共服务和基础设施建设中的关键要素,其应用范围日益广泛,从大型压力容器、锅炉、电梯、叉车到压力管道、客运索道等,无一不渗透于我们日常生活的方方面面。然而…

【qt】QTcpSocket相关的信号

QTcpSocket可以在这里找到相关的信号 进行信号槽的关联 connect():这个信号在connectToHost()被调用并且连接已经成功建立之后发出 disconnected():该信号在套接字断开连接时发出 stateChanged(QAbstractSocket::SocketState socketState):每当QAbstractSocket的状态发生变化…

【若依前后端分离】通过输入用户编号自动带出部门名称(部门树)

一、部门树 使用 <treeselect v-model"form.deptId" :options"deptOptions" :show-count"true" placeholder"请选择归属部门"/> <el-col :span"12"><el-form-item label"归属部门" prop"dept…

音视频开发—使用FFmpeg从纯H264码流中提取图片 C语言实现

文章目录 1.H264码流文件解码流程关键流程详细解码流程详细步骤解析 2.JPEG编码流程详细编码流程详细步骤解析 3.完整示例代码4.效果展示 从纯H.264码流中提取图片的过程包括解码和JPEG编码两个主要步骤&#xff0c;以下是详细阐述 1.H264码流文件解码流程 关键流程 查找编解…

go语言处理特定格式的时间 例如打印出来2024-07-12 12:22:22 -2024-07-12 12:52:22

在Go语言中&#xff0c;你可以使用time包来创建、操作和格式化时间。要打印出两个特定时间&#xff08;例如开始时间和结束时间&#xff09;的字符串表示&#xff0c;并且格式化为YYYY-MM-DD HH:MM:SS这样的形式&#xff0c;你可以使用time.Format方法。 以下是一个例子&#x…

敏捷开发笔记(第10章节)--Liskov原则(LSP)

目录 1&#xff1a;PDF上传链接 10.1 Liskov替换原则&#xff08;LSP&#xff09; 10.2 一个违反LSP的简单例子 10.6 启发式规则和习惯用法 10.7 结论 1&#xff1a;PDF上传链接 【免费】敏捷软件开发(原则模式与实践)资源-CSDN文库 OCP背后的主要机制是抽象(abstraction…

group 与查询字段

需求 每周周一&#xff0c;统计菜单在过去一周&#xff0c;点击次数&#xff0c;和点击人数&#xff08;同一个人访问多次按一次计算&#xff09; 表及数据 日志表 CREATE TABLE t_data_log ( id varchar(50) NOT NULL COMMENT 主键id, operation_object varchar(500) DE…

【D3.js in Action 3 精译】1.3 D3 视角下的数据可视化最佳实践(下)

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介 ✔️ 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知 1.2.1 HTML 与 DOM1.2.2 SVG - 可缩放矢量图形1.2.3 Canvas 与 WebGL1.2.4 CSS1.2.5 JavaScript1.2.6 Node 与 JavaScript 框架1.2.7 Observable 记事…

python工作中遇到的坑

1. 字典拷贝 有些场景下&#xff0c;需要对字典拷贝一个副本。这个副本用于保存原始数据&#xff0c;然后原来的字典去参与其他运算&#xff0c;或者作为参数传递给一些函数。 例如&#xff0c; >>> dict_a {"name": "John", "address&q…

我的世界1.21多种服务端开服教程,原版/Forge/Fabric/Paper/Mohist...,Minecraft开服教程

Minecraft&#xff08;MC&#xff09;1.21版多种服务端开服教程&#xff0c;我的世界1.21服务器搭建教程&#xff0c;MC原版/Forge/Fabric/Paper/Mohist服务端搭建教程&#xff0c;我的世界MOD/插件服开服教程。 本教程使用 Linux系统MCSManager 面板来搭建Minecraft服务器。 …

人工智能行业应用-垃圾识别一

垃圾识别应用主要体现在AI图像垃圾识别技术上&#xff0c;这是一种基于人工智能和计算机视觉技术的图像处理技术&#xff0c;广泛应用于各个领域以提高垃圾处理的效率和准确性。 1、垃圾识别效果图 2 垃圾识别任务分析 综合利用Python语言、Qt开发模块&#xff0c;OpenCV开发模…

数据结构(Java):单链表面试OJ题

1、题一&#xff1a;获取链表倒数第k个节点 . - 力扣&#xff08;LeetCode&#xff09; 1.1 思路解析 此题我们使用双指针法求解。 首先&#xff0c;我们要知道&#xff0c;倒数的第k个节点&#xff0c;距离倒数第一个节点还需要移动k-1次。 1.那么我们可以定义出两个指针&a…

MySQL之初识

SQL语句分类 1.数据定义语言DDL 简称DDL(Data Definition Language):用来定义数据库对象&#xff1a;数据库&#xff0c;表&#xff0c;列等。关键字&#xff1a;create&#xff0c;alter&#xff0c;drop等 2.数据操作语言DML 简称DML(Data Manipulation Language):用来对…

SQL去重的四种方法

去重是指&#xff1a;查询的时候, 不显示重复&#xff0c;并不是删除表中的重复项 数据表&#xff1a; 方法1&#xff1a;distinct去重 作用&#xff1a;只能一列去重&#xff0c;当distinct后跟大于1个参数时&#xff0c;他们之间的关系是&&(逻辑与)关系&#xff0c;…

lamda表达式使用

1、对象list中取某一个元素形成新的数组 bridgeInfos.stream().map(NavigableBridgePO::getId).collect(Collectors.toList()); 2、对象list中按某个元素分组形成新的map Map<String,List<ProjectFilePO>> projectFileMap projectFilePOS.stream().collect(Col…

00 Debian字符界面如何支持中文

作者&#xff1a;网络傅老师 特别提示&#xff1a;未经作者允许&#xff0c;不得转载任何内容。违者必究&#xff01; Debian字符界面如何支持中文 《傅老师Debian知识库系列之00》——原创 前言 傅老师Debian知识库特点&#xff1a; 1、拆解Debian实用技能&#xff1b; 2、…

ArcGIS获取21天免费教程,不用自己的邮箱

因为迟迟等不到3.1学习版本&#xff0c;但又很眼馋3.1的功能。 在群友的提醒下&#xff0c;官网免费注册21天试用&#xff0c;注册一次可以用21天&#xff0c;基本全部功能都可以使用。 &#xff08;也有群里的人用PayPal支付&#xff0c;然后设置离线许可&#xff0c;官网退…

Sentinel 学习笔记

Sentinel 学习笔记 作者&#xff1a;王珂 邮箱&#xff1a;49186456qq.com 文章目录 Sentinel 学习笔记[TOC] 前言一、基础概念二、Sentinel控制台2.1 安装控制台2.2 簇点链路2.3 请求限流2.4 线程隔离2.5 服务降级2.6 服务熔断 三、Sentinel客户端3.1 原始Jar包客户端3.2 Sp…