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

这篇具有很好参考价值的文章主要介绍了springboot+redis+mysql+quartz-通过Java操作jedis使用pipeline获取缓存数据定时更新数据库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、重点

代码讲解: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

架构图:

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

最开始的代码版本:

(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博客文章来源地址https://www.toymoban.com/news/detail-559616.html

到了这里,关于springboot+redis+mysql+quartz-通过Java操作jedis使用pipeline获取缓存数据定时更新数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot+redis+mysql+quartz-使用pipeline+lua技术将缓存数据定时更新到数据库

    代码讲解:7.3点赞功能-定时持久化到数据库-Java程序整合pipeline+lua_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1Lg4y1w7U9 代码: blogLike_schedule/like08 · xin麒/XinQiUtilsOrDemo - 码云 - 开源中国 (gitee.com) https://gitee.com/flowers-bloom-is-the-sea/XinQiUtilsOrDemo/tree/master/blogLike_schedule/like08 数据库表:

    2024年02月13日
    浏览(28)
  • java操作redis之jedis

    我们之前对Redis的学习都是在命令行窗口,那么如何使用Java来对Redis进行操作呢?对于Java连接Redis的开发工具有很多,这里先介绍通过Jedis实现对Redis的各种操作。(前提是你的redis已经配置了远程访问) 到这里Jedis如何连接redis以及常用操作已经了解了,其实这里的操作方法和

    2024年02月09日
    浏览(21)
  • SpringBoot Redis 使用Lettuce和Jedis配置哨兵模式

    在Spring Boot 中配置Redis哨兵模式,可以使用 Lettuce 或 Jedis 配置 Redis 哨兵模式,实现高可用的 Redis 集群。 因为在Spring Boot中 spring-boot-starter-data-redis 已经实现了两种客户端链接方式,我们选择其中一种就可以。 Lettuce 和 Jedis 都是 Redis 客户端库,可以与 Redis 服务器进行通信。它

    2024年02月16日
    浏览(25)
  • 【Springboot系列】整合redis+jedis(含源码)

    Spring Boot集成Redis和Jedis客户端使用Redis有以下主要特点: ​ 👉简单易用只需要添加相关依赖和简单配置,就可以直接在Spring Boot应用中使用Jedis客户端操作Redis。这大大简化了使用Redis的难度。 ​ 👉自动配置Spring Boot会根据类路径中的Jedis版本自动配置JedisConnectionFactory。我们只

    2024年02月12日
    浏览(30)
  • Redis-redis事务、乐观锁、Jedis、SpringBoot整合Redis

    1、事务 ①开启事务、执行事务 ② 取消事务 ③ 编译性异常(代码有问题! 命令有错!),事务中所有的命令都不会被执行! ④ 运行时异常(I/O),如果事务队列中存在语法行,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常! (区别于直接命令错误

    2024年01月16日
    浏览(34)
  • 在Spring Boot微服务集成Jedis操作Redis

    记录 :406 场景 :在Spring Boot微服务集成Jedis操作Redis的缓存和队列。 版本 :JDK 1.8,Spring Boot 2.6.3,redis-6.2.5,jedis-3.7.1。 1.微服务中配置 Redis信息 1.1在application.yml中Jedis配置信息 1.2使用 ConfigurationProperties加载Jedis配置 Spring Boot微服务在启动时,自动注解机制会读取application.yml的

    2023年04月15日
    浏览(37)
  • Redis的Java客户端-Jedis

    在 Redis官网 中提供了各种语言的客户端,地址: https://redis.io/docs/clients/ 其中Java客户端也包含很多: 标记为 ❤ 的就是推荐使用的java客户端,包括: Jedis和Lettuce:这两个主要是提供了Redis命令对应的API,方便我们操作Redis,而SpringDataRedis是对这两种做了抽象和封装。 Redisso

    2024年02月19日
    浏览(30)
  • Redis-Java客户端-Jedis

    目录 01.导入依赖 02.进行测试连接 03.使用JedisPool 04.修改测试的代码         新建一个mevan工程,在pom文件下导入相应的依赖,相依的依赖可以去官网查找 spring官网:Spring Data Redis         在test目录下,创建一个测试类JedisTest 这里可能回报密码的错误, 可能需要去设置

    2024年02月14日
    浏览(26)
  • 【Redis】2、Redis 的 Java 客户端(Jedis 和 SpringDataRedis)

    Jedis 的使用:https://redis.io/docs/clients/java/ 🌼 Jedis 实例是线程不安全的 🌼 多线程环境 下需要基于连接池来使用 🌼 这里使用的连接池技术是 Jedis 提供的 🍀 JedisPool :Redis 连接池 🍀 JedisPoolConfig :Redis 连接池的配置 🍃 SpringData 是 Spring 中数据操作的模块,包含对各种数据库

    2024年02月11日
    浏览(25)
  • Redis 的整合 Jedis 使用

    大家好 , 我是苏麟 , 今天带来 Jedis 的使用 .  Jedis的官网地址: GitHub - redis/jedis: Redis Java client 引入依赖 实战  Jedis连接池 Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式 有关池化思想,并不仅仅是这

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包