RedisTemplate中使用scan方法代替keys指令

news2024/11/15 15:49:18

在这里插入图片描述

keys * 这个命令千万别在生产环境乱用,危险级别不亚于flushdb。因为Redis是单线程操作,在数据特别庞大的情况下。Keys会引发Redis锁(数据过多一直查询处理),并且增加Redis的CPU占用。很多公司的运维都是禁止了这个命令的

当需要扫描key,匹配出自己需要的key时,可以使用 scan 命令

scan操作的Helper实现

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

@Component
public class RedisHelper {
    
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    
    /**
     * scan 实现
     * @param pattern    表达式
     * @param consumer    对迭代到的key进行操作
     */
    public void scan(String pattern, Consumer<byte[]> consumer) {
        this.stringRedisTemplate.execute((RedisConnection connection) -> {
            try (Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().count(Long.MAX_VALUE).match(pattern).build())) {
                cursor.forEachRemaining(consumer);
                return null;
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        });
    }

    /**
     * 获取符合条件的key
     * @param pattern    表达式
     * @return
     */
    public List<String> keys(String pattern) {
        List<String> keys = new ArrayList<>();
        this.scan(pattern, item -> {
            //符合条件的key
            String key = new String(item,StandardCharsets.UTF_8);
            keys.add(key);
        });
        return keys;
    }
}

demo写到这步已经可以用了,注意传参的String pattern是要带*号的,比如我想查user_info:1、user_info:2等等数据,则匹配user_info:前缀(redis的key最好用枚举类+定义常量),此时传参的pattern即为"user_info:* "

但此demo会有一个问题:没法移动cursor,也只能scan一次,并且容易导致redis链接报错。

之后的优化思路和手段请见:

在RedisTemplate中使用scan代替keys指令

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

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

相关文章

Python实现FA萤火虫优化算法优化循环神经网络回归模型(LSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

狗都会配的SNAT和DNAT配置

1 SNAT 1.1 SNAT SNAT原理与应用:. SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) SNAT原理:源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映谢 SNAT转换前提条件: 1.局域网各主机已正确设…

13-Vue基础之自定义指令与插槽的使用

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

Apipost推出IDEA插件,代码写完直接调试

IDEA是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作&#xff0c;一般需要打开额外的调试工具。 今天给大家介绍一款IDEA插件&#xff1a;Api…

mysql 日志分析

程序启动标志 可以直接全局搜索&#xff0c;查看启动了几次 可以看到总共11次&#xff0c;当前是第2次 如何判断mysql是正常关闭&#xff0c;手动启动的 下图中启动之前出现 Shutdown complete打印说明启动之前是正常关闭的

2024 本田 CBR1000RR-R Fireblade SP

本田在米兰车展期间也发布了自家的旗舰仿赛&#xff0c;虽然不是重大改款&#xff0c;只是更新一些内容&#xff0c;性能方面有所小提升&#xff0c;但是毕竟人家是本田&#xff0c;毕竟人家是火刃&#xff0c;还是要尊重一下&#xff0c;写一篇内容的。 新款还是有一些亮点&am…

京东秒杀之秒杀实现

1 登录判断 用户在未登录状态下可以查看商品列别以及秒杀商品详情&#xff0c;但不可以在未登录状态进行秒杀商品的操作&#xff0c;当用户点击开始秒杀时&#xff0c;进行登陆验证 <!DOCTYPE html> <head><title>商品详情</title><meta http-eq…

C++ -- 每日选择题 -- Day2

第一题 1. 下面代码中sizeof(A)结果为&#xff08;&#xff09; #pragma pack(2) class A {int i;union U{char str[13];int i;}u;void func() {};typedef char* cp;enum{red,green,blue}color; }; A&#xff1a;20 B&#xff1a;21 C&#xff1a;22 D&#xff1a;24 答案及解析…

[NOIP2016 普及组] 回文日期

枚举好题&#xff0c;直接枚举答案 看看在不在范围内就行了 注意二月份 92200229是合法的~ 82200228也是合法的&#xff01; #include<bits/stdc.h> using namespace std;map<int,int>mp;int main() {mp[1] mp[3] mp[5] mp[7] mp[8] mp[10] mp[12] 31;mp[…

kafka C++实现消费者

文章目录 1 Kafka 消费者的逻辑2 Kafka 的C API2.1 RdKafka::Conf2.2 RdKafka::Event2.3 RdKafka::EventCb2.4 RdKafka::TopicPartition2.5 RdKafka::RebalanceCb2.6 RdKafka::Message2.7 RdKafka::KafkaConsumer&#xff08;核心&#xff09; 3 Kafka 消费者客户端开发3.1 必要…

为大家收集了一些最常用的Python包

我们从最常用的 Python 包入手&#xff0c;去解答上述这个问题。最初&#xff0c;我列出过去一年在 PyPI 上下载次数最多的 Python 包。接下来&#xff0c;深入研究其用途、它们之间的关系和它们备受欢迎的原因。 1、Urllib3 下载次数&#xff1a;8.93 亿 Urllib3是一个 Pyt…

MongoDB快速入门及其SpringBoot实战

MongoDB快速入门及其SpringBoot实战 MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个开源、高性能、无模式的文档型数据库&#xff0c;当初的设计就是用于简化开发和方便扩展&am…

numpy模块安装方法

https://www.bilibili.com/video/BV1qN411R7V2/?spm_id_from333.337.search-card.all.click&vd_sourcefb8dcae0aee3f1aab700c21099045395

AI去水印工具一键消除图片中的水印

对于从事图片设计和编辑的人来说&#xff0c;水印的存在确实是一个令人烦恼的问题。为了充分展现自己的作品&#xff0c;去除水印成为了不可或缺的一项任务。然而&#xff0c;传统的去水印方法往往操作繁琐&#xff0c;效率低下&#xff0c;而且难以实现百分之百的去除效果。 今…

zabbix分布式监控平台从IPV4切换到IPV6之监控主机切换

现在有一套监控了海量服务器的zabbix分布式监控平台需整体在线从IPV4切换到IPV6&#xff0c;不能影响其原有的定制监控及视图。本文讲解了切换的第一步--监控主机切换。 一、zabbix分布式监控平台平台架构 本套zabbix分布式监控平台是一个多代理服务器分布式部署的典型传统架构…

FFmpeg之将视频转为16:9(横屏)或9:16(竖屏)(一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

『OPEN3D』1.8.1 ICP配准

a目录 1、点到点&#xff08;point2point&#xff09;的配准 2、 点到面&#xff08;point2plane&#xff09;的配准 3、基于颜色的配准(color-icp) 4、点云配准核函数(robust kernel) 前面已经介绍过点云配准的基础理论内容&#xff0c;可以查看之前的文章&#xff1a; 『…

OLED双面显示广告机的应用场景

OLED双面显示广告机是一种创新的广告设备&#xff0c;它具有双面显示屏幕&#xff0c;可以同时向两个方向展示广告或信息。这种设备被广泛应用于各种场景&#xff0c;例如&#xff1a; 商业展示&#xff1a;在大型商业场所&#xff0c;如购物中心、百货商场等&#xff0c;OLED双…

18、串口通信

串口介绍 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信。 单片机的串口可以使单片机与单片机&#xff0c;单片机与电脑、单片机与各式各样的模块互相通信&#xff0c;极大的扩展了单片机的应用范围&…

在MySQL中如何存储一个IPv4地址?

在MySQL如何存储IPv4地址&#xff1f;这个在秋招面试的过程中被问到过&#xff0c;没有答上来&#xff0c;今天猛地想起了这个问题&#xff0c;做一下复盘。 一个IPv4地址是由32位二进制来表示的&#xff0c;用点分十进制表示可以划分为4部分&#xff0c;每部分占8位&#xff…