zoukankan      html  css  js  c++  java
  • Redis sortedset实现元素自动过期

    这里的自动过期,Redis并没有提供相应的api,但是可以使用一下方法来实现。

    需求背景

    给用户返回的文章要求七日内不能重复;文章是存放在java list里边;(这一块就是从db将文章拿出来,然后放入list,放入java内存中)。

    分析

    一开始我的做法是这样:

    当用户第一次访问的时候,创建一个key值为userId的缓存,value为title列表(文章标题,文章唯一标识),然后给这个key值设置过期时间。 
    但是这样,到过期时,整个列表都会被清掉。原则上,只应该清除掉到达过期时间的元素,未过期的元素则应该保持。这种方法不能实现预期效果。

    可实现方案:

    使用redis有序集合==sorted Set== 以及对应的==ZREMRANGEBYLEX key min max==命令
    移除有序集合中给定的字典区间的所有成员;

    redis提供了响应的数据结构和api可以实现:
    
    ZADD key score1 member1 [score2 member2]  
    向有序集合添加一个或多个成员,或者更新已存在成员的分数
    
    通过使用 ZREMRANGEBYSCORE key min max 命令删除有序集合保存在key的最小值和最大值(含)之间的分数的所有元素。 
    
    通过定时去调用此命令,即可实现list元素自动过期;

    对应相应的实现方案: 
    使用redis来存储给每个用户下发的文章,对应的key值为userId(用户唯一标识),value为title列表加上相关联的score。

     
    zadd userId score title 这里的score为当前时间的时间戳; 
    
    ZREMRANGEBYSCORE key 0 score  
    这里的score设为当前时间前7天对应的时间的时间戳;(具体时间戳可以用java Calander类计算得到)
    
    这里可以启动一个定时任务去定时调用这个命令即可
  • 相关阅读:
    不爽
    HOLD ON
    Netnet
    Plan
    TFS 2010 中使用 签入注释 策略
    GO 语言编程 windows 环境搭建
    日期选择器
    DEDE CMS 验证码不显示的问题
    win8 无法打开任务管理器
    对页面元素中事件进行提取,保持 ,使用完成后再进行事件绑定
  • 原文地址:https://www.cnblogs.com/barrywxx/p/8476350.html
Copyright © 2011-2022 走看看