文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot中怎么通过整合Redis实现管道

2023-06-20 14:14

关注

这篇文章给大家介绍SpringBoot中怎么通过整合Redis实现管道,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。


1. Redis 之管道(pipeline)

执行一个Redis命令,Redis客户端和Redis服务器就需要执行以下步骤:

Redis命令所消耗的大部分时间都用在了发送命令请求和接收命令结果上面,把任意多条Redis命令请求打包在一起,然后一次性地将它们全部发送给服务器,而服务器则会把所有命令请求都处理完毕之后,一次性地将它们的执行结果全部返回给客户端。

注意事项:

Redis服务器并不会限制客户端在管道中包含的命令数量,但是却会为客户端的输入缓冲区设置默认值为1GB的体积上限:当客户端发送的数据量超过这一限制时,Redis服务器将强制关闭该客户端。因此最好不要一下把大量命令或者一些体积非常庞大的命令放到同一个管道中执行。

除此之外,很多客户端本身也带有隐含的缓冲区大小限制,如果你在使用流水线特性的过程中,发现某些流水线命令没有被执行,或者流水线返回的结果不完整,那么很可能就是你的程序触碰到了客户端内置的缓冲区大小限制。

2. SpringBoot 整合 Redis 管道实例

SpringBoot 整合 redis 的实例

使用单个的 increment 命令,处理 200w个key:

public class RedisPipelineStudy extends BaseTest {    @Autowired    private StringRedisTemplate stringRedisTemplate;    private static final String PREFIX = "test0:";    @Test    public void test() {        StopWatch stopWatch = new StopWatch();        stopWatch.start("test0");        for (int times = 0; times < 2; times++) {            for (int i = 0; i < 1000000; i++) {                stringRedisTemplate.opsForValue().increment(PREFIX + i, 1L);            }        }        stopWatch.stop();        System.out.println(stopWatch.prettyPrint());    }}

耗时如下所示:是 12 位 ,单位ns

SpringBoot中怎么通过整合Redis实现管道

使用管道 incrBy 处理 200w个key,每次打包300条命令发送给服务器,如下所示:

public class RedisPipelineStudy extends BaseTest {    @Autowired    private StringRedisTemplate stringRedisTemplate;    private static final String PREFIX = "test1:";    @Test    public void test() {        StopWatch stopWatch = new StopWatch();        stopWatch.start("test1");        List<Integer> recordList = new ArrayList<>();        for (int times = 0; times < 2; times++) {            for (int i = 0; i < 1000000; i++) {                try {                    recordList.add(i);                    if (recordList.size() > 300) {                        incrByPipeline(recordList);                        recordList = new ArrayList<>();                    }                } catch (Exception e) {                    System.out.println(e);                }            }            if (!CollectionUtils.isEmpty(recordList)) {                incrByPipeline(recordList);                recordList = new ArrayList<>();            }        }        stopWatch.stop();        System.out.println(stopWatch.prettyPrint());    }    private void incrByPipeline(List<Integer> recordList) {        stringRedisTemplate.executePipelined(new RedisCallback<Object>() {            @Override            public Object doInRedis(RedisConnection connection) throws DataAccessException {                try {                    for (Integer record : recordList) {                        byte[] key = (PREFIX + record).getBytes();                        connection.incrBy(key, 1);                    }                } catch (Exception e) {                    System.out.println(e);                }                return null;            }        });    }}

耗用时间: 11 位 ,单位 :ns,是单个命令耗时的 1/6。

SpringBoot中怎么通过整合Redis实现管道

关于SpringBoot中怎么通过整合Redis实现管道就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯