当前位置: 首页 > news >正文

Java+Redis+SpringBoot定时器-定时发布商品

样例代码,业务代码:

@Component
@Configuration //读取配置
@Slf4j
@EnableScheduling 
public class ProductTimingOnSaleTask {@Autowiredprivate StoreProductService storeProductService;@Autowiredprivate RedisUtil redisUtil;@Scheduled(fixedDelay = 1000 * 60L) //1分钟同步一次数据public void init(){log.info("---ProductTimingOnSale task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDateTime());try {String redisKey = Constants.RedisKey.PRODUCT_TIMING_ON_SALE;// 获取这个key对应的list长度Long size = redisUtil.getListSize(redisKey);if (size < 1) {return;}for (int i = 0; i < size; i++) {// 每10秒从队列头部拿数据数据为商品id 如果10秒钟拿不到一个数据,那么退出循环Object data = redisUtil.getRightPop(redisKey, 10L);if (null == data) {continue;}try {StoreProduct storeProduct = storeProductService.getById((Integer) data);// 如果商品上架状态是 定时上架 && 上架时间早于当前时间if (ProductConstants.IsShow.TIMING == storeProduct.getIsShow() && storeProduct.getPutOnShellTime().before(new Date())) {// 设置上架参数,保存到数据库storeProduct.setIsShow(ProductConstants.IsShow.ON_SALE);storeProduct.setPutOnShellTime(new Date());storeProduct.setIsWarehouse(false);storeProductService.updateById(storeProduct);}} catch (Exception e) {// 异常则把商品id从左侧塞入队列,失败的优先重试redisUtil.lPush(redisKey, data);}}} catch (Exception e) {log.error("ProductTimingOnSale.task" + " | msg : " + e.getMessage());}}
}

这是处理数据的地方,我们往redis存放数据时:

// 如果是定时上架
if (storeProductRequest.getPutOnShellType() == ProductConstants.PutOnShellType.TIMING) {// 定时上架存在一种审核时间大于上架时间,那么还是立即上架if (storeProduct.getPutOnShellTime().before(new Date())) {storeProduct.setIsWarehouse(false);storeProduct.setIsShow(ProductConstants.IsShow.ON_SALE);storeProduct.setPutOnShellTime(new Date());} else {storeProduct.setIsWarehouse(false);// 设置上架状态为定时上架,并且给redis推值(从左侧推 右侧推都行)storeProduct.setIsShow(ProductConstants.IsShow.TIMING);redisUtil.lPush(Constants.RedisKey.PRODUCT_TIMING_ON_SALE, storeProduct.getId());}}

----------------------------------------------------------------------------------------------------------------------------

其中redis的key

public class Constants {   public interface RedisKey {/** 商品定时上架 */String PRODUCT_TIMING_ON_SALE = "product_timing_on_sale";}
}

RedisUtils:

import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;/*** +----------------------------------------------------------------------* +----------------------------------------------------------------------* redis工具类*/@Component
public class RedisUtil {@Resourceprivate RedisTemplate<String, Object> redisTemplate;//    private static RedisTemplate<String, Object> redisTemplate = SpringUtil.getBean("redisTemplate", RedisTemplate.class);// =============== common ==========================/*** 指定缓存失效时间* @param key 键* @param time 时间(秒)* @return boolean*/public boolean expire(String key, long time) {try {if (time > 0) {redisTemplate.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 根据key 获取过期时间* @param key 键 不能为null* @return 时间(秒) 返回0代表为永久有效 失效时间为负数,说明该主键未设置失效时间(失效时间默认为-1)*/public long getExpire(String key) {return redisTemplate.getExpire(key, TimeUnit.SECONDS);}/*** 判断key是否存在* @param key 键* @return true 存在 false 不存在*/public boolean exists(String key){try {return redisTemplate.hasKey(key);} catch (Exception e) {e.printStackTrace();return false;}}/*** 删除对应的value* @param key string key*/public void delete(String key) {if (exists(key)) {redisTemplate.delete(key);}}// =============== string ==========================/*** 写入缓存* @param key string key* @param value string value*/public boolean set(String key, Object value) {try {redisTemplate.opsForValue().set(key, value);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 写入缓存带有效期(默认时间单位:秒)* @param key string key* @param value string value* @param expireTime Long 过期时间* @return boolean*/public boolean set(String key, Object value, Long expireTime) {try {if (expireTime > 0) {redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);} else {set(key, value);}return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 写入缓存带有效期* @param key string key* @param value string value* @param expireTime Long 过期时间* @param timeUnit TimeUnit 时间格式* @return boolean*/public boolean set(String key, Object value, Long expireTime, TimeUnit timeUnit) {try {redisTemplate.opsForValue().set(key, value, expireTime, timeUnit);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 读取缓存* @param key string key* @return T*/@SuppressWarnings("unchecked")public <T> T get(String key) {return (T) redisTemplate.opsForValue().get(key);}/*** 哈希添加* @param key string key* @param hashKey Object hashKey* @param value Object value*/public void hmSet(String key, Object hashKey, Object value) {redisTemplate.opsForHash().put(key, hashKey, value);}/*** 哈希删除* @param key string key* @param hashKey Object hashKey*/public void hmDelete(String key, Object hashKey) {redisTemplate.opsForHash().delete(key, hashKey);}/*** 哈希获取数据* @param key string key* @param hashKey Object hashKey*/public Object hmGet(String key, Object hashKey) {return redisTemplate.opsForHash().get(key, hashKey);}/*** 哈希数量* @param key string key*/public Long getHashSize(String key) {return redisTemplate.opsForHash().size(key);}/*** 列表添加左边添加* @param k string key* @param v Object v* @author Mr.Zhang* @since 2020-04-13*/public void lPush(String k, Object v) {ListOperations<String, Object> list = redisTemplate.opsForList();list.leftPush(k, v);}public void lRemove(String k, Object v) {ListOperations<String, Object> list = redisTemplate.opsForList();list.remove(k, 0, v);}/*** 从右边拿出来一个* @param k string key* @param t Long 超时秒数*/public Object getRightPop(String k, Long t){return redisTemplate.opsForList().rightPop(k, t, TimeUnit.SECONDS);}/*** 列表获取数量* @param k string key* @return Long*/public Long getListSize(String k) {return redisTemplate.opsForList().size(k);}/*** 列表获取* @param k string key* @param l long l* @param l1 long l1* @return List<Object>*/public List<Object> lRange(String k, long l, long l1) {ListOperations<String, Object> list = redisTemplate.opsForList();return list.range(k, l, l1);}/*** 集合添加* @param key string key* @param value Object value*/public void add(String key, Object value) {SetOperations<String, Object> set = redisTemplate.opsForSet();set.add(key, value);}/*** 集合获取* @param key string key* @return Set<Object>*/public Set<Object> setMembers(String key) {SetOperations<String, Object> set = redisTemplate.opsForSet();return set.members(key);}/*** 有序集合添加    排行榜使用* @param key string key* @param value Object value* @param score double scoure*/public void zAdd(String key, Object value, double score) {ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();zset.add(key, value, score);}/*** 有序集合获取    排行榜使用* @param key string key* @param score double scoure* @return Set<Object>*/public Set<Object> rangeByScore(String key, double score, double score1) {ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();return zset.rangeByScore(key, score, score1);}/*** 递增* @param key 键* @return long*/public long incrAndCreate(String key){if (!exists(key)) {set(key, 1);return 1;}return incr(key, 1L);}/*** 递增* @param key 键* @param delta 要增加几(大于0)* @return long*/public long incr(String key, long delta){if (delta < 0) {throw new RuntimeException("递增因子必须大于0");}return redisTemplate.opsForValue().increment(key, delta);}}

http://www.lryc.cn/news/610667.html

相关文章:

  • UNet改进(30):SageAttention在UNet中的4-Bit量化实现详解
  • 多参数状态监测集成终端设备怎么选
  • 日常反思总结2025.8.5
  • 2025金九银十Java后端面试攻略
  • 关于为什么ctrl c退不出来SecureCRT命令行的原因及其解决方法:
  • 变频器实习DAY21 区分BU和SUB 区分BJT和MOS 体二极管
  • SAP-ABAP:SAP接口全生命周期核心规范-开发运维注意事项
  • 第十七天:原码、反码、补码与位运算
  • 【Unity笔记】Unity TextMeshPro 字体显示为方块的终极解决方案(含中文、特殊字符支持)
  • GitLab:一站式 DevOps 平台的全方位解析
  • GitHub 趋势日报 (2025年08月04日)
  • 【motion】HumanML3D 的安装2:psbody-mesh安装成功
  • centos7 个人网站搭建之gitlab私有化部署实现线上发布
  • 基于铁头山羊STM32的平衡车电机转速开环闭环matlab仿真
  • IDEA JAVA工程入门
  • 8.5 CSS3-flex弹性盒子
  • Datart:开源数据可视化的新星,赋能企业数据分析
  • Android 之 Kotlin中的kapt
  • FPGA学习笔记——简易的DDS信号发生器
  • pyspark中的kafka的读和写案例操作
  • RocketMq如何保证消息的顺序性
  • 基于deepSeek的流式数据自动化规则清洗案例【数据治理领域AI带来的改变】
  • SpringBoot3.x入门到精通系列:4.2 整合 Kafka 详解
  • NLP——BERT模型全面解析:从基础架构到优化演进
  • 家常菜点餐|基于java和小程序的家庭大厨家常菜点餐系统设计与实现(源码+数据库+文档)
  • 一次“无告警”的服务器宕机分析:从无迹可寻到精准定位
  • 一文掌握Bard机器翻译,以及用python调用的4种方式(现已升级为 Gemini)
  • vue3通过按钮实现横向滚动或鼠标滚动横坐标滚动
  • 用 Python 构建高质量的中文 Wikipedia 语料库:从原始 XML 到干净段落
  • 【taro react】 ---- useModel 数据双向绑定 hook 实现