思路如下:
- 使用hash存储用户上次看过的时间,使用sortedset存储每个模块的每个信息产生的时间
Map<String, String> dataMap = new HashMap<>();
Jedis jedis=null;
String uid="1";//用户id
//分类数组
String []cagoryArray={"c1","c2"};
try {
//连接池获取连接 jedis=
//此处获取用户的操作时间集合
Map<String, String> map = jedis.hgetAll("u-key-"+uid);
if (map == null) {
map = new HashMap<>();
}
for (String value : cagoryArray) {
//获取某个分类下的上次操作时间
String s = map.get(value);
if (StringUtils.isBlank(s)) {
//如果不存在,则设为有新信息
dataMap.put(value, "1");
} else {
//计算从上次操作时间到现在的新的信息数量
Long zcount = jedis.zcount("c-key-"+value, Double.parseDouble(s), System.currentTimeMillis());
if (zcount == null || zcount <= 0) {
//不存在或者小于等于0 则没有新的信息
dataMap.put(value, "0");
} else {
dataMap.put(value, "1");
}
}
}
}finally {
if(jedis!=null){
//归还连接
}
}
- 当有新的信息产生,向相关模块添加时间:
Jedis jedis=null;
//c1模块有新的信息
String cid="c1";
try {
//连接池获取连接 jedis=
//添加到sortedset结果 权重为时间毫秒
long currentTimeMillis = System.currentTimeMillis();
jedis.zadd("c-key-"+cid, currentTimeMillis, String.valueOf(currentTimeMillis));
}finally {
if(jedis!=null){
//归还连接
}
}
- 当用户点击某个模块时,更新用户查看该模块的上次时间
Jedis jedis=null;
//c1模块有新的信息
String cid="c1";
//用户id
String uid="1";
try {
//连接池获取连接 jedis=
//添加到sortedset结果 权重为时间毫秒
jedis.hset("u-key-"+uid, cid, String.valueOf(System.currentTimeMillis()));
}finally {
if(jedis!=null){
//归还连接
}
}
这样就能实现消息的已读未读功能,消息的未读红点提醒功能只需要简单修改就可以