文档章节

Redis实现信息已读未读状态提示

清尘V
 清尘V
发布于 2016/04/14 21:04
字数 433
阅读 1888
收藏 50

前提:

假如现在有2个模块需要提示消息:只要存在用户在上个时间点之后没有看过的信息就提示用户有新的信息

思路如下:

使用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){
        //归还连接
    }
}


个人博客:http://www.whereta.com

© 著作权归作者所有

共有 人打赏支持
上一篇: HashMap源码理解
下一篇: Java SPI机制
清尘V
粉丝 41
博文 107
码字总数 47780
作品 0
青岛
程序员
私信 提问
java发送群体通知,部门消息提示实现

java发送群体通知,部门消息提示实现 java 现在发送群体消息,比如部门消息提示,未读状态,已读状态, 都有什么好的实现方式? 是否需要数据库存储? 发送的时候是不是需要循环所有的接收者...

wad12302
2018/01/20
494
2
我想了几天,我想知道在大量数据读写下怎么取出完整的用户未读消息

我在用netty做一个IM的东西,我对于大量数据的聊天消息我选择是用MQ做异步写入数据库,但是有个问题,我想实现未读已读功能,于是直接在消息表中加了个状态字段,表示未读已读,如果对方用户...

助哥的后花园
2018/01/30
805
2
C# DataGridView 对指定行文字加粗实现阅读标记

在使用DataGridView控件放置通知等信息时,会遇到标记“已读”、“未读”的问题。通过SQL语句查询出的结果中,“已读”、“未读”会被放在一个专门的字段(DataGridView的列)中用来标记这个...

北风其凉
2015/07/29
613
0
Node+Websocket之消息未读功能实战

前言 github.com/hua1995116/… 这个项目本来是我学生时代为了找工作的一个练手项目,但是没想到受到了很多的关注,star也快要破K了,这也激励着我不断去完善他,一方面是得对得起关注学习的...

蓝色的秋风
2018/11/19
0
0
用redis实现社交产品中计数器

用redis实现计数器 社交产品业务里有很多统计计数的功能,比如: 用户: 总点赞数,关注数,粉丝数 帖子: 点赞数,评论数,热度 消息: 已读,未读,红点消息数 话题: 阅读数,帖子数,收藏...

凯文加内特
2015/07/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
7
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
2
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
3
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部