用在哪 : 要给一个东西设置有效时间 , 到第二天0点过期失效 , 用Redis
当时要求整齐就好 , 没有指定怎么弄 , 我就弄成"项目名 + key名 + yyyy-MM-dd + 唯一标识"
这里其他部分略,
本篇只讲两点
①yyyy-MM-dd怎么弄出来插进Redis的key里
②怎么设置第二天过期
************************************************************************
①yyyy-MM-dd怎么弄出来插进Redis的key里
步骤1/3 因为是要插在Redis里弄成String格式 , 格式按你自己喜好
// 时间对象格式化为字符串
// 用来做今日访问量
public static String getyyMMdd(){
long currentTime = System.currentTimeMillis(); // 当前时间戳
Date date = new Date(currentTime);// 时间戳转换为时间
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
return simpleDateFormat.format(date);
}
步骤2/3 用你自己拼接RedisKey的方法拼上去就好了 , 比如这样
public String linkKey(String... linkContents){
StringBuilder sb = new StringBuilder(100);
sb.append(prefix);
for (String linkContent : linkContents) {
sb.append(":").append(linkContent);
}
return sb.toString();
}
步骤3/3 拼接Key
→用指定好的枚举钥,比如我是HolaOrange,我就弄一个这样的,key就好了
String key = RedisKey.IAMORANGE.linkContent(日期,唯一标识);
// 日期怎么弄看下面
②怎么设置第二天过期
步骤1/3 先算出现在距离过期还有多久
直接用Calender搞,
我看别人也有这么写的, 直接写1天哈哈,这里精度我没研究直接摆long,查完我会回来填坑的(bushi
【填坑】关于精度的问题 :
// 原代码
return (long) ((cal.getTimeInMillis() - System.currentTimeMillis()) / 1000.00);
// 现修正为
return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000);
→为啥做了修正 :
①我除以1000.00是想转为double类型,我以为精度更高 ,
②但其实 , double的精度是15-16位 ,远没有long的19位精确 , 而且低转高精度后面位数该丢还是丢 , 所以我认为我原来的代码有些多此一举了,
③顺便回顾一下
long属于整型,在 byte < short < int < long里排最大,占8个字节(64位) ,
double属于浮点型,排在float后面,属于双精度,同时double也是占8个字节(64位)
一般情况下比如3.14默认是double类型,加后缀3.14F这样才会认为是float类型,
代码在这 , 写完了摆工具类里
// 今天剩余时间
public static long todayHaveTime(){
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, 0); // 0天
cal.set(Calendar.HOUR_OF_DAY, 23);// 23小时
cal.set(Calendar.MINUTE, 59); // 59分
cal.set(Calendar.SECOND, 59); // 59秒
cal.set(Calendar.MILLISECOND, 999); // 999ms 因为1s=1000ms
return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
// 这里是为了Redis在设置时候弄的第三个参数,单位是秒,(第四个参数用的TimeUnit.SECONDS)
// 所以我算出来除以1000ms变成秒单位,
// 如果是用TimeUnit.MINUTES的话就再除以60就是以分钟为单位了
}
步骤2/3 什么时候调用这个方法:
//API一目了然而且项目是SpringBoot项目所以用的这
@Autowired
private StringRedisTemplate template;
...中间代码略
template.opsForValue().set(key,value,插在这第三个参数这,TimeUnit.SECONDS);
// 看到了吗第四个参数单位是秒,所以中间的第三个参数单位一定要是秒,
// 如果第四个参数是其他单位,第三个的值就随之改就好了
步骤3/3 插在代码哪里
比如用户买了一张票, 成功交易的那一刻 , 把东西存入Redis ,
实体按格式造key , 拿到value, 然后把倒计时插入第三个参数,确定好单位(第四个参数) , 存入Redis以后就开始倒计时了