设置key凌晨过期的思路

  1. 设置key的值的时候,计算下当前时间到第二天凌晨的时间差,设置key的过期时间。
  2. 利用定时任务,每天凌晨将需要过期的key删除。

应用场景

  1. 按天为维度,限制用户对资源的访问次数。
  2. 按天为维度,生成递增序列号。

代码示例

    /**
* 按用户id和天为维度生成递增的单号
*
* @return
*/
  private String createNo(Integer userId) {
StringBuilder sb = new StringBuilder();
String dateStr = DateUtils.getDateForFormat(new Date(), "yyyyMMdd");
sb.append("P").append(dateStr).append(userId);
String keyPrefix = sb.toString();
long keySuffix = jedis.incr(keyPrefix);
if (keySuffix > Constant.NO_MAXVALUE_999) {
log.error("生成单号失败,序号大于999,userId:" + userId);
throw new RuntimeException("生成预约单号失败,序号大于999");
}
Long expiresTime = getSecondsNextEarlyMorning();
jedis.setExpire(keyPrefix, expiresTime.intValue());
String keySuffixStr = String.format("%03d", keySuffix);
return keyPrefix + keySuffixStr;
} /**
* 判断当前时间距离第二天凌晨的秒数
*
* @return 返回值单位为[s:秒]
*/
public Long getSecondsNextEarlyMorning() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, 1);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
}

redis的key设置每天凌晨过期的思路的更多相关文章

  1. redis利用key计时与计数

    计时 Setex 命令为指定的 key 设置值及其过期时间.如果 key 已经存在, SETEX 命令将会替换旧的值 基本命令: redis 127.0.0.1:6379> SETEX KEY_ ...

  2. redis中的key设置过期时间

    EXPIRE key seconds 为给定  key  设置生存时间,当  key  过期时(生存时间为  0  ),它会被自动删除. 在 Redis 中,带有生存时间的  key  被称为『易失的 ...

  3. redis文档翻译_key设置过期时间

    Available since 1.0.0.    使用開始版本号1.01 Time complexity: O(1)  时间复杂度O(1) 出处:http://blog.csdn.net/colum ...

  4. Redis有效时间设置及时间过期处理

    本文对redis的过期处理机制做个简单的概述,让大家有个基本的认识. Redis中有个设置时间过期的功能,即对存储在redis数据库中的值可以设置一个过期时间.作为一个缓存数据库,这是非常实用的.如我 ...

  5. redis 下key的过期时间详解 :expire

    memcached 和 redis 的set命令都有expire参数,可以设置key的过期时间.但是redis是一个可以对数据持久化的key-value database,它的key过期策略还是和me ...

  6. redis string类型设置过期时间后 再进行set操作,会清除过期时间

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_41756437/article/d ...

  7. Redis的key过期处理策略

    Redis中有三种处理策略:定时删除.惰性删除和定期删除. 定时删除:在设置键的过期时间的时候创建一个定时器,当过期时间到的时候立马执行删除操作.不过这种处理方式是即时的,不管这个时间内有多少过期键, ...

  8. redis中key过期事件

    刚到新公司一个月左右,有个新需求,想做定时任务,比如在用户注册时间的3天后推送用户一条消息. 从刚开始脑子里面闪现的数据库轮询,立马否定掉(浪费资源),再到linux系统的定时任务,但是当用户量过大时 ...

  9. 【springBoot】springBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

随机推荐

  1. 1066 Root of AVL Tree (25)

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...

  2. mybatis-sqlite日期类型对应关系

    1.问题 sqlite数据库 user表,create_time字段,类型DATETIME,设置默认值datetime('now') mybatis,User实体,createTime类型为java. ...

  3. LDA算法 (主题模型算法) 学习笔记

    转载请注明出处: http://www.cnblogs.com/gufeiyang 随着互联网的发展,文本分析越来越受到重视.由于文本格式的复杂性,人们往往很难直接利用文本进行分析.因此一些将文本数值 ...

  4. GO语言测试

    Go语言的测试技术是相对低级的.它依赖一个 go test 测试命令和一组按照约定方式编写的 测试函数,测试命令可以运行这些测试函数.编写相对轻量级的纯测试代码是有效的,而且它很容易延伸到基准测试和示 ...

  5. 12.linux上Apache虚拟主机的建立和https协议网站建立

    一.Apache虚拟主机的建立   虚拟web主机 在同一台服务器上建立多个web站点,每个站点不独占用一台真正的服务器       1.建立dns解析 两个域名同一个ip               ...

  6. SQL语句简单增删改查

    常用数据类型 Int:整数,长度没有作用 Varchar:字符串,varchar(3)表示最多存放3个字符,1个中文或英文或符合都占1个字符 Decimal:小数,decimal(5,2)表示共存5位 ...

  7. windows中kill端口为8080的进程(或子进程)

    1.netstat -aon|findstr "8080" 查出8080端口被9436进程占用 2.查看PID对应的进程 tasklist|findstr "9436&q ...

  8. ubuntu设置开机启动后命令行界面

    author:headsen chen date: 2019-09-19  14:23:31 在字符界面(即命令行界面)输入命令: 设置为字符界面的命令:sudo systemctl set-defa ...

  9. Flutter和原生交互学习

    PlatformChannel功能简介 PlatformChannel分为BasicMessageChannel.MethodChannel以及EventChannel三种.其各自的主要用途如下: B ...

  10. 003-结构型-05-桥接模式(Bridge)

    一.概述 将抽象部分与它的具体实现部分分离.使它们都可以独立地变化.通过组合的方式建立两个类之间联系,而不是继承. Bridge 模式又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最 ...