持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
🍊作者简介:少年不想说话,努力长大
🍊往期回顾:从零开始Redis(十四)
🍊近期目标:写完基础源码,点赞👍🏼、收藏⭐、留言📩
今天插一下,我们之前说了redis的基本数据结构,我今天也恰好遇到一个可以实战的小需求,下面我们看看;
需求内容是用redis存储我们分析的文件结果,不一直存储,每次保持存储列表长度是50即可,按照先进先出的原则存储;我自己后面补充了一下加了一个内部查询接口,如果你遇到这个需求你会怎么写?先说基调,这个需求很简单哈,但我测试验证出现点其他影响的问题,导致耗费过长时间,不影响;你想到如何处理了吗? 我们往下看。
首先我们要用list列表来进行存储,我们定义一个key供该list使用,然后使用lpush进行追加操作,一直追加即可,注意我们的value值要JSON序列化一下,看用例
JSON.toJSONString(返回值, SerializerFeature.WriteNullStringAsEmpty)
然后根据实际的项目需要对追加后的list列表进行截取,这里我们可以使用trim,很抱歉之前说list的时候没说这个用法,现在补上,
LTRIM key start stop 对列表中的元素进行裁剪,只保留指定区间的数据,注意点:start和stop都是以0为开始,闭区间的表示方式,比如 LTRIM key 0 1 这个表示的是两个数据,还有每次ltrim都只会去除一个数据(先进先出的原则), 对于语法上的start end有很多用例都说了其范围下返回的结果,我倒觉得没必要太在意这个,毕竟这个我们应该只用于限定大小,对于遍历内容方面我们有更好的选择Lrange;
127.0.0.1:6379> LPUSH myi 1 2 3 4 5 6 7 8
(integer) 8
127.0.0.1:6379> LRANGE myi 0 -1
1) "8"
2) "7"
3) "6"
4) "5"
5) "4"
6) "3"
7) "2"
8) "1"
127.0.0.1:6379> LTRIM myi 0 5
OK
127.0.0.1:6379> LRANGE myi 0 -1
1) "8"
2) "7"
3) "6"
4) "5"
5) "4"
6) "3"
看下伪代码
redisTemplate.opsForList().leftPush(key, JSON.toJSONString(返回值, SerializerFeature.WriteNullStringAsEmpty));
redisTemplate.opsForList().trim(key,0,49);
这段代码表示我们的列表只存储50个最新的数据,就两行代码,一个追加,一个截取就完成了,很简单是不是,每次追加结束就截取掉之前最旧的数据;
再来说下获取,我们通过调用
List range = redisTemplate.opsForList().range(key, start, end);
这里代码里我们应该加个判断控制start和end的值如果为空,我们要赋默认值,别导致报错了;返回**[start,end]**范围内的数据,
127.0.0.1:6379> LRANGE myi 0 5
1) "8"
2) "7"
3) "6"
4) "5"
5) "4"
6) "3"
好了,这是一个小用例,很好模拟的,大家有兴趣试试,也算是对list的巩固了,多试几次就可游刃有余;好啦🥗🥗🥗;
结束结束,那就🛴🛴🛴
如果对你有所帮助
点个赞呗