• 中国人大60周年纪念专题 2019-07-09
  • 柬埔寨留学生在华求学记:生活多彩乐享科技便利 2019-07-04
  • 中国军队:空军大飞机——战略空军的重要标志 2019-07-04
  • “飞越19国 往返3.5万公里 祖国接你回家”获第十二届人民企业社会责任奖年度案例奖 2019-07-03
  • 从唐老鸭到疯狂动物城:卡通毛皮七十年 2019-07-03
  • 北京市海淀区西三旗街拆除8500平方米违法建设 2019-07-02
  • 中欧班列让开放之路越走越宽 2019-07-02
  • 绵阳深山藏古寺 它缘起于一场惊天骗局 2019-07-02
  • 山钢集团日照钢铁精品基地项目 2019-06-30
  • 啥都来反对,有起码的是非么什么东西! 2019-06-30
  • 从严治党从严治吏不松劲不歇脚,是治理“四风”顽症的良方。 2019-06-30
  • 钱江晚报:高考命题有差错,能否增设“防火墙” 2019-06-28
  • 别让“屈原留下三天端午假”的段子再流传 2019-06-28
  • 三沙市委书记、市长肖杰做客人民网 2019-06-28
  • 险!年近八旬老人就医晕倒 赞!医生不顾腰伤抱起抢救(图) 2019-06-24
  • 您好,欢迎来到北风网!

    php redis做mysql的缓存,怎么异步redis同步到mysql数据库?

    加关注
    24 2905
    有网最鹅 有网最鹅 2016-02-12 16:23:19 MySQL Redis PHP

    公司做抽奖或者红包活动,总有人恶意大访问量请求,查询mysql去做重复验证在大并发上限制不住,总会有重复插入,会造成多发奖品。
    想用redis做mysql的缓存,但是现在遇到的问题是如何把redis的数据写回mysql,不可能每次校验的时候就写回mysql,那样的话根本没有解决问题。
    现在的想法是能否利用php,或者其他什么技术,定时将redis中的数据写回mysql。程序只与redis交互。
    希望能给出具体的逻辑或者解决方案,网上的回答都太笼统了,根本解决不了问题。

    谢谢。

    11选5前2组中奖金额 www.a05a.com 1月16日补充:
    我问题描述的不太清晰。
    我把遇到的问题详细的说一下吧,并不是发奖时候脏读的问题,而是判断这个人是否有机会抽奖。
    有一个抽奖的表,如果这个人抽过奖了,就在表中插入一条记录。
    目前的实现方式是:

    1.读取抽奖表判断这个人是否抽过奖
    2.如果表中有记录,那就是抽过了,直接告诉没机会
    3.如果表中没有记录,走抽奖逻辑,然后插入抽奖表

    正常情况下是没有问题的,
    但是有人用恶意脚本进行刷奖,也就是同一个人发起大量请求,1秒可能一两百的请求甚至更多,而且不只一个人刷奖。
    问题出在1这一步
    举个例子,假设每人只能抽一次奖,因为请求太快,同一人的a,b两个请求几乎同时来,a走完抽奖逻辑了,并且在抽奖表中插入记录的过程时,因为mysql的性能的问题,b去走1这一步是读不到表中的记录的,因为a的插入根本没有完成。所以b请求会再走一次抽奖逻辑。造成同一人抽奖两次,然后再插入抽奖表。
    我关心的是能否a插入抽奖表的瞬间,b就能判断出抽奖表有数据。
    所以我觉得问题是mysql写入的不够快,读取的不够快,所以我要采用redis做一层快速缓存。
    我们做的抽奖是单一奖品百分之百中奖,只限制奖品数量,所以必须保证每人只能抽一次,而且尽量在程序层面去解决。


    1月20日补充
    看了大家的回答很受启发,非常感谢。
    至于有人提到并发没想象的那么大这件事,是这样的,我们的服务器是阿里云单台的ECS,配置4核8G 独享50m宽带,centos,只做对外活动。

    这是12月24号上线的一个不到4小时活动的抽奖活动的浏览量。


    这是当时TCP连接数的监控

    抽奖不同于网站访问,这些参与者基本绝大多数是同一时间段来访问服务器。我个人觉得在服务器配置不升级的情况下,软件层面的优化完全能扛住这些访问。我目前觉得瓶颈在mysql。

    请先登录注册
    fs3328787
    fs3328787 的回复

    https://.com/a/1190000004136250

    利用php redis简单抗高并发。另外,这种情况建议参考我的另一篇文章,防单ip恶意提交攻击,这个可以做个单ip限制。

    2016-02-13 16:23:49 回复 0
    请先登录注册
    kkjos
    kkjos 的回复

    1.看一下数据,日均流量和峰值流量,不要有迫害妄想症,真是每次搞活动都被人搞的话,呵呵,恭喜了,你们是下一个阿里巴巴。
    2.平时有没有反作弊、限流机制,策略是啥,对你解决这个问题有无帮助?
    3.为啥用Redis不是memcache之类的?你要用Redis的队列?丰富的数据结构?还是备份?请忽略上面提到的crontab...
    4.mysql写入、读取不够快...,你这个结论怎么得出的,预估的每秒读取、写入请求多少?

    2016-02-13 16:26:09 回复 0
    请先登录注册
    haresai
    haresai 的回复

    题主你之所以会出现这么多问题,是因为你思路混乱,根本没搞清楚这些问题到底是怎么回事,并且得病后还自己乱下药。

    1.【总有人恶意大访问量请求】,这是系统安全问题,你需要做的是防攻击。

    2.【查询mysql去做重复验证在大并发上限制不住】:这是功能缺失。既然有缺失,就立即做新功能研发。

    3.【总会有重复插入,会造成多发奖品】:这是已有系统的Bug,需要通过调试来修正问题。

    综上,这些问题与redis有什么关系?

    2016-02-13 16:28:52 回复 0
    请先登录注册
    zjlhai
    zjlhai 的回复

    可以考虑crontab跑定时任务 执行php脚本去写入 或者跑守护进程去写

    2016-02-13 16:31:42 回复 0
    请先登录注册
    13422177105
    13422177105 的回复

    redis中有个setnx(),这个操作是原子性的。首先可以通过在redis记录每个ip的请求时间,去判断该ip是否请求过快(这种形式又可能误伤,可能某个公司是同一个出口ip)。其次判断每个人是否抽过奖可以存在redis中啊,如果在redis中查不到该用户抽奖的标志就说明没有抽过奖,然后将该用户在redis中标记已经抽过奖了,然后在将该记录插入数据中即可。再说楼主这个只是在公司内部用,这种形式完全撑的住。

    2016-02-14 16:23:49 回复 0
    请先登录注册
    TST庭秘密xin
    TST庭秘密xin 的回复

    可以使用memcache的独占锁

    2016-02-14 16:28:48 回复 0
    请先登录注册
    第3个男孩
    第3个男孩 的回复

    我有过类似的问题。我的解决办法是:

    1. 用redis存储当前用户的session,包括ip,账号,电邮地址

    2. 在表单里面, 根据当前用户的session,生成一个form的验证码(有时间戳),以type='hidden'的形式存在。

    3. 在用户提交表单后:

      a) 先验证提交的隐藏验证码是否属于当前用户(不需要连接后台,根据已知的session来判定)
      b) 然后先搜索当前用户的session是否存在抽奖动作(不需要连接后台,根据已知的session来判定)
      c) 如果当前用户通过 a) 的验证后, 在 b)里面没有抽奖动作就证明该用户之前没有抽奖过,那么就添加一个抽奖动作为true. 如果当前用户通过 a) 的验证后,在 b) 里面有发现抽奖动作为true。就返回以抽奖页面。 也就是说c)跟b)是互相定义, 互相监督的。
      
    4. 在通过3的验证后,再开始抽奖程序。

    5. 在抽奖之后可以验证奖品存货量。(这一步可以在开始做,或者不做,看具体情况)

    注意:

    1. 个人来说不赞成锁定数据库,这样会让程序变慢,对大多数用户来说不友好。毕竟会有情况真的是大量真实的抽奖请求出现,锁定数据库会让效能大大降低。

    2. 通过1,2,3的设置,可以屏蔽单IP短时间重复抽奖的问题。当然如果对方牛逼到能短时间内换IP+重复更换登陆用户+刷新页面生成不同的session,那你的程序绝对有重大逻辑错误,只能灭了重写了。

    2016-02-15 16:23:49 回复 0
    请先登录注册
    riyym
    riyym 的回复

    我感觉就是读脏数据的问题,楼主希望判断是否抽奖,抽奖逻辑,写抽奖表,这个过程中不能有第二相同用户来抽奖,实际上这个过程中,抽奖逻辑肯定要占大部分时间,至少要执行一次生成随机数的操作吧,在这个过程中,还没写表,所以其他请求读取数据库显示自己还没抽奖能够走抽奖逻辑。我的想法是第一步执行后加一个行锁,第三步执行后再释放这个锁,防止在这个过程中再有请求读取数据。本人愚见,若有错漏,望指点

    2016-02-15 16:39:11 回复 0
    我是风
    我是风 的回复

    有道理!

    2016-10-20 16:18:02 回复 0
    请先登录注册
    lxm3388
    lxm3388 的回复

    简单点就加锁,虽然会损失点性能

    2016-02-16 16:23:49 回复 0
    请先登录注册
    Shadowhg
    Shadowhg 的回复

    用乐观锁控制写入mysql,同时写入redis。
    为了应对大量的 “新抽奖” ,用队列抗一下。
    查询记录首先从redis查询,redis没有再回源到mysql去查。
    mysql读写分离。
    另外简单的防刷还是要做的,比如用户、ip限制,验证码等等。
    恩就这样。

    2016-02-16 20:23:49 回复 1
    请先登录注册
  • 中国人大60周年纪念专题 2019-07-09
  • 柬埔寨留学生在华求学记:生活多彩乐享科技便利 2019-07-04
  • 中国军队:空军大飞机——战略空军的重要标志 2019-07-04
  • “飞越19国 往返3.5万公里 祖国接你回家”获第十二届人民企业社会责任奖年度案例奖 2019-07-03
  • 从唐老鸭到疯狂动物城:卡通毛皮七十年 2019-07-03
  • 北京市海淀区西三旗街拆除8500平方米违法建设 2019-07-02
  • 中欧班列让开放之路越走越宽 2019-07-02
  • 绵阳深山藏古寺 它缘起于一场惊天骗局 2019-07-02
  • 山钢集团日照钢铁精品基地项目 2019-06-30
  • 啥都来反对,有起码的是非么什么东西! 2019-06-30
  • 从严治党从严治吏不松劲不歇脚,是治理“四风”顽症的良方。 2019-06-30
  • 钱江晚报:高考命题有差错,能否增设“防火墙” 2019-06-28
  • 别让“屈原留下三天端午假”的段子再流传 2019-06-28
  • 三沙市委书记、市长肖杰做客人民网 2019-06-28
  • 险!年近八旬老人就医晕倒 赞!医生不顾腰伤抱起抢救(图) 2019-06-24
  • 热血传奇单职业 pp电子会员卡二维码 冒险丛林怎么玩 千斤顶或更好10手返水 重庆时时彩计划准不准 晓游棋牌梭哈外挂 排列五走势图表360 新大航海时代手游官网 2元中排列5500彩票网 美丽骷髅试玩 mg热血羽毛球免费旋转 维戈塞尔塔足球俱乐部 staderennes雷恩 广西快乐双彩开奖结果l 魔鬼宝藏投注 2019比特币现金今日