springboot+redis+mysql+quartz-通过Java操作redis的KEYS*命令获取缓存数据定时更新数据库

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

代码讲解:

3-点赞功能-定时持久化到数据库(pipeline+lua)-完善过程2_哔哩哔哩_bilibili

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

本文章代码:

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

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

数据表库在:

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

一、目标:

缓存数据存储着键名以BLOG_LIKED_KEY开头的zset数据,

zset数据的键类似于BLOG_LIKED_KEYid,里面的id是数据库里博客的id。

zset的value是点赞的用户id,已经是userId

zset的score是该点赞用户点赞的时间戳。

目标:通过定时任务将所有博客的点赞信息全部更新到数据库里。

数据库有一张名为blog_like的博客数据表:

有一个like_list字段,这个字段要存储的就是缓存返回来的该篇博客的所有点赞信息。

like_number是通过该篇博客点赞用户数量计算得来。

具体是通过com.xinqi.service.impl.BlogServiceImpldurableToDatabaseByBlogIdAndMap的方法:

    private void durableToDatabaseByBlogIdAndMap(Map<String,String> userIdWithTime,Long id){
        //什么都没有那肯定不操作
        if (userIdWithTime == null || userIdWithTime.size() == 0) return;

        String stringIds = userIdWithTime.toString();

        String updateSql =  "like_list = " + "'" + stringIds + "' ," +
                "like_number = " + userIdWithTime.size();
        boolean isSuccess = update()
                .setSql(updateSql)
                .eq("id", id)
                .update();
    }

二、实现过程:

1、重要依赖:

<!--1.先引入依赖-->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>

2、写好要执行的内容,定时任务要执行的内容在executeInternal方法里:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xinqi.entity.Blog;
import com.xinqi.service.BlogService;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.quartz.QuartzJobBean;

import java.util.Set;
@Slf4j//2、创建一个任务类
public class LikeTask extends QuartzJobBean {
    @Autowired
    BlogService blogService;

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    /**
     * 用来从redis中的hash中获取点赞缓存的键值对,间隔时间存入mysql
     * @param context
     * @throws JobExecutionException
     */
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
       // 要执行的内容就写在这个函数中
        blogService.updateAllLikeListToDatabase();
    }

}

3、写好定时任务的配置类,两个bean都要在withIdentity里面传入参数:

import com.xinqi.task.LikeTask;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration//3、QuartzConfig{quartzDetail_1、quartzTrigger_1}
public class QuartzConfig {
    @Bean
    public JobDetail quartzDetail_1(){
        // withIdentity指定的是这个job的id
        return JobBuilder.newJob(LikeTask.class)
                .withIdentity("LIKE_TASK_IDENTITY")
                .storeDurably()
                .build();
    }


    @Bean
    public Trigger quartzTrigger_1(){ //触发器
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(40)  //设置时间周期单位秒,是执行executeInternal方法的频率
//                .withIntervalInHours(2)  //两个小时执行一次
                .repeatForever();
        return TriggerBuilder.newTrigger().forJob(quartzDetail_1())
//                .forJob(quartzDetail_2())
                .withIdentity("LikeTask_TRENDS_TRIGGER")
                .withSchedule(scheduleBuilder)
                .build();
    }


}

以上定时任务已经配置好了。

4、接下来就是要去实现LikeTask.executeInternal里面的blogService这个类的blogService.updateAllLikeListToDatabase()方法:

//这里就执行缓存的所有博客的likeList入数据库吧
@Override
public void updateAllLikeListToDatabase(){
    String prefix = "BLOG_LIKED_KEY";
    Set<String> keys = stringRedisTemplate.keys(prefix.concat("*"));
    for (String key : keys) {
        Map<String, String> map = queryAllBlogLikesUserIdWithScoresByRedisKey(key);
        //get blogId
        Long blogId = Long.parseLong(key.substring(prefix.length(),key.length()));

        durableToDatabaseByBlogIdAndMap(map,blogId);
    }

}

ok了,就这样了,具体代码已在文章开头给出。

三、其他

对于以上,是有不足的,就是keys+前缀*扫描会导致redis会阻塞其他操作,还是缓存scan好一点,请看这篇:

其他类似的文章:

(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-552206.html

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

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

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

相关文章

  • Linux基础+命令操作+mysql、tomcat、nginx、RabbitMQ、Redis,ElasticSearch

    配置代理 linux组成:系统内核+系统级应用程序 内核功能:CPU调度,没存调度,文件调度,网络调度,IO调度 系统级应用程序:文件管理器,软件等 linux内核下载:https://www.kernel.org linux发行版:内核开源,可修改+系统级程序完整封装为linux发行版。 不同发行版基础操作命令都

    2024年02月11日
    浏览(32)
  • SpringBoot中操作Redis通过所有可能的key查询存在的key并解析为对象实体的通用方法

    SpringBoot中操作Redis的特殊操作-批量查询(通过key的集合批量查杜绝模糊搜索)、查询并解析对象list: SpringBoot中操作Redis的特殊操作-批量查询(通过key的集合批量查杜绝模糊搜索)、查询并解析对象list_霸道流氓气质的博客-CSDN博客 在上面讲操作redis中特殊操作时,对于通过key的集

    2023年04月09日
    浏览(28)
  • 【Redis】Spring/SpringBoot 操作 Redis Java客户端

    1.Jedis 2.Lettuce(主流) -Spring Data Redis 1.添加Redis 驱动依赖 2.设置Redis 连接信息 3.根据Redis API 操作Redis

    2024年02月13日
    浏览(33)
  • Spring Boot进阶(69):轻松实现定时任务持久化!SpringBoot集成quartz带你玩转定时任务删除、暂停、获取等操作!【附项目源码】

            现如今,随着市场竞争加剧,各个企业都在不断寻求提高效率、降低成本的方法,此时使用自动化工具已成为必不可少的选择。而在众多的自动化工具中,定时任务已经成为一项必备工具,而Quartz就是一个非常好用的定时任务框架,它的轻量级、高可靠性、易于使

    2024年02月09日
    浏览(38)
  • Java通过OpenSSH(ssh2/ScpClient)远程连接Windows10实现传输文件、解压缩包、执行命令等操作

    远程机器A:Windows 10 专业版 22H2 本地环境:jdk8 设置 -- 应用 -- 应用和功能 -- 可选功能 -- 添加功能 由于我已经安装,在以安装功能里面即可找到。未安装的用户选择添加功能添加即可 启动 OpenSSH SSH Server 服务 输入ssh 出现如下提示即安装成功 编写 bat 脚本,在远程机器上面静

    2024年02月14日
    浏览(66)
  • Redis - evicted_keys 解读

    今天碰到 Redis 内存被打挂了,于是 info 命令看下 Redis 的运行情况,当中发现 evicted_keys 指标,就好奇是啥意思,有啥作用?! evicted_keysinfo 是已被驱逐(删除)的键的数量 Redis 可以配置为根据需要自动清除密钥。如果这样配置,Redis 将仅使用最大数量的内存,并且如果接近

    2024年02月13日
    浏览(19)
  • java通过JDBC连接mysql8.0数据库,并对数据库中的表进行增删改查操作

    目录 一、JDBC简介 二、添加依赖 三、JDBC操作数据库的步骤 四、JDBC操作数据库——增删改查 (一)新增数据 (二)删除数据 (三)修改数据 (四)查询数据 (五)多表连接查询         Java数据库连接,(Java Database Connectivity,简称JDBC)是java语言中用来规范客户端程序如何来访问数

    2024年02月03日
    浏览(51)
  • 通过C#学习redis02(哈希操作)

    2024年02月12日
    浏览(24)
  • springboot高级教程基于 redis 通过注解实现限流

    Spring Boot整合Redis有一种方便的方式是使用注解方式实现限流。 可以通过自定义注解的方式来标注需要限流的方法,在方法执行前进行限流的检查。 以下是具体实现方式: 1. 自定义注解`@RedisLimit`,并定义注解元素,如限流的时间、限流的次数等。 2. 编写切面类`RedisLimitAspe

    2024年02月10日
    浏览(26)
  • python中redis进行模糊查询(keys()、scan()、scan_iter())

    python中使用redis进行模糊查询,可以使用scan()命令模糊匹配key。 keys命令 :简单粗暴,但是由于Redis是单线程,keys命令是以阻塞的方式执行的,keys是以遍历的方式实现的复杂度是 O(n),Redis库中的key越多,查找实现代价越大,产生的阻塞时间越长。 scan命令 : 以非阻塞的方式

    2024年02月07日
    浏览(20)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包