agatan / isucon7-qualify

ISUCON7予選: 都営三田線東急目黒線直通急行日吉行
4 stars 0 forks source link

Count unread messages with redis #28

Closed izumin5210 closed 6 years ago

izumin5210 commented 6 years ago

WHY

https://github.com/agatan/isucon7-qualify/pull/11 で先送りにした,未読件数カウントをredisにやらせる君

WHAT

channelごとにsorted setつくって,score=updated_at, value=message_idで格納していく

↓検証した

127.0.0.1:6379> zadd test 1 a 2 b 3 d 4 f 5 g
(integer) 5
127.0.0.1:6379> zrank test 3
(nil)
127.0.0.1:6379> zrank test 2
(nil)
127.0.0.1:6379> zrank test b
(integer) 1
127.0.0.1:6379> zrevrank test b
(integer) 3
127.0.0.1:6379> zcard test
(integer) 5
127.0.0.1:6379> zadd test 10000 h
(integer) 1
127.0.0.1:6379> zcard test
(integer) 6
izumin5210 commented 6 years ago

ローカルだと3s以上かかっている

image

izumin5210 commented 6 years ago

initializeがおそかったら↓みたいにする

    chunkSize := len(msgs)/4 + 1

    chunks := [][]*Message{
        msgs[0*chunkSize : 1*chunkSize],
        msgs[1*chunkSize : 2*chunkSize],
        msgs[2*chunkSize : 3*chunkSize],
        msgs[3*chunkSize : int(math.Min(float64(4*chunkSize), float64(len(msgs))))],
    }