要实现系统弹出消息功能,且保证用户只能获取弹出一次消息,你可以借助 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<String, String> 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<String> getAllMessages(String userId) {
// 消息列表的键
String messageListKey = "user_messages:" + userId;
// 已读消息集合的键
String readMessagesSetKey = "user_read_messages:" + userId;
// 获取所有未读消息
List<String> 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;
}
}