Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Redis实现信息已读未读状态提示

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

原创
作者头像
MonroeCode
发布于 2018-01-10 04:02:55
发布于 2018-01-10 04:02:55
2.5K00
代码可运行
举报
文章被收录于专栏:Java技术分享Java技术分享
运行总次数:0
代码可运行

前提:

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

思路如下:

使用hash存储用户上次看过的时间,使用sortedset存储每个模块的每个信息产生的时间

上代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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){
        //归还连接
    }
}

当有新的信息产生,向相关模块添加时间:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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){
        //归还连接
    }
}

当用户点击某个模块时,更新用户查看该模块的上次时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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){
        //归还连接
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
「分布式」实现分布式锁的正确姿势
最近看到好多博主都在推分布式锁,实现方式很多,基于db、redis、zookeeper。zookeeper方式实现起来比较繁琐,这里我们就谈谈基于redis实现分布式锁的正确实现方式。
一个程序员的成长
2020/11/25
8660
「分布式」实现分布式锁的正确姿势
Redis-KV数据库Java连接以及Jedis包的使用
描述:Redis是一个开源的Key-Value数据缓存,和Memcached类似。现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。
全栈工程师修炼指南
2020/10/23
1.3K0
Redis-KV数据库Java连接以及Jedis包的使用
Redis分布式锁解决方案
我们知道分布式锁的特性是排他、避免死锁、高可用。分布式锁的实现可以通过数据库的乐观锁(通过版本号)或者悲观锁(通过for update)、Redis的setnx()命令、Zookeeper(在某个持久节点添加临时有序节点,判断当前节点是否是序列中最小的节点,如果不是则监听比当前节点还要小的节点。如果是,获取锁成功。当被监听的节点释放了锁(也就是被删除),会通知当前节点。然后当前节点再尝试获取锁,如此反复)
用户2032165
2018/09/03
8410
Redis分布式锁解决方案
Redis的批量操作是什么?怎么实现的延时队列?以及订阅模式、LRU。
这次的内容是我自己为了总结Redis知识而扩充的,上一篇其实已经总结了几点知识了,但是Redis的强大,以及适用范围之广可不是单单一篇博文就能总结清的。所以这次准备继续总结,因为第一个问题,Redis的批量操作,是我在面试过程中被真实问到的,当时没答上来,也是因为确实没了解过Redis的批量操作。
纪莫
2021/01/05
4670
Redis的批量操作是什么?怎么实现的延时队列?以及订阅模式、LRU。
Redis分布式锁的正确实现方式(Java版)
https://wudashan.cn/2017/10/23/Redis-Distributed-Lock-Implement/
全栈程序员站长
2022/09/05
1.4K0
Redis Pipeline管道命令使用
上过程称为Round Trip Time(RTT,往返时间),mget和mset命令节约了RTT,但是大部分指令不支持批量操作。
黑洞代码
2021/01/14
1.5K0
Redis Pipeline管道命令使用
Redis基本数据结构类型及方法
Redis基本数据结构类型 string hash list set zset Demo代码 import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.ListPosition; import java.util.HashMap; import java.util.Map; impo
itze
2022/10/31
3080
Jedis是如何支持Cluster的
前面说了 Jedis(2.9.0) 如何支持 Redis Sentinel 的,今天看看 Jedis 是如何支持 Redis Cluster 的。
Bug开发工程师
2018/12/27
2K0
Jedis是如何支持Cluster的
java架构之路-(Redis专题)SpringBoot连接Redis超简单
  上次我们搭建了Redis的主从架构,哨兵架构以及我们的集群架构,但是我们一直还未投入到实战中去,这次我们用jedis和springboot两种方式来操作一下我们的redis
小菜的不能再菜
2019/10/25
1.3K0
java架构之路-(Redis专题)SpringBoot连接Redis超简单
RedisPool操作Redis,工具类实例
redis.properties 配置文件内容 redis.pool.maxActive=100 redis.pool.maxIdle=20 redis.pool.maxWait=3000 redis.pool.testOnBorrow=false redis.pool.testOnReturn=false redis.ip=127.0.0.1 redis.port=6379 redis.port1=6380 redis.password=**** package com.szreach.rcrp
生活创客
2018/01/30
1.9K0
缓存数据库Redis
Redis基本概念和NOSQL 1. 概念: redis是一款高性能的NOSQL系列的非关系型数据库 1.1.什么是NOSQL NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。 随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点
不愿意做鱼的小鲸鱼
2022/09/24
2.7K0
缓存数据库Redis
Redis的Java客户端 Jedis
Jedis: 一款java操作redis数据库的工具. 使用步骤: 1. 下载jedis的jar包 2. 使用
暴躁的程序猿
2022/03/24
8070
Redis的Java客户端 Jedis
Redis 入门篇
Redis诞生于2009年全称是Remote Dictionary Server 远程词典服务器,是一个基于内存的键值型NoSQL数据库。
捞月亮的小北
2023/12/01
2110
Redis 入门篇
使用Redis实现延时任务(二)
前一篇文章通过Redis的有序集合Sorted Set和调度框架Quartz实例一版简单的延时任务,但是有两个相对重要的问题没有解决:
Throwable
2020/06/23
1.1K0
使用Redis实现延时任务(二)
你的Redis有类转换异常么
•该异常不是必现的,偶尔才会出现;•出现该异常后重启应用或者过一会就好了;•序列化协议使用了hessian。
luoxn28
2019/11/06
8250
快速学习Redis-Jedis客户端
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/12/11
4080
Redis部分数据结构方法小结
Redis在工程开发中还是比较常用的Nosql内存数据库,简单巩固一下它的各种数据类型与用法~
用户3003813
2018/09/06
5870
Redis部分数据结构方法小结
基于Spring boot和Mybatis外卖项目瑞吉外卖Day9-Redis的快速入门
Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样:
小小程序员
2023/04/12
4320
基于Spring boot和Mybatis外卖项目瑞吉外卖Day9-Redis的快速入门
Flink用户画像用户画像行为特征
我们要使用的几个组件为Hadoop 2.6,HBase 1.0.0,MySQL 8,zookeeper 3.4.5,kafka 2.1.0,Flink 1.13,Canal 1.1.5。为了方便,这里都使用伪集群和单机安装。
算法之名
2021/11/10
9K0
Jedis连接池1. 什么是连接池2. Jedis的连接池3. 源码解析4. 总结
项目实例代码已上传github https://github.com/Wasabi1234/mmall 1. 什么是连接池 一般在程序中如果要和其他的系统创建连接进行交互并且连接的创建代价比较"昂贵
JavaEdge
2018/05/16
1K0
相关推荐
「分布式」实现分布式锁的正确姿势
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验