当前位置: 首页 > 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.dtcms.com/a/315989.html

相关文章:

  • 使用vscode编写markdown文档(使用Markdown Preview Enhanced和markdownlint两个插件)以及若干配置
  • Patsy的dmatrix() 函数
  • Docker概述
  • MySQL主从复制部署
  • leetcode700:二叉搜索树中的搜索(递归与迭代双解法)
  • 高可用微服务架构实战:Nacos集群+Nginx负载均衡,Spring Cloud无缝对接
  • qt窗口--01
  • 2025金九银十Java后端面试攻略
  • MoonBit 月兔 - 云和边缘计算 AI云原生编程语言及开发平台
  • 【51单片机 用定时器计时,按键控制LED灯亮(按键按下多少秒,亮几个LED灯,按键松开,LED保持)】2022-10-18
  • Linux驱动24 --- RkMedia 视频 API 使用
  • 基于 Spring Boot 的小区人脸识别与出入记录管理系统实现
  • Bean 标签有哪些属性
  • CPU内存管理:MMU SMMU
  • 【arXiv2025】计算机视觉|即插即用|LWGA:即插即用!LWGA模块,视觉性能炸裂!
  • 深圳AI大会前瞻:千企集结,“模驱具身”加速AI硬件革命
  • PAT 1039 Course List for Student
  • 注意点:Git 从安装到分支协作、冲突解决的完整步骤 ---待修改,没看这个步骤,需要重新整理步骤
  • Orange的运维学习日记--28.Linux逻辑卷详解
  • MATLAB实现的基于压缩感知的图像处理
  • 分布式选举算法:Bully、Raft、ZAB
  • Spring Boot与Redis连接池配置终极指南:从版本差异到生产实践
  • 【Mysql】业务视角下,SQL字段处理专题
  • VR眼动追踪技术帮助医生更快速确认大脑神经损伤与疾病
  • MySQL索引底层原理与性能优化实践
  • JavaScript性能优化实战:从核心指标分析
  • “命令行过长“?一键解决 IntelliJ IDEA 中 Java/Spring Boot 启动失败问题
  • 武汉火影数字:VR大空间在文旅产业的创新应用
  • 7、Redis队列Stream和单线程及多线程模型
  • 二手房翻新时怎样装修省钱?