search

Home  >  Q&A  >  body text

php - Redis高并发的一个小问题

RT,现在有个客户报名小功能,要求:每个客户只能报名一次;
由于客户量大,预计峰值并发到达 1W/S,那么问题来了,使用 Redis 如何实现该需求?

能上代码的朋友感激不尽!

PHP中文网PHP中文网2821 days ago367

reply all(6)I'll reply

  • 怪我咯

    怪我咯2017-04-10 17:02:53

    hincrby即可解决
    数据存储:将报名信息保存到一个hash结构中,hash里面的key使用用户id,value是报名次数
    报名:直接使用hincrby命令,将对应的userId的value+1,如果之前没报名,返回1,大于1表示已报过名。
    并发问题:再大的并发量这个方案都不会有任何问题,因为可以重复提交报名信息,而且每个步骤都是原子性的,hincrby的性能接近O(1),效率也不低,如果需要前端提示重复报名,可根据hincrby返回值是否>1来判断。

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 17:02:53

    redis有事务功能,可以参考一下

    reply
    0
  • PHPz

    PHPz2017-04-10 17:02:53

    就是正常的逻辑添加,读取,更新逻辑。

    既然并发较大那你要把redis,nginx,linux进行配置,首先让他们物理配置上能承受1w并发。
    其实也没什么特别的,如果你是nginx还可以进行优化。

    reply
    0
  • PHPz

    PHPz2017-04-10 17:02:53

    redis 的读写性能,官网说明可以10w+每秒,实际的读写性能可能没有这么高,但是完全符合你的需求的
    可以对每个公司设置一个key,使用redis set方法即可,存在的key就直接覆盖

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 17:02:53

    1.使用redis string 来保存,一个客户又一个uid,uid 如果设置了,就返回;没设置,则set
    并使用list,来保存全部报名的user

    import redis
    r = redis.StrictRedis("localhost",6379)
    if not r.exists(uid):
       r.set(uid,timestamp)
       r.lpush("total",uid)
    

    2.使用zset,和上面类似,只不过省下了list,zset自身可以排序,设置时set score为时间戳即可

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 17:02:53

    学习了。感谢各位的专业解答。

    reply
    0
  • Cancelreply