数据重复添加&锁

需求:

H5小游戏使用微信公众号进行网页授权登录,同一个用户的openid只允许有一条记录

问题描述

  • 查询数据库是此openid否存在
  • 不存在则去微信获取用户信息
  • 如果获取成功,则直接新建一个用户

按照这个样的流程,当同一个用户并发的请求时,由于从查询到新建,中间间隔了去微信服务器查询的时间,导致新建的那个时刻,数据库有可能已经创建了一条数据。

解决方案

  • 查询数据库是此openid否存在
  • 如果不存在,则直接新建一个用户, 并使用memcache加锁, memcache加锁的代码如下
$memcacke_key = 'new_user_oid_'.$openid;
if(!$user_info=User::model()->find('openid=:t_o', array(':t_o', array(':t_o'=>$openid))) {
  if(!Yii::app()->memcache->get($memcacke_key)) {
    Yii::app()->memcache->set($memcacke_key, 1, 60);
    $user_info = new User;
    ...
    $user_info->save();    //保存进数据库
  }
}
  • 不存在则去微信获取用户信息, 并更新用户的数据(昵称、头像等)

推荐阅读更多精彩内容