本文為大家分享了Redis實現信息已讀未讀狀態提示的關鍵代碼,希望可以給大家一些啟發,具體內容如下
前提:
假如現在有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){
- //歸還連接
- }
- }
以上就是本文的全部內容,希望對大家的學習有所幫助。