系统弹出消息功能,且保证用户只能获取弹出一次消息

要实现系统弹出消息功能,且保证用户只能获取弹出一次消息,你可以借助 Redis 来达成。基本思路是:把消息存于 Redis 的列表中,同时用 Redis 的集合记录用户是否已接收过该消息。下面是一个示例工具类,其中包含推送消息和获取消息的方法:

package com.pantech.manager.sys.utils;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

@Component
public class RedisMessageTool {

    @Resource
    private RedisTemplate redisTemplate;

    // 推送消息给用户
    public void pushMessage(String userId, String message) {
        // 消息列表的键
        String messageListKey = "user_messages:" + userId;
        // 已读消息集合的键
        String readMessagesSetKey = "user_read_messages:" + userId;

        // 检查用户是否已经读过该消息
        if (!redisTemplate.opsForSet().isMember(readMessagesSetKey, message)) {
            // 如果未读,则将消息添加到消息列表中
            redisTemplate.opsForList().rightPush(messageListKey, message);
        }
    }

    // 获取用户的未读消息
    public String getMessage(String userId) {
        // 消息列表的键
        String messageListKey = "user_messages:" + userId;
        // 已读消息集合的键
        String readMessagesSetKey = "user_read_messages:" + userId;

        // 从消息列表中弹出一条消息
        String message = redisTemplate.opsForList().leftPop(messageListKey);
        if (message != null) {
            // 将消息添加到已读消息集合中
            redisTemplate.opsForSet().add(readMessagesSetKey, message);
        }
        return message;
    }

    // 获取用户的所有未读消息
    public List getAllMessages(String userId) {
        // 消息列表的键
        String messageListKey = "user_messages:" + userId;
        // 已读消息集合的键
        String readMessagesSetKey = "user_read_messages:" + userId;

        // 获取所有未读消息
        List messages = redisTemplate.opsForList().range(messageListKey, 0, -1);
        if (messages != null && !messages.isEmpty()) {
            // 将所有消息添加到已读消息集合中
            redisTemplate.opsForSet().add(readMessagesSetKey, messages.toArray(new String[0]));
            // 清空消息列表
            redisTemplate.delete(messageListKey);
        }
        return messages;
    }
}    

你可能感兴趣的:(java)