需求:
H5小游戲使用微信公眾號進行網(wǎng)頁授權(quán)登錄,同一個用戶的openid只允許有一條記錄
問題描述
- 查詢數(shù)據(jù)庫是此openid否存在
- 不存在則去微信獲取用戶信息
- 如果獲取成功,則直接新建一個用戶
按照這個樣的流程,當同一個用戶并發(fā)的請求時,由于從查詢到新建,中間間隔了去微信服務(wù)器查詢的時間,導(dǎo)致新建的那個時刻,數(shù)據(jù)庫有可能已經(jīng)創(chuàng)建了一條數(shù)據(jù)。
解決方案
- 查詢數(shù)據(jù)庫是此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(); //保存進數(shù)據(jù)庫
}
}
- 不存在則去微信獲取用戶信息, 并更新用戶的數(shù)據(jù)(昵稱、頭像等)