• Redis stream性能测试实践【Java版】


    前些日子写了Java Redis stream的基本API实践和封装文章:Redis stream Java API实践,自然地也需要对这些API进行性能测试。

    总的来说,Redis stream的API跟list操作的API差不多,就是添加、读取、删除一类,对于消费组的API,由于实际工作中并没有使用,所以暂时搁置。

    性能测试思路

    这里我设计了三个用例:

    1. 添加消息
    2. 读取消息
    3. 添加、删除消息

    前两个用例比较简单,所以这里就不演示了,本次用例展示两种动态测试模型的使用方式:动态线程动态QPS

    简述一下第三个用例的思路:首先就是创建一个添加消息,然后成功之后返回一个redis.clients.jedis.StreamEntryID,再根据这个返回值进行删除操作。实际工作中暂时没想到这个实际的场景,以后再遇到其他使用场景再来进行性能测试。

    性能测试用例

    这里我先分享一下动态线程模型的用例,我把用到的参数都写成了静态的变量形式,这样比较方便,如果是实际业务场景中,应该传比较复杂的。不过问题不大,都可以写在com.funtest.groovytest.RedisStreamTest.FunTester#doing里面,或者在动态QPS的闭包中。

    package com.funtest.groovytest
    
    import com.funtester.base.constaint.FunThread
    import com.funtester.db.redis.RedisBase
    import com.funtester.frame.SourceCode
    import com.funtester.frame.execute.FunConcurrent
    import redis.clients.jedis.params.XAddParams
    
    import java.util.concurrent.atomic.AtomicInteger
    
    class RedisStreamTest extends SourceCode {
    
        static RedisBase driver
    
        static def index = new AtomicInteger(0)
    
        static def desc = "Redis stream性能测试实践"
    
        static def map
    
        static def key = "FunTesterStream"
    
        static def params
    
        public static void main(String[] args) {
            driver = new RedisBase("127.0.0.1", 6379)
            params = XAddParams.xAddParams().maxLen(1000)
            map = new HashMap<String, Integer>()
            map.put("key1", 1)
            map.put("key2", 2)
            driver.xadd(key, params, map)
            params = XAddParams.xAddParams()
            output driver.xlen(key)
            new FunConcurrent(new FunTester(),).start()
    
        }
    
        private static class FunTester extends FunThread {
    
    
            FunTester() {
                super(null, desc + index.getAndIncrement())
            }
    
            @Override
            protected void doing() throws Exception {
                def xadd = driver.xadd(key, params, map)
                driver.xdel(key,xadd)
            }
    
            @Override
            FunTester clone() {
                return new FunTester()
            }
        }
    }
    
    

    下面分享一下动态QPS模型的压测用例:

    package com.funtest.groovytest
    
    import com.funtester.db.redis.RedisBase
    import com.funtester.frame.SourceCode
    import com.funtester.frame.execute.FunQpsConcurrent
    import redis.clients.jedis.params.XAddParams
    
    class RedisStreamQPSTest extends SourceCode {
    
        static RedisBase driver
    
        static def desc = "Redis stream性能测试实践"
    
        static def map
    
        static def key = "FunTesterStream"
    
        static def params
    
        public static void main(String[] args) {
            driver = new RedisBase("127.0.0.1", 6379)
            params = XAddParams.xAddParams().maxLen(1000)
            map = new HashMap<String, Integer>()
            map.put("key1", 1)
            map.put("key2", 2)
            driver.xadd(key, params, map)
            params = XAddParams.xAddParams()
            def test  = {
                def xadd = driver.xadd(key, params, map)
                driver.xdel(key,xadd)
            }
            new FunQpsConcurrent(test).start()
    
        }
    
    }
    
    

    控制台输出

    15:50:41.091 main 
      ###### #     #  #    # ####### ######  #####  ####### ######  #####
      #      #     #  ##   #    #    #       #         #    #       #    #
      ####   #     #  # #  #    #    ####    #####     #    ####    #####
      #      #     #  #  # #    #    #            #    #    #       #   #
      #       #####   #    #    #    ######  #####     #    ######  #    #
    
    15:50:41.474 main redis连接池IP:127.0.0.1,端口:6379,超时设置:5000
    15:50:42.728 Deamon 守护线程开启!
    15:50:45.761 main 当前设计QPS:1,实际QPS:0 活跃线程数:0 单线程效率:0
    15:50:50.780 main 当前设计QPS:1,实际QPS:1 活跃线程数:1 单线程效率:1
    15:50:55.798 main 当前设计QPS:1,实际QPS:1 活跃线程数:0 单线程效率:1
    进程已结束,退出代码130 (interrupted by signal 2: SIGINT)
    
    

    BUG挖掘机·性能征服者·头顶锅盖

    阅读原文,跳转我的仓库地址

  • 相关阅读:
    使用Python和百度对外共享的TTS接口实现文本转语音
    最简单的AI代码——价值“一个亿”
    【CSS】让滚动条消失
    足球圈移动端网页Demo
    golang通过errgroup单chan多个grouting通讯样例
    gin返回前端excel文件流
    xorm构建复杂sql
    CSS实现标签闪动效果
    vue_js遍历双重数组对象
    vue_html实现加载双重数组对象
  • 原文地址:https://www.cnblogs.com/FunTester/p/16459908.html
Copyright © 2020-2023  润新知