Redis 性能评估及一台 Redis 承受不住并发量怎么办? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tanteng
V2EX    Redis

Redis 性能评估及一台 Redis 承受不住并发量怎么办?

  •  1
     
  •   tanteng
    tanteng 2016-03-05 16:10:32 +08:00 30666 次点击
    这是一个创建于 3574 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如一个 Redis 实例,假设请求并发量很高,可能这台 Redis 撑不住了,那么两个问题:

    1.Redis 并发量支撑大概是多少,如何评估

    2.如果一个 Redis 实例支撑不住,有什么解决方案

    第 1 条附言    2016-03-05 17:10:25 +08:00
    如果同时操作一个 key ,如 set,get ,会有什么问题吗
    9 条回复    2016-03-06 10:21:58 +08:00
    line
        1
    line  
       2016-03-05 17:03:53 +08:00
    可以集群啊
    axb
        2
    axb  
       2016-03-05 17:22:12 +08:00
    1. 自带 benchmark 工具
    2. 读多加从,写多分多实例
    3. redis 本身不会有并发问题,但应用层如果不做并发控制会有数据不一致情况。
    wikimore
        3
    wikimore  
       2016-03-05 18:07:13 +08:00   1
    1.评估光用 benchmark 不可靠,得具体根据你的业务使用场景,如使用 string 还是 list ,或者是 zset , list 和 zset 长度不同有些操作的单次耗时是不同的,你得预估你的数据量,然后自己写测试代码,这样最靠谱
    2.一个 redis 撑不住可以用多个,具体两种策略,一个是客户端路由,一个是服务端加代理层,由服务端路由,如 codis
    3.redis 内部是单线程的,所以不会有并发问题,即使你业务代码是并发的,但是到 redis 那里,你可以理解成一个队列,先到先做,顺序执行

    PS:redis 最该考虑的我觉得还是容量问题,毕竟内存资源还是比较宝贵的
    realpg
        4
    realpg  
    PRO
       2016-03-05 18:58:41 +08:00
    @wikimore
    内存可以很廉价的搞……
    1366 平台的双路主板三百多就能收到,一般都是 12 个内存插槽的。
    4G REG 内存基本已经 30~35 一根了,两颗 L5630 的低功耗 CPU 打包 50 元,多便宜……
    Infernalzero
        5
    Infernalzero  
       2016-03-05 19:06:09 +08:00
    redis 是流水线模式的
    publicAdmin
        6
    publicAdmin  
       2016-03-05 19:37:30 +08:00
    @tanteng “如果同时操作一个 key ,如 set,get ,会有什么问题吗”

    多线程对同一个 Key 操作时, Redis 服务是根据先到先作的原则,其他排队(可设置为直接丢弃),因为是单线程。

    修改默认的超时时间,默认 2 秒。但是大部份的操作都在 30ms 以内。

    改用 Redis 客户端对象池,单个 Redis 客户端对多线程,容易出现问题。
    sagnitude
        7
    sagnitude  
       2016-03-05 20:08:45 +08:00   1
    有很大的需求的话,可以用集群,或者代理层

    1. 对集群来说,一般来说普通的服务器都是 50K~100K 级别 GET 操作并发(每个核心)这个水平,根据具体的部署方法和配套工具,会有浮动
    对本机的普通 Redis (非集群)来说, GET 操作在 70K~120K 级别

    评估方法: Redis 官方提供了 C 的库;官方的 redis-benchmark 工具用的就是 C 的库, redis-benchmark 的结果大致可以当成 使用 C 语言开发可以获得的性能。

    复杂的操作,一个复杂操作,你可以大致认为是若干个 GET 操作的级别,你用 redis-benchmark 跑一下,大概按比例估算一下就行了。

    如果你用的是其他的语言,用官网推荐的 client library 写一个简单的 sample 跑一下,把 redis 服务器的 info 打出来。
    redis-cli info 里面有已处理命令的统计。
    就我的使用来说, Java 的 Jedis 连接 Redis 的性能(并发量)在 C 的 70%这个水平

    2. 一个实例扛不住,就用集群,我目前在用官方的 redis-cluster ,目前平均下来每个核心可以提供 85K 的并发,极限在每核心 100K 左右(单位是一次 C 语言 GET)

    3. redis 的话,是单线程的,你的同时操作总会有一个先后顺序,所以没有问题

    如果是 redis-cluster ,它只提供最终一致性,也就是说你在 A 服务器上 SET ,你立刻在 B 服务器上 GET 有可能拿不到这个值,但是它保证最后你的 GET 和 SET 请求会和普通的 redis 一样,按照时间顺序被处理,最后的结果和使用单实例 Redis 一样
    sagnitude
        8
    sagnitude  
       2016-03-05 20:20:17 +08:00
    @sagnitude 修正一下,我目前在跑的 redis 集群服务器,测出来的是每核心 50K 左右(没跑满 CPU), 100K 是理论极限,估计不能达到, 85K 是估算的极限。我们认为继续优化意义不大,不如买服务器,就没继续研究了…
    Zoa
        9
    Zoa  
       2016-03-06 10:21:58 +08:00
    @publicAdmin 根据这里( http://www.redis.cn/topics/clients.html )的文档说法:“该顺序是由客户端 socket 文件描述符的数字大小及核心报告客户端事件的顺序决定的,因此顺序可以看成不确定的。”,顺序在大体上会呈“先到先作的原则”,但小处上呈现的应该是无序性。
    @tanteng 如果考虑“ TCP 的 TIME_WAIT ”问题,我在 MBP 上测试的结果是 17000 左右的请求数就会出现“ Can't assign requested address ”的错误。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1293 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 17:11 PVG 01:11 LAX 09:11 JFK 12:11
    Do have faith in what you're doing.
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-11940834-2', 'v2ex.com'); ga('send', 'pageview'); ga('send', 'event', 'Node', 'topic', 'redis'); ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86