springboot+redis+mysql+quartz-通过Java操作jedis使用pipeline获取缓存数据定时更新数据库

news2024/11/14 16:36:27

一、重点

代码讲解:6-点赞功能-定时持久化到数据库-pipeline+lua-优化pipeline_哔哩哔哩_bilibili

https://www.bilibili.com/video/BV1yP411C7dr

代码:

blogLike_schedule/like06 · xin麒/XinQiUtilsOrDemo - 码云 - 开源中国 (gitee.com)

https://gitee.com/flowers-bloom-is-the-sea/XinQiUtilsOrDemo/tree/master/blogLike_schedule/like06

数据库表的设计:
blogLike_schedule · xin麒/XinQiUtilsOrDemo - 码云 - 开源中国 (gitee.com)

https://gitee.com/flowers-bloom-is-the-sea/XinQiUtilsOrDemo/tree/master/blogLike_schedule

架构图:

在这里插入图片描述

最开始的代码版本:

(108条消息) springboot+redis+mysql+quartz-通过Java操作redis的KEYS*命令获取缓存数据定时更新数据库_xin麒的博客-CSDN博客

二、核心代码:

定时板块就看这篇吧:

    @Override
    public void updateAllLikeListToDatabaseByPipeline1() {
        String prefix = "BLOG_LIKED_KEY";
//        Set<String> keys = getAllRedisKeyByKeys(prefix);//这个不行!
        Set<String> keys = getAllRedisKeyByScanThroughMatch(prefix);//通过scan拿到以BLOG_LIKED_KEY开头的所有key
        if (keys == null || keys.size() == 0) return;
        Map<Long,Map<String,String>> maps = getIdWithTimeListsByPipelineByJedis(keys);
        if (maps == null || maps.size() == 0) return;

        for (Map.Entry<Long, Map<String, String>> entry : maps.entrySet()) {
            Long blogId = entry.getKey();
            Map<String, String> likeList = entry.getValue();
            updateLikeListByBlogId(blogId,likeList);
        }

    }

这里还是算半Pipeline方法,因为zset的键是通过scan扫描获取到的,这里的scan扫描的方法应该是可以放到管道里面的。但是呢因为Pipeline不适合做太强逻辑相关的命令,所以这个应该也算可以的了。为什么?这里可以去看看这篇文章:

(108条消息) redis事务-pipeline-lua三者区别简单概括_xin麒的博客-CSDN博客

先通过scan方法扫出

public Set<String> getAllRedisKeyByScanThroughMatch(String prefix) {//找不到stringRedisTemplate对Zset里键值对扫描的资料
    Jedis jedis = null;
    Set<String> blogLikeList = new HashSet<>();
    ScanParams scanParams = new ScanParams();
    try {
        jedis = jedisPool.getResource();
        String cursor = "0";


        do {
            // 扫描并获取一部分key
            ScanResult<String> result = jedis.scan(cursor, scanParams.match(prefix.concat("*")));
            // 记录cursor
            cursor = result.getCursor();
            List<String> list = result.getResult();
            if (list == null || list.isEmpty()) {
                break;
            }

            // 遍历
            for (String key : list) {
                log.debug("key is {}", key);//这里可以看到有哪些key
                blogLikeList.add(key);
            }

        } while (!cursor.equals("0"));
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (jedis != null) jedis.close();
    }
    return blogLikeList;
}

然后再通过这个方法来使用pipeline技术:

    public Map<Long,Map<String,String>> getIdWithTimeListsByPipelineByJedis(Collection<String> collection) {

        String prefix = "BLOG_LIKED_KEY";
        Jedis jedis = null;
        Map<Long,Map<String,String>> maps = null;
        try {
            jedis = jedisPool.getResource();
            Pipeline pipe = jedis.pipelined();
            ArrayList<Long> blogKeyIds = new ArrayList<>(collection.size());
            for (String key : collection) {
                pipe.zrangeWithScores(key, 0, -1);
                blogKeyIds.add(Long.parseLong(key.substring(prefix.length(),key.length())));
            }
            List<Object> response = pipe.syncAndReturnAll();
            maps = pipeLineResponseTransformedToMap(response,blogKeyIds);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        } finally {
            jedis.close();
        }
        log.debug("maps is {}",maps);
        return maps;
    }

三、其他

现在是2023-07-01,不得不吐槽stringRedisTemplateRedisTemplate,如果要来实现使用pipeline技术将缓存里面的zset数据获取得到,好像只能用jedis了,其他的都很难找得到参考资料,全网搜不到,官网也很少资料(可能没细看),笑死,所以后面就用jedis来实现了。

其他类似的文章:

(108条消息) springboot+redis+mysql+quartz-通过Java操作redis的KEYS*命令获取缓存数据定时更新数据库_xin麒的博客-CSDN博客

(108条消息) springboot+redis+mysql+quartz-通过Java操作jedis定时使用lua脚本获取缓存数据并更新数据库_xin麒的博客-CSDN博客

(108条消息) lua脚本获取table类型-Java使用lua脚本操作redis获取zset元素的集合_xin麒的博客-CSDN博客

(108条消息) springboot+redis+mysql+quartz-通过Java操作jedis使用pipeline获取缓存数据定时更新数据库_xin麒的博客-CSDN博客

(108条消息) springboot+redis+mysql+quartz-通过Java操作jedis的scan命令获取缓存数据定时更新数据库_xin麒的博客-CSDN博客

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

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

相关文章

ubuntu下,verdi语法错误Syntax error: “(“ unexpected

【问题】/home/EDA_TOOLS/synopsys/verdi/verdi/Verdi_O-2018.09-SP2/bin/verdi: 56: /home/EDA_TOOLS/synopsys/verdi/verdi/Verdi_O-2018.09-SP2/bin/verdi: Syntax error: "(" unexpected 【解析】 代码对于标准bash而言没有错&#xff0c;因为Ubuntu/Debian为了加…

网络应用基础交换机的基础操作(NETBASE第六课)

网络应用基础交换机的基础操作&#xff08;NETBASE第六课&#xff09; 1 回顾代码实操 主题背景的转换 字体设置 背景的设置 第一点 在操作ENSP个人建议要关闭防火墙 第二点 在操作ENSP软件是观察下面的软件是否全部关闭了 第三点 打开软件 ENSP软件注册信息 操作如下 注册前…

Oracle之Scott用户

Oracle增删改查&#xff0c;事务与序列 前言 1、解锁scott用户 2、雇员表&#xff08;emp&#xff09; 3、部门表&#xff08;dept&#xff09; 4、工资等级表&#xff08;salgrade&#xff09;了解 5、奖金表&#xff08;bonus&#xff09;了解 1、解锁scott用户 --解锁scot…

对卷积和全连接之间关系的学习(1*1卷积与全连接层可以互换吗?)

1.对于卷积和全连接 首先我们看一张图&#xff0c;它是一张关于卷积的操作&#xff1a; 然后在看关于全连接的操作&#xff1a; 从上面两张图中可以看出卷积的过程和全连接的过程&#xff0c;我们利用粉色的卷积核在image上进行卷积&#xff0c;进行内积计算得到输出值3&#…

调用GPU进行深度学习模型训练问题检查总结

1、电脑是否具有nvidia的GPU显卡。 2、安装的cuda版本是否超过显卡支持的最高版本。 在nvidia设置->帮助->系统信息->组件&#xff0c;可查看。 3、安装的pytorch是否为gpu版&#xff0c;即使在官网中复制的gpu版安装命令&#xff0c;安装得到的也有可能为cpu版。 建…

【监控系统】监控系统简介以及主流监控框架对比

互联网应用中离不开监控系统&#xff0c;那么为什么会有监控系统呢&#xff1f; 互联网公司产品通常是通过软件、网站、App或其他数字化方式提供服务的&#xff0c;这类产品在使用过程中可能会面临一系列风险和挑战。 比如网络故障或稳定性问题&#xff0c;由于网络故障、硬件…

外设资源共享须知

外设资源共享 具有相同ID的只能使用一个&#xff0c;无法同时使用。 例如当使能了SPIM0&#xff0c; 就不能用TWIM0&#xff0c;因为基地址相同&#xff0c;不能同时使用。此时建议使用TWIM1. 在sdk_config.h 中配置时需留意。

tecplot360 只显示指定phase的设定体积分数的区域

tecplot360 只显示指定phase的设定体积分数的区域 到数入据抽取切面设定显示体积分数范围 参考1&#xff1a; Tecplot中如何提取水线面&#xff08;自由表面&#xff09;并绘图 参考2&#xff1a; 两相流计算中&#xff0c;如何用Tecplot提取水相断面平均物理量&#xff1f; …

创建一个django项目详细说明

1.首先安装django pip install django 2.创建django项目 django-admin startproject myproject 输入命令后自动生成相关文件 manage.py文件&#xff1a;这是管理Django项目的重要命令行工具&#xff0c;它主要用于启动项目、创建应用和完成数据库的迁移等。settings.py文件&…

mongodb集群工作原理学习

mongodb集群 MongoDB集群有好几种方式:,主从模式,副本集模式和分片的模式 其中主从模式基本不再使用,大多是后面两种 副本集模式 副本集模式主要是用于实现服务的高可用性,类型Redis的哨兵模式. 它主要是的特点: 创建集群后会有主节点(primary)和从节点(secondary). 但从节点…

1765_Perl实现fileread功能

全部学习汇总&#xff1a; GreyZhang/perl_basic: some perl basic learning notes. (github.com) fileread是MATLAB中的一个函数&#xff0c;可以实现对一个文本文件的全文读取。读取后的内容返回给一个字符串量。在Python中也有类似的功能&#xff0c;不过MATLAB中的这个更能…

快速创建ES集群

win10 中docker 设置 快速创建集群 访问 官网 elasticsearch/docs/reference/setup/install/docker at main elastic/elasticsearch GitHub 负责上面2个文件&#xff0c;并修改&#xff0c;修改如下 .env文件 # Password for the elastic user (at least 6 characters) …

【私有云】网络虚拟化

前言 大家好&#xff0c;我是秋意零。 之前一直对 OpenStack 网络很陌生与神奇啊&#xff0c;不知道它是如何实现的&#xff0c;网络结构是怎样的。不过&#xff0c;今天介绍的是网络虚拟化&#xff0c;它在 OpenStack 中及云计算中是非常重要的概念&#xff0c;是理解 OpenS…

springboot整合websocket遇到的小问题

今天尝试了通过springboot整合websocket来初步学习使用websocket&#xff0c;然后发现启动的时候报错了&#xff0c;发这篇文章分享一下。 springboot整合websocket的步骤很简单&#xff1a; 第一步&#xff1a;创建一个springboot项目&#xff0c;在这里命名为websocket 在I…

day16 移除元素

题目描述 解题思路&#xff1a; 1.快慢指针&#xff0c;移除数组元素只能是下标操作&#xff1b;fast往前&#xff0c;不等于value的时候&#xff0c;赋给slow&#xff1b; 2.slow&#xff1b;返回的长度直接返回slow&#xff1b; int removeElement(int* nums, int numsSize, …

Rethinking the Role of Pre-ranking in Large-scale E-Commerce Searching system

来源&#xff1a; KDD’2023Taobao Search 文章目录 ASHASMOL训练样本训练目标蒸馏精排 总结 反思粗排在大规模电商搜索系统中的角色。 由于巨大的数据量以及对系统实时反馈的要求&#xff0c;一个典型的工业排序系统通常由这些模块组成&#xff1a;召回&#xff08;matching&…

VTR编译问题

机器环境 vmware 16.0&#xff1b; ubuntu22.04.02; 问题描述 一、在build过程中会出现一些警告&#xff0c;但没有停止&#xff1b; 二、访问 **raw.githubsercontent.com/…/…**相关网站被拒绝&#xff0c;如下图&#xff1a; 之前在 /etc/hosts 仅仅是添加了raw.github…

JS数组解构赋值变量存在依赖关系

题目随便起的&#xff0c; 在刷力扣 41.缺失的第一个正数 这个题的时候&#xff0c;出现了解构赋值的问题&#xff0c; 对于[a,b] [1,2]和[b,a][2,1]按理说都是行的通的&#xff0c;和位置没有关系&#xff0c;本质上都是进行交换 可是当我在题目中 使用[nums[nums[i]-1], nu…

SpringMVC的高频面试题

2023最新版&#xff08;持续更新&#xff09; 一、SpringMVC的高频面试题1. SpringMVC的执行流程2. SpringMVC常见的注解有哪些&#xff1f; 一、SpringMVC的高频面试题 1. SpringMVC的执行流程 前置知识 视图阶段&#xff08;JSP&#xff09;: 涉及到的重要组件&#xff1a;…

KubeSphere 社区双周报 | KubeSphere 多项更新 | 2023.06.23-07.06

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.06.23-2023.…