StringRedisTemplate中的小坑

StringRedisTemplate操作string类型使用ValueOperations接口,代码描述为针对简单值或者redis术语中的'string'进行操作
我们先来看两个基本的命令

一、SETEX

语法

SETEX key seconds value

语法等同于

SET key value
EXPIRE key seconds

代码执行redis的命令为setex,为设置key的值保存,并在给定秒数之后过期。
代码接口如下:

二、SETRANGE

语法

SETRANGE key offset value

覆盖存储在健处的从指定偏移量开始的一部分字符串,如果偏移量大于键处字符的总长度,则用0字节进行填充,桶bitmap,即redis的string最大存储大小为512MB,最大字节为2^29-1(536870911),所以偏移量的大小不能超过536870911 减去当前字符的字节长度值
命令返回值为设置之后总长度

代码接口如下

虽然命令完全不一样,但是在StringRedisTemplate方法调用时却极其相似,可能第二个方法用的少一些,第一个方法设置值并设置过期时间应该很常见的操作,
比如下面这个代码,

redisTemplate.opsForValue().set(key, "-1", 3600 * 24 * 5)

结合代码上下文和注释可以看到大概意思是为了防止缓存穿透,设置的默认值为-1,过期时间写的3600245应该是想设置过期时间为5天,炸一看没啥问题(别人写的也没仔细看过),后来随着用户量越来越多,redis内存越来越大,大的奇葩,后来排查这些key的存储占大头,设置key的过期时间忘写导致的原因

redisTemplate.opsForValue().set(key, "-1", 3600 * 24 * 5, TimeUnit.SECONDS);

建议像这种过期时间写成下面这样靠谱些,读起来也方便,万一忘记写过期时间单位整个key所占用的大小也是很小的

redisTemplate.opsForValue().set(key, "-1", 1, TimeUnit.DAYS);

参考文档
https://redis.io/commands/setex/
https://redis.io/commands/setrange/

posted @ 2022-10-17 11:29  木马不是马  阅读(464)  评论(0编辑  收藏  举报