当前位置: 首页 > news >正文

Redis:查询是否包含某个字符/字符串之三

 上一篇:Redis:查询是否包含某个字符/字符串之二-CSDN博客

摘要:

遍历key,在跟进value的类型遍历value是否包含指定字符串 search_strings ,这里使用redis-py库,默认只能处理utf-8编码,如果存在其他编码会出现问题。

使用decode_responses=True可以顺利的遍历不同类型的value,不使用该参数可以顺利遍历不同编码的key。

正文:

源代码

import redis
import chardet# 连接到Redis服务器
r = redis.Redis(host=' xx', port=6935, db=9, decode_responses=True)
# r = redis.Redis(host=' xx', port=6935, db=9)# 假设我们有以下key和它们对应的数据类型
# key1: 字符串
# key2: 列表
# key3: 集合
# key4: 有序集合
# key5: 哈希表# 函数:根据key的数据类型执行不同的操作
def handle_data_by_type(key, file, search_strings):try:# 获取key的类型data_type = r.type(key)# b'string'if data_type == 'string':# 对于字符串,直接获取并打印value = r.get(key)# print(f"String: {value}")has_attr(value, key, file, search_strings)elif data_type == 'list':# 对于列表,遍历并打印每个元素values = r.lrange(key, 0, -1)  # 获取列表中的所有元素for value in values:has_attr(value, key, file, search_strings)# print(f"List Element: {value}")elif data_type == 'set':# 对于集合,遍历并打印每个元素(注意集合是无序的)members = r.smembers(key)for member in members:# has_attr(member, key, file, search_strings)print(f"Set Member: {member}")elif data_type == 'zset':# 对于有序集合,遍历并打印每个元素及其分数for member, score in r.zscan_iter(key):print(f"Sorted Set Member: {member}, Score: {score}")elif data_type == 'hash':# 对于哈希表,遍历并打印每个字段及其值for field in r.hkeys(key):# result = chardet.detect(field)# encoding = result['encoding']value = r.hget(key, field)has_attr(value, key, file, search_strings)# print(f"Hash Field: {field}, Value: {value}")else:print(f"Unknown data type for key: {key}")except Exception as e:print(f"Error processing key: {key}, error: {e}")# 示例:处理不同的key# handle_data_by_type('key1')  # 假设key1是字符串
# handle_data_by_type('key2')  # 假设key2是列表
# handle_data_by_type('key3')  # 假设key3是集合
# handle_data_by_type('key4')  # 假设key4是有序集合
# handle_data_by_type('key5')  # 假设key5是哈希表# 注意:上面的'key1'到'key5'及其数据类型只是示例,你需要根据实际情况替换它们
def has_attr(value, key, file, search_strings):if value:  # 确保value不是None# 检查value是否包含任何一个search_strings中的字符串for search_string in search_strings:if search_string in value:# print(f"Key: {key}, Value: {value}, contains: {search_string}")file.write(f"Key: {key}, Value: {value}, contains: {search_string}\n")break  # 如果已经找到一个匹配的字符串,可以跳出内层循环if __name__ == '__main__':# 连接到Redis服务器# r = redis.Redis(host='10.14.177.66', port=6935, db=9, decode_responses=True)# 要搜索的字符串列表search_strings = ['xxx ']# 使用SCAN命令迭代遍历Redis中的所有keycursor = '0'with open('20240813_1916.txt', 'a') as file:while cursor != 0:cursor, keys = r.scan(cursor=cursor, match='*', count=10)# print(f"Cursor: {cursor}, Keys: {keys}, Length: {len(keys)}")for key in keys:try:# 尝试将键解码为 UTF-8 字符串decoded_key = key.decode('utf-8')# print(f"Processing key: {key}")handle_data_by_type(decoded_key, file, search_strings)# 获取key对应的value# value = r.get(key)# if value:  # 确保value不是None#     # 检查value是否包含任何一个search_strings中的字符串#     for search_string in search_strings:#         if search_string in value:#             print(f"Key: {key}, Value: {value}, contains: {search_string}")#             break  # 如果已经找到一个匹配的字符串,可以跳出内层循环except Exception as e:print(f"Error scanning keys, error: {e}")# 注意:上面的代码假设所有value都是字符串。如果value是其他类型(如列表、集合等),则需要相应地调整检查逻辑。

在Python的redis库或类似的Redis客户端库中,decode_responses=True是一个非常重要的参数,它决定了从Redis服务器接收到的响应数据是如何被处理的。

解释

默认情况下,当你从Redis数据库读取数据时(比如使用gethgetlrange等命令),返回的数据类型是bytes(字节串)。这是因为Redis本身是以二进制安全的方式存储数据的,所以它返回的数据也是原始的二进制数据。

当你设置decode_responses=True时,客户端库会自动将接收到的bytes类型数据解码为字符串(str)。这通常意味着,如果你的数据原本是以UTF-8或其他编码方式存储的文本,那么你就可以直接以字符串的形式处理这些数据,而无需手动进行解码。

使用场景

  • 文本数据处理:如果你的Redis数据库主要用于存储和检索文本数据(如字符串、列表中的字符串元素等),那么设置decode_responses=True可以大大简化数据处理流程。
  • 二进制数据处理:如果你需要处理的是二进制数据(如图片、视频文件等),那么你可能不希望自动解码响应。在这种情况下,你应该保持默认设置(即不设置decode_responses或显式设置为False),以便以bytes类型接收数据。

--end---

相关文章:

Redis:查询是否包含某个字符/字符串之三

上一篇:Redis:查询是否包含某个字符/字符串之二-CSDN博客 摘要: 遍历key,在跟进value的类型遍历value是否包含指定字符串 search_strings ,这里使用redis-py库,默认只能处理utf-8编码,如果存在…...

【Redis】数据类型详解及其应用场景

目录 Redis 常⻅数据类型预备知识基本全局命令小结 数据结构和内部编码单线程架构引出单线程模型为什么单线程还能这么快 Redis 常⻅数据类型 Redis 提供了 5 种数据结构,理解每种数据结构的特点对于 Redis 开发运维⾮常重要,同时掌握每种数据结构的常⻅…...

PARA-Drive:设计并行模型实现端到端自动驾驶

论文链接 https://openaccess.thecvf.com/content/CVPR2024/papers/Weng_PARA-Drive_Parallelized_Architecture_for_Real-time_Autonomous_Driving_CVPR_2024_paper.pdfhttps://openaccess.thecvf.com/content/CVPR2024/papers/Weng_PARA-Drive_Parallelized_Architecture_fo…...

vs2022 x64 C/C++和汇编混编 遇到的坑

vs2022 x64 C/C和汇编混编 遇到的坑 遇到的问题二、问题复现1.出错代码2.问题分析2.1 堆栈对齐问题 3.解决方案 总结奇数和偶数个寄存器的影响为什么 sub rsp, 8 对奇数个寄存器有用?结论 遇到的问题 0x00007FFFFAE24A29 (msvcp140.dll)处(位于 TestCompileConsole…...

PHP概述、环境搭建与基本语法讲解

目录 【学习目标、重难点知识】 什么是网站? 1. PHP 介绍 1.1. PHP 概述 1.1.1. PHP 是什么? 1.1.2. PHP 都能做什么? 1.2. PHP 环境搭建 1.2.1. PhpStudy 2. PHP 基本语法 2.1. PHP 语法入门 2.1.1. 第一个 PHP 程序 2.1.2. PHP …...

实现信创Linux麦克风摄像头录制(源码,银河麒麟、统信UOS)

随着信创国产化浪潮的来临,在国产操作系统上的应用开发的需求越来越多,其中一个就是需要在银河麒麟或统信UOS上实现录制摄像头视频和麦克风声音,将它们录制成一个mp4文件。那么这个要如何实现了? 一. 技术方案 要完成这些功能&a…...

深度学习9--目标检测

1.概念介绍 目标检测不仅可以检测数字,而且可以检测动物的种类、汽车的种类等。例如,自动驾驶车辆需要自动识别前方物体是车辆还是行人,需要自动识别道路两 旁的指示牌和前方的红绿灯颜色。对于自动检测的算法,有两个要求&#xf…...

第131天:内网安全-横向移动Kerberos 攻击SPN扫描WinRMWinRSRDP

案例一:域横向移动-RDP-明文&NTLM RDP利用的三种方式 1.直接在当前被控主机上进行远程连接 2.建立节点进行连接 3.端口转发,(访问当前主机的2222端口等于访问目标的3389) 第一种方式(动静太大) 直接利用被控主机进行远程连接…...

微信小程序的四种弹窗使用

​ 在做小程序的过程中,弹窗也算是非常实用的功能了,这几天写的几个功能就用到了弹窗,也可能是初学者的问题,比较菜,想找一个可以带图片的自定义的弹窗,,这里简单介绍一下官方封装好的四个弹窗…...

我的第一个CUDA程序

MatAdd算法 实现两个矩阵对应元素相加 #include <stdio.h> #include <stdlib.h>// 矩阵加法函数 void MatAdd(int height, int width) {// 在主机内存中为 A、B 和 C 分配内存float* A (float*)malloc(height * width * sizeof(float));float* B (float*)malloc…...

workerman下的webman路由浏览器跨域的一种问题

软件版本 "php": ">7.2", "workerman/webman-framework": "^1.5.0",问题情景 使用“分组路由”做API接口前后端分离跨域&#xff0c;在接口测试工具调试是能正常获取数据的&#xff1b;但在网页浏览器上调试就遇到了CORS、404的错…...

Windows11 -MASKRCNN-部署测试

文章目录 Detectron2环境配置搭建python 环境安装Cuda \CUDNN 、PyTorch、 torchvision、cudatoolkit1、Cuda \CUDNN2、 PyTorch、 torchvision、cudatoolkit进入python测试&#xff1a;错误信息 3、detectron2环境在安装detecteron中&#xff0c;遇到报错&#xff1a;编译的时…...

函数(子程序)的常见、易混淆概念详解【对初学者有帮助】

C语⾔中的函数也被称做子程序&#xff0c;意思就是⼀个完成某项特定的任务的⼀小段代码。 C语⾔标准中提供了许多库函数&#xff0c;点击下面的链接可以查看c语言的库函数和头文件。 C/C官⽅的链接&#xff1a;https://zh.cppreference.com/w/c/header 目录 一、函数头与函…...

TiDB-从0到1-DM工具

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇TiDB-从0到1-集群扩缩容TiDB-从0到1-数据导出导入TiDB-从0到1-BR工具 一、DM原理 支持全量抽取数据\检测新的数据变化同步到下游实例…...

AppScan——Web 应用安全扫描的得力工具

一、引言 在当今数字化时代&#xff0c;Web 应用成为企业业务的重要支撑&#xff0c;但同时也面临着各种安全威胁。AppScan 作为一款专业的 Web 应用安全扫描工具&#xff0c;为保障 Web 应用的安全性提供了有力的支持。本文将对 AppScan 进行详细介绍&#xff0c;包括其功能、…...

虚幻5|AI行为树,进阶篇

一&#xff0c;打开敌人的角色蓝图&#xff0c;编写以下蓝图&#xff0c;该蓝图只是创建一个敌人并非ai行为树 1.编写蓝图 2.打开主界面&#xff0c;创建一个导航网格体积&#xff0c;上一章都有讲&#xff0c;在添加体积这里面&#xff0c;找到导航网格体积&#xff0c;点击创…...

在 Spring Boot 中配置 Tomcat 监听多个端口

在现代微服务架构中&#xff0c;应用程序可能需要监听多个端口&#xff0c;以支持不同的服务或协议。Spring Boot 提供了灵活的配置选项&#xff0c;使得这一需求变得简单而高效。本文将介绍如何在 Spring Boot 中配置 Tomcat 以监听多个端口&#xff0c;并简要说明其中一些关键…...

stm32f407新建项目工程及烧录

1、新建一个文件夹&#xff0c;打开keil5将项目工程放入文件夹中 2、弹出选择对应型号设备 3、弹出选择对应库 可以看见出现下图&#xff1a;感叹号表示有错 最后如图所示&#xff1a;点击ok就行了 4、创建对应的文件夹存放文件 4、建立main.c 5、添加对应的设置 最后写一个空白…...

c++中加不加const的值传递和引用传递的区别

文章目录 可以修改参数值的比较值传递(int x)和引用传递(int &x)使用const不修改参数值的比较值传递(const int x)和引用传递(const int &x)1. const int x 示例2. const int &x 示例 可以修改参数值的比较值传递(int x)和引用传递(int &x) #include <iost…...

Qt的窗口设置

本文介绍Qt的窗口设置。 采用Qt开发界面程序&#xff0c;会涉及到窗口的设置&#xff0c;如窗口标题栏是否显示&#xff0c;是否有最小&#xff0c;最大化按钮等&#xff0c;窗口当前显示最小化&#xff0c;最大化等。本文简要介绍常用的窗口设置方法。 1.窗口属性 窗口属性…...

一个寒假过去了 把虚拟机密码忘了怎么办

此时需要重启或开启虚拟机出现一下界面快速点进虚拟机按上下选择第二个选项按e进入以下界面 并在quiet 单词后输入rd.break 按下ctrlx进入以下界面输入mount -o remount,rw /stsrootchroot /sysrootpasswd新密码再次确认新密码touch /.autorelabelexitexit回车后系统会重启...

OpenWrt虚拟机磁盘扩容实战:从SquashFS到ext4的完整避坑指南

OpenWrt虚拟机磁盘扩容实战&#xff1a;从SquashFS到ext4的完整避坑指南 当你第一次在虚拟机中部署OpenWrt时&#xff0c;可能会惊讶于这个轻量级路由系统仅占用几十MB空间。但随着插件安装和日志积累&#xff0c;原本充裕的磁盘空间会迅速告急。这时你会发现&#xff0c;OpenW…...

CasRel关系抽取模型Python爬虫实战:自动化数据采集与关系构建

CasRel关系抽取模型Python爬虫实战&#xff1a;自动化数据采集与关系构建 如果你做过信息抽取项目&#xff0c;肯定遇到过这样的麻烦&#xff1a;数据散落在各个网站&#xff0c;需要手动复制粘贴&#xff0c;然后还得自己写规则去识别谁是谁、谁和谁有什么关系。整个过程费时…...

BiliBiliCCSubtitle:全能B站字幕处理工具,让视频字幕获取与应用更高效

BiliBiliCCSubtitle&#xff1a;全能B站字幕处理工具&#xff0c;让视频字幕获取与应用更高效 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 你是否曾因想保存外…...

2059年的地球,我用Python预言给你看!附完整实验结果和可视化界面详解

引言&#xff1a;当代码遇见地球1850年&#xff0c;工业革命的烟囱第一次在英国上空冒起黑烟。那时的人们不会想到&#xff0c;这些烟雾将在地球上空累积成改变气候的“被子”。2026年3月15日&#xff0c;凌晨2点23分&#xff0c;我盯着电脑屏幕上的模拟结果&#xff0c;久久说…...

便捷寄件,省心直达——快递寄件小程序前端功能解析

日常工作生活中&#xff0c;快递寄件的便捷性的需求日益凸显&#xff0c;繁琐的寄件流程往往耗费人们大量时间。快递寄件小程序以用户核心需求为导向&#xff0c;打造简洁易用的前端功能&#xff0c;打通寄件全流程&#xff0c;弱化营销属性&#xff0c;专注为用户提供高效、省…...

新西伯利亚大学推出“Pisets“:让机器写字员听懂每一句话

这项由新西伯利亚州立大学与西伯利亚神经网络有限公司合作完成的研究发表于2026年1月26日&#xff0c;论文编号为arXiv:2601.18415v1。有兴趣深入了解的读者可以通过该编号查询完整论文。研究团队开发了一款名为"Pisets"的语音识别系统&#xff0c;这个名字来源于古罗…...

lettcode hot 100题解(待更新完毕)

hot 100>:star:哈希>:star: 双指针>:star:滑动窗口>:star:字串>:star:普通数组>:star:矩阵>:star:链表>:star:二叉树>:star:图论>:star:回溯>:star:二分查找>:star:栈>:star:堆>:star:贪心算法>:star:动态规划>:star:多维动态…...

非接触式路面传感器 非接触式路面状况检测器

路面状态监测是道路安全运维的核心环节&#xff0c;传统埋入式传感器存在安装繁琐、易损坏、维护成本高的痛点&#xff0c;难以适配复杂交通场景需求。非接触式路面传感器依托先进遥感技术&#xff0c;以无损安装、高精度监测的核心优势&#xff0c;打破传统监测局限&#xff0…...

AE脚本开发:比迪丽AI绘画视频片段自动生成方案

AE脚本开发&#xff1a;比迪丽AI绘画视频片段自动生成方案 1. 场景需求与痛点分析 做视频的朋友都知道&#xff0c;找素材是个头疼事。特别是需要特定风格的动画片段时&#xff0c;要么找不到合适的&#xff0c;要么找到了价格太贵。传统做法要么是自己一帧帧画&#xff0c;要…...