今天在学习redis的时候,遇到了一个让我很纠结的问题。在sql语句中,条件查询是很简单实现的,比如:
这条SQL语句就能够很简单的挑选出来表books里面id等于1的书本的全部信息。但是,redis是非关系型数据库,并不支持这种通过“键值=value”查询数据的方式,那我们究竟该怎样实现类似的条件查询呢?
在登陆注册场景中,我们这样实现用户登陆时候的用户名判断。我们先假定用户信息只有用户名和密码。
注册:
这段代码中,我们实现的是存储用户的用户名和密码的操作。
创建 键名为uid的字符串类型键值对,每次有用户注册的数据传入时候,我们都会将uid自增1。这样,其实我们就能够知道下一位用户注册时候我们应该给他分配的uid是多少了。那为什么要分配uid呢?是为了在后面建立hash类型的键值对时候需要用到,一会再说。
这行代码是干嘛的呢?很明显,我们用来挑选出字符串类型的并且key=uid的value,得到value之后,实际上我们就能够为注册的用户分配唯一的ID.
这行代码很关键,我们在这里设置了一个“username:zhou=>1”类型的键值对索引。(‘zhou’是传过来的用户名,1是刚才得到的uid)。那么这个键值对又是干嘛的?
这个就是实现条件索引的关键了,我们为用户名和用户id建立联系,当需要挑选出用户名为zhou的用户的密码的时候,我们首先通过这个键值对索引,找到该用户的uid,再通过这个uid得到用户名密码。这样,思路就清晰了。
这行代码中,我们才是真正的储存用户名和密码。可以看到,我们建立了“user:1=>{username='zhou',password='123'}”形式的键值对,其中user:uid是键名,username,password是键值中的字段,用户信息是键值中字段值。这样我们就能实现用户信息的储存了。
登陆功能:
我们首先通过传过来的username,在键值对“username:zhou=>uid”中寻找uid,如果没有该uid,说明没有注册,返回一个状态码;
如果找到uid,说明该用户名已经注册过,接着判断password。
通过之前得到的uid查询用户信息键值对,得到password,判断用户输入的密码是否匹配,这样就能完成判断。
总结:通过以上过程不难发现,redis实现条件查询其实就是需要我们自己建立id与其他属性的联系集。比如在关系型数据库里面,建立一个汽车表car:car_id,color,price.location.当我们需要查询color等于white的所有汽车信息的时候,我们首先需要建立一个car_id和color之间的联系集,color:color_value=>uid,通过匹配得到uid再去查找汽车信息。这个方法看起来有点麻烦,但还是不知道有什么方法能替代