用在哪 : 要给一个东西设置有效时间 , 到第二天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以后就开始倒计时了