redisは簡単な条件クエリー機能を実現する

3031 ワード

今日redisを勉強している間に、私を悩ませる問題に遭遇しました.sql文では、条件クエリーは簡単に実現されます.たとえば、次のようにします.
select * from books where id = 1
このSQL文は、テーブルbooksのidが1に等しい本のすべての情報を簡単に選択することができます.しかし、redisは非関係型データベースであり、「キー値=value」でデータをクエリーする方法はサポートされていません.では、類似の条件クエリーをどのように実現すればいいのでしょうか.
ログイン登録シーンでは,ユーザ登録時のユーザ名判断を実現する.まず,ユーザ情報はユーザ名とパスワードのみであると仮定する.
登録:
exports.handle_regist = function(username,password){
	client.incr('uid');
	client.get('uid',function(err,uid){
	//      ,username--id
		client.set('username:'+username,uid);
		client.hmset("user:"+uid,'username',username,'password',password,function(err){
			if(err){
				return 0;
			}
			else{
				return 1;
			}
		});
	});
};
このコードでは、ユーザのユーザ名とパスワードを格納する操作を実現しています.
client.incr('uid');
はuidという文字列タイプのキー値ペアを作成し、ユーザーが登録したデータが入るたびにuidを1から増やします.これにより、次のユーザーが登録したときに割り当てるべきuidがどれだけあるかを知ることができます.なぜuidを割り当てるのですか?後でhashタイプのキー値ペアを確立するために使用する必要があるので、後で話します.
client.get('uid',function(err,uid){...}
この行のコードは何ですか?明らかに、文字列タイプのkey=uidのvalueを選択するために使用し、valueを得た後、実際に登録したユーザーに一意のIDを割り当てることができる.
client.set('username:'+username,uid);
行のコードは重要で、ここでは「username:zhou=>1」タイプのキー値対インデックスを設定します.(「zhou」は伝わってきたユーザー名で、1はさっき手に入れたuidです).では、このキー値は何をしていますか?
これが条件インデックスを実現する鍵であり,ユーザ名とユーザidとの連絡を確立し,ユーザ名zhouのユーザのパスワードを選択する必要がある場合,まずこのキー値対インデックスにより,ユーザのuidを見つけ,このuidによりユーザ名暗号を得る.これで、考えがはっきりします.
client.hmset("user:"+uid,'username',username,'password',password,function(err){...}
行のコードの中で、私たちは本当のストレージユーザー名とパスワードです.「user:1=>{username='zhou',password='123'}」形式のキー値ペアが確立されていることがわかります.user:uidはキー名、username、passwordはキー値のフィールド、ユーザー情報はキー値のフィールド値です.これにより,ユーザ情報の格納を実現できる.
ログイン機能:
exports.handle_login = function(username,password,callback){
	client.get('username:'+username,function(err,uid){
		if(err){
			return callback(err);
		}
		else{
			client.hget('user:'+uid,'password',function(err,pass){
				if(err){
					var msg = 0;
					return callback(msg);
				}
				if(password == pass){
					var msg = 1;
					return callback(msg);
				}
				else{
					var msg = 2;
					return callback(msg);
				}
			});
		}
	});
};
client.get('username:'+username,function(err,uid){
まず、送信されたusernameを介して、キー値対「username:zhou=>uid」でuidを探し、uidがなければ登録されていないことを示し、ステータスコードを返します.
uidが見つかった場合、ユーザー名が登録されていることを示し、passwordを判断します.
client.hget('user:'+uid,'password',function(err,pass){
は、以前に得られたuidクエリによりユーザ情報キー値ペアを取得し、passwordを取得し、ユーザが入力したパスワードが一致しているか否かを判断することで、判断を完了することができる.
まとめ:以上の手順では、redisが条件クエリーを実現するには、idと他の属性との連絡セットを自分で確立する必要があることがわかります.たとえば、リレーショナル・データベースで、自動車時計car:carを作成します.id,color,price.location.colorがwhiteに等しいすべての自動車情報を調べる必要がある場合は、まずcarを構築する必要があります.idとcolorのつながりセット、color:color_value=>uidは,マッチングによりuidを得て自動車情報を検索する.この方法は少し面倒そうに見えますが、代わりに何か方法がありますか(luaスクリプトは何ですか?)