Redis做消息队列

Redis做消息队列

在一个程序中存储一个数据

java 复制代码
    /**
     * @description 文字转语音指令下发至队列
     * @author xuwz
     * @date 2023/12/26 19:46
     */
    @Override
    public void sendCmd1ByQueue(SlalarmCmdParam param, TextToSpeedCmd cmd) {
        BwtQueueCmd1 queueCmd = new BwtQueueCmd1();
        queueCmd.setParam(param);
        queueCmd.setCmd(cmd);
        JSONObject cmdJo = new JSONObject();
        cmdJo.put("cmdType", 1);
        cmdJo.put("cmdContent", queueCmd);
        redisUtil.strLeftPush(RedisKey.BWT_CMD_QUEUE, cmdJo, TimeUnit.HOURS.toMillis(1));
    }
java 复制代码
    /**
     * @description leftPush
     * @author xuwz
     * @date 2023/3/3 14:08
     */
    public boolean strLeftPush(final String key, final Object value, final long time) {

        try {
            stringRedisTemplate.opsForList().leftPush(encodeKey(key), MicrovideoJsonUtil.toJSONString(value));

            if (time > 0) {
                expire(key, time);
            }
            return true;
        } catch (final Exception e) {
            log.error(MicrovideoStringUtil.EMPTY, e);
            return false;
        }
    }

   /**
     * @description rightPop
     * @author xuwz
     * @date 2023/3/3 14:13
     */
    public String strRigthPop(final String key) {
        try {
            return stringRedisTemplate.opsForList().rightPop(encodeKey(key));
        } catch (Exception e) {
            log.error(MicrovideoStringUtil.EMPTY, e);
            return null;
        }
    }

redis方法使用描述


stringRedisTemplate.opsForList().leftPush 是 Spring Data Redis 提供的一个方法,用于在 Redis 列表的左侧(即列表的开始)插入一个元素。

在 Redis 中,列表(List)是一种有序集合,支持从两端插入或弹出元素。leftPush 方法将一个元素推送到列表的左边,即在列表的开头添加这个元素。如果列表不存在,Redis 会自动创建一个新的列表。

存储数据以后,通过定时任务来弹出存储的元素。

相关方法

rightPush: 将元素推送到列表的右侧(即列表的末尾)。

leftPop: 从列表的左侧弹出一个元素。

rightPop: 从列表的右侧弹出一个元素。

注意事项

如果列表的名称(例如 myList)已经存在,leftPush 会将新元素添加到现有列表的开头。

如果列表不存在,leftPush 会创建一个新的列表并将元素推送进去。

通过这些操作,你可以在 Redis 列表中高效地插入和删除元素,满足多种数据处理需求。

通过定时任务去弹出数据,并操作

java 复制代码
@Slf4j
@Component
public class BwtSlaCmdHandleTimer {

    @Resource
    private MicrovideoCommRedisRepository redisUtil;
    @Resource
    private ISlaStdCmdHandleService slaStdCmdHandleService;
    @Value("${BWTslalarmCmdUrl}")
    private String bwtSlalarmCmdUrl;

    @PostConstruct
    public void init() {
        try {
            InitC initC = new InitC();
            Thread thread = new Thread(initC);
            thread.start();
        } catch (Exception e) {
            log.error("", e);
        }
    }

    private class InitC implements Runnable {
        @Override
        public void run() {

            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                log.error("", e);
            }
            log.info("start bwtSlaCmdHandle timer task...");
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    cmdHandle();
                }
            }, 1000, 1000);
        }
    }

    private void cmdHandle() {
        try {
            String cmdStr = redisUtil.strRigthPop(RedisKey.BWT_CMD_QUEUE);
            if (StringUtils.isEmpty(cmdStr)) {
                return;
            }

            JSONObject cmdJo = JSONObject.parseObject(cmdStr);
            Integer cmdType = cmdJo.getInteger("cmdType");
            String cmdContent = cmdJo.getString("cmdContent");
            if (cmdType.equals(1)) {
                // 指令类型为文字转语音
                BwtQueueCmd1 queueCmd = JSONObject.parseObject(cmdContent, BwtQueueCmd1.class);
                slaStdCmdHandleService.sendTextToSpeedCmd(queueCmd.getParam(), queueCmd.getCmd());
            } else if (cmdType.equals(2)) {
                // 指令类型为设备停止
                BwtQueueCmd2 queueCmd = JSONObject.parseObject(cmdContent, BwtQueueCmd2.class);
                slaStdCmdHandleService.sendStopCmdByEqId(bwtSlalarmCmdUrl, queueCmd.getTaskId(),
                        queueCmd.getEventId(), queueCmd.getEqId());
            } else {
                log.warn("未知指令类型");
            }
        } catch (Exception e) {
            log.error("", e);
        }
    }
}

解释

timer.schedule(...): Timer 类的 schedule 方法用于安排一个任务(TimerTask)在指定的时间执行。

new TimerTask() { ... }: 创建一个匿名内部类,继承自 TimerTask,并重写了 run 方法。TimerTask 是一个抽象类,用于定义你要执行的任务。

@Override public void run() { cmdHandle(); }: 重写 TimerTask 类的 run 方法,这个方法包含了你希望在定时任务中执行的代码。这里的 cmdHandle() 是你定义的一个方法,会在每次任务执行时被调用。

1000 (首次延迟): 任务开始执行的初始延迟时间,单位是毫秒。在这里,1000 毫秒意味着任务会在 1 秒后开始第一次执行。

1000 (周期性间隔): 任务执行的周期间隔时间,单位是毫秒。在这里,1000 毫秒意味着任务会每隔 1 秒执行一次。

总结

这段代码的作用是安排一个定时任务 cmdHandle()。它会在 1 秒钟(1000 毫秒)后第一次执行,然后每隔 1 秒钟再次执行一次。具体的执行过程是:

在任务开始之前等待 1 秒钟(首次延迟)。

相关推荐
IT界的老黄牛6 小时前
Spring Boot 的 `/actuator/health` 不是免费的:健康检查打爆连接池的反面教材
spring boot·hikaricp·actuator·健康检查·线上排障·架构反模式
都叫我大帅哥8 小时前
Java JJWT 完全指南:从入门到生产级实践
java
前端开发张小七9 小时前
Java 学习笔记 · 第一课:基础语法与核心概念
java·后端
凡尘——雨落凡尘9 小时前
PHP 线上十大隐形故障复盘:90% 的网站卡顿、502、雪崩,都是这些细节导致的
redis·nginx·php·session
ThsPool10 小时前
【ENVI二次开发学习整理 04】ENVI功能扩展与二次开发
java·前端·javascript
赤壁小虾10 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
java·前端·数据库
青山木11 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode
Jul1en_11 小时前
【Claude Code Compact】源码级别的学习上下文压缩
java·前端·学习·github·ai编程
摇滚侠11 小时前
《SpringBoot 3:入门与应用实战》第 15 章 生产级特性 管理 Spring Boot 应用 阅读笔记
java·spring boot·笔记
XWalnut12 小时前
SpringBoot快速入门
java·spring boot·后端