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/