您现在的位置是:主页 > 数据库技术 > 数据库技术

Redis数据库常见的键值设计有哪些

IDCBT2022-01-06服务器技术人已围观

简介这篇文章将为大家详细讲解有关Redis数据库常见的键值设计有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 用户登录系统 记录用户登

这篇文章将为大家详细讲解有关Redis数据库常见的键值设计有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

  用户登录系统

  记录用户登录信息的一个系统,我们简化业务后只留下一张表。

  关系型数据库的设计

  mysql>select*fromlogin;

  +---------+----------------+-------------+---------------------+

  |user_id|name|login_times|last_login_time|

  +---------+----------------+-------------+---------------------+

  |1|kenthompson|5|2011-01-0100:00:00|

  |2|dennisritchie|1|2011-02-0100:00:00|

  |3|JoeArmstrong|2|2011-03-0100:00:00|

  +---------+----------------+-------------+---------------------+

  user_id表的主键,name表示用户名,login_times表示该用户的登录次数,每次用户登录后,login_times会自增,而last_login_time更新为当前时间。

  REDIS的设计

  关系型数据转化为KV数据库,我的方法如下:

  key表名:主键值:列名

  value列值

  一般使用冒号做分割符,这是不成文的规矩。比如在php-adminforredis系统里,就是默认以冒号分割,于是user:1user:2等key会分成一组。于是以上的关系数据转化成kv数据后记录如下:

  Setlogin:1:login_times5

  Setlogin:2:login_times1

  Setlogin:3:login_times2

  Setlogin:1:last_login_time2011-1-1

  Setlogin:2:last_login_time2011-2-1

  Setlogin:3:last_login_time2011-3-1

  setlogin:1:name”kenthompson“

  setlogin:2:name“dennisritchie”

  setlogin:3:name”JoeArmstrong“

  这样在已知主键的情况下,通过get、set就可以获得或者修改用户的登录次数和最后登录时间和姓名。

  一般用户是无法知道自己的id的,只知道自己的用户名,所以还必须有一个从name到id的映射关系,这里的设计与上面的有所不同。

  set"login:kenthompson:id"1

  set"login:dennisritchie:id"2

  set"login:JoeArmstrong:id"3

  这样每次用户登录的时候业务逻辑如下(python版),r是redis对象,name是已经获知的用户名。

  #获得用户的id

  uid=r.get("login:%s:id"%name)

  #自增用户的登录次数

  ret=r.incr("login:%s:login_times"%uid)

  #更新该用户的最后登录时间

  ret=r.set("login:%s:last_login_time"%uid,datetime.datetime.now())

  如果需求仅仅是已知id,更新或者获取某个用户的最后登录时间,登录次数,关系型和kv数据库无啥区别。一个通过btreepk,一个通过hash,效果都很好。

  假设有如下需求,查找最近登录的N个用户。开发人员看看,还是比较简单的,一个sql搞定。

标签:

很赞哦! ()

本栏推荐