高并发抢红包方案--基于Redis lua方案

1.1k 词

Redis 2.6 内置Lua解释器

  • Lua由标准C编写而成,代码简洁优美,完整的Lua解释器不过200k,极易嵌入到其他程序。
  • Lua和C/C++代码交互容易, 性能和灵活性大大提高。
  • 可作为扩展脚本,也可以作为普通的配置文件,实现复杂的配置逻辑,并且容易理解和维护.

Redis–lua脚本

  • 减少网络开销:本来多次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延。
  • 原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。
  • 脚本复用:客户端发送的脚本会永久存储在Redis中,意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑。
    1
    2
    3
    4
    5
    6
    7
    redis> EVAL "return 1+1" 0
    (integer) 2
    redis> EVAL "return {KEYS[1], KEYS[2], ARGV[1], ARGV[2]}" 4 "msg" "age" 123 "hello world"
    1) "msg"
    2) "age" # KEYS[2]
    3) "123" # ARGV[1]
    4) "hello world" # ARGV[2]

但是,脚本执行很慢就会影响redis的高响应。

redis集群脚本存在的问题

问题:集群对于multi-key操作(即一次RPC调用中需要进行多个key的操作)比如Set类型的交集、并集等,则要求这些key必须属于同一个node。

1
2
3
4
5
# There are 16384 hash slots in Redis Cluster.This allows to add an
# remove nodes in the cluster easily.
Node A contains hash slots from 0 to 5500.
Node B contains hash slots from 5501 to 11000.
Node C contains hash slots from 11001 to 16383.

解决方案:Hash tags。每个key都可以包含一个自定义的“tags”,那么在存储时将根据tags计算此key应该分布在哪个node上(存储层面仍然是key),比如“foo”和“{foo}.student”将会被保存在同一个node上。

2. 抢红包

  • 红包操作能够在一次cache请求中完成并返回结果。
  • 数据格式一致,脚本能够复用。
    数据结构
    1
    2
    3
    4
    5
    {
    rid: 123,
    uid: 456,
    money: 789
    }

3. 红包

3.相关测试信息