Java 8 和 MyBatis 框架实现每天凌晨 2 点进行增量缓存

以下是使用 Java 8 和 MyBatis 框架实现每天凌晨 2 点进行增量缓存的完整示例代码:

Offering 实体类:
public class Offering {
    private String id;
    private String name;
    private String size;
    private String type;

    // 构造方法、getter 和 setter
}
OfferingMapper 接口:
import java.util.List;

public interface OfferingMapper {
    List<Offering> getAllOfferings();
    List<Offering> getIncrementalOfferings();
}
OfferingMapper.xml(MyBatis 的 XML 配置文件):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="your.package.OfferingMapper">

    <select id="getAllOfferings" resultType="Offering">
        SELECT id, name, size, type FROM offering
    </select>

    <select id="getIncrementalOfferings" resultType="Offering">
        SELECT id, name, size, type FROM offering WHERE last_update_date > CURDATE()
    </select>

</mapper>
OfferingCache 类(实现缓存和定时任务):
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import redis.clients.jedis.Jedis;

public class OfferingCache {

    public static void main(String[] args) {
        try {
            // 加载 MyBatis 配置文件
            String resource = "mybatis-config.xml";
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(OfferingCache.class.getClassLoader().getResourceAsStream(resource));

            // 连接 Redis
            Jedis jedis = new Jedis("localhost");

            // 第一次全量缓存
            SqlSession session = sqlSessionFactory.openSession();
            OfferingMapper offeringMapper = session.getMapper(OfferingMapper.class);
            List<Offering> allOfferings = offeringMapper.getAllOfferings();
            Map<String, String> dataToCache = new HashMap<>();
            for (Offering offering : allOfferings) {
                String value = offering.getName() + "," + offering.getSize() + "," + offering.getType();
                dataToCache.put(offering.getId(), value);
            }
            for (Map.Entry<String, String> entry : dataToCache.entrySet()) {
                jedis.hset("offering_key", entry.getKey(), entry.getValue());
            }
            session.close();

            // 设置定时任务每天凌晨 2 点执行增量缓存
            ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
            scheduler.scheduleAtFixedRate(() -> {
                try {
                    session = sqlSessionFactory.openSession();
                    offeringMapper = session.getMapper(OfferingMapper.class);
                    List<Offering> incrementalOfferings = offeringMapper.getIncrementalOfferings();
                    Map<String, String> incrementalData = new HashMap<>();
                    for (Offering offering : incrementalOfferings) {
                        String value = offering.getName() + "," + offering.getSize() + "," + offering.getType();
                        incrementalData.put(offering.getId(), value);
                    }
                    for (Map.Entry<String, String> entry : incrementalData.entrySet()) {
                        jedis.hset("offering_key", entry.getKey(), entry.getValue());
                        System.out.println("增量数据 ID: " + entry.getKey());
                    }
                    session.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }, 0, 24, TimeUnit.HOURS);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
注意事项:

1. 上述代码中的数据库连接信息、Redis 连接信息以及 MyBatis 配置文件路径需要根据实际情况进行修改。

2. 确保在项目中正确配置了 MyBatis 和 Jedis 的依赖。

猜你喜欢

转载自blog.csdn.net/hongyuxiongji/article/details/142415082
今日推荐