RedisTemplate设置过期时间问题

爱吃糖的靓仔 2019-07-12 04:42:08
redisTemplate.opsForHash().put(vid, photoType)上传图片
属性分别为 key,照片类型,路径
第一个为 A 自拍照 xxx
第二个为 A 全身照
但是根据 redisTemplate.expire(vid, time, TimeUnit.SECONDS);
他是按照vid进行设置过期时间
这样会出现一个问题即使 假如我第一个图片过期时间为5分钟
过了4分钟后
我又重新添加了一个图片,设置了过期时间5分钟
这样不就是一直救活了快要过期的自拍照;
有什么解决的办法吗?
...全文
8690 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
小码人生 2020-05-28
  • 打赏
  • 举报
回复
可以先查询是否存在,存在删除,再添加新的进入设置过期时间 //检查key是否存在,返回boolean值 stringRedisTemplate.hasKey("key"); //根据key删除缓存 stringRedisTemplate.delete("key");
海德薇快跑 2020-05-27
  • 打赏
  • 举报
回复
String uuid=UUID.randomUUID().toString();
shengzhang_ 2020-04-14
  • 打赏
  • 举报
回复
你先查出原先的过期时间就好了,然后用这个过期时间再set新值
南忆K 2020-04-14
  • 打赏
  • 举报
回复
楼主没有表述清楚,应该是用list格式的吧,然后数据是以逗号隔开的 key,照片类型,路径 来保存的是吗?如果数据量不是特别大的话那就再加一个属性时间,保存的数据也就是key,照片类型,路径,插入时间,然后加一个定时线程每隔几秒遍历一遍队列移除掉过期数据
plutoppppp 2019-12-27
  • 打赏
  • 举报
回复
引用 16 楼 裸奔的肉夹馍 的回复:
那加入 第一个图片A时间为 (5分钟),过了3分钟,添了一个B图片,此时A失效时间为两分钟,然后接下来AB一起在2分钟后消息吗? 问题就在于为什么我设置B为五分钟,非要2分钟就消失呢
如果你想让他们的过期时间分开,那就说明他们是不同作用的,为什么要用同一个ID? 如果你是想让B跟着A一起过期,因为redis机制的问题,那你可以通过getExpire函数获取到过期时间然后再put的时候设置重新设置原有的过期时间。 如果你想让B加入的时候A也不消失那就put的时候设置重新设置指定的时间。
tiaoxixiaoji 2019-12-27
  • 打赏
  • 举报
回复
按照你的要求就不要用hash类型了,改用String吧
eqfrweg 2019-12-26
  • 打赏
  • 举报
回复
我觉得大家可能没理解你的问题,你也没描述清楚。按照你的字里行间理解,你可能是vid对应的value是一个list或者set或者hash是吧,这个集合里面至少存了两个东西,一个是自拍照的url,一个是全身照的url,现在你只更新全身照的url,担心加的过期时间影响自拍照的,是不是我这么理解的?
爱吃糖的靓仔 2019-08-20
  • 打赏
  • 举报
回复
那么总不能第一个数据没有过期 后面就不添加了把
elephantRed 2019-08-20
  • 打赏
  • 举报
回复
key很容易解决,写一个lua脚本;set之前先ttl判断下剩余的过期时间,如果不等-1,那么不做任何操作即可。
爱吃糖的靓仔 2019-07-16
  • 打赏
  • 举报
回复
那加入 第一个图片A时间为 (5分钟),过了3分钟,添了一个B图片,此时A失效时间为两分钟,然后接下来AB一起在2分钟后消息吗? 问题就在于为什么我设置B为五分钟,非要2分钟就消失呢
老王就是我 2019-07-16
  • 打赏
  • 举报
回复
可以这样,key值相同的话,先把redis的数据删除后,再把新数据加进去
老王就是我 2019-07-16
  • 打赏
  • 举报
回复
你的逻辑有问题,redis是类似map的存储类型,我不知道你有没学过,在java中,map的key值是唯一的,如果后续插入之前已有的key值,则会覆盖掉之前对应的key的值
程序员 beige 2019-07-15
  • 打赏
  • 举报
回复
key相同的话,第二次的就把第一次的覆盖啦,第二次的从新计时5分钟过期啊,第一次的数据已经不在了
有梦想的小白 2019-07-15
  • 打赏
  • 举报
回复
在从缓存中获取到数据的时候同时获取下数据的失效时间,把新的数据存进去的时候把过期时间设置为拿出来数据的失效时间,直到拿出来为空的时候再重新设置失效时间为5分钟。
爱吃糖的靓仔 2019-07-15
  • 打赏
  • 举报
回复
redisTemplate.opsForHash().put(vid,key photoType); 您说的key 是指的hashkey 而不是vid, vid是可以相同的,因为它代表数据可以存在哪里 而 key 指的 数据的key,他是唯一的;
爱吃糖的靓仔 2019-07-13
  • 打赏
  • 举报
回复
redisTemplate.opsForValue().set(key, value, expire, TimeUnit.MINUTES); 这个方法不依靠 vid 和key 他是怎么定位元素 他默认的vid是什么?
雾里看花の 2019-07-13
  • 打赏
  • 举报
回复
redis hash表只能设置vid的过期时间,你要想设置每个的过期时间,你只能用普通的,比如

redisTemplate.opsForValue().set(key, value, expire, TimeUnit.MINUTES);
爱吃糖的靓仔 2019-07-13
  • 打赏
  • 举报
回复
""但是即便是vid ,我发现在进行设置有效期的操作上,他们设置的值都是vid。这样的话,全部vid 里面的数据全都重置啦 " 就和这位大佬说一样,当增加数据的时候我在vid的数据的有效期会重置,如何避免这个问题,我想问的就是这个问题
海上的程序猿 2019-07-12
  • 打赏
  • 举报
回复
看了你们的讨论,不知道楼主的主要目的是什么。到底是更新后不更新key的有效时间,还是希望更新后更新key的有效时间?
爱吃糖的靓仔 2019-07-12
  • 打赏
  • 举报
回复
引用 6 楼 qq_42292373的回复:
[quote=引用 5 楼 散着步的码农的回复:][quote=引用 4 楼 qq_42292373 的回复:] [quote=引用 3 楼 散着步的码农的回复:]加个标记啊,上传之前后台传过去个token 然后上传请求的时候携带这个token 后台的key 就可以是 photo_+token 这样不就唯一了吗
那这样和我直接不让,key 相同又有什么区别,最后的key 都是相同的[/quote] 那你这逻辑就不通了啊,key本来就是唯一的,一定会覆盖的,需求是什么啊?覆盖上一个为什么还要上一个是有效的呢?[/quote] 我说的是vid 可以唯一,可能是我表达有误,抱歉[/quote] 但是即便是vid ,我发现在进行设置有效期的操作上,他们设置的值都是vid。这样的话,全部vid 里面的数据全都重置啦
加载更多回复(6)

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧