Redis用户登录场景

来源:互联网 发布:苹果免费打电话软件 编辑:程序博客网 时间:2024/05/16 19:22

Redis用户登录场景

转载自浅谈Redis数据库的键值设计

关系型数据库表设计

首先我们设计用户登录信息的关系型数据库表,将表简化为下面的几个字段

  • user_id PK
  • name
  • login_times
  • last_login
    每次登陆后,login_times增加一次, last_login更新为当前时间。

Redis设计

首先我们用两组String来存放用登录次数和最后登录时间

登录次数

#pythonimport redisrConn = redis.Redis(host='localhost', port=6379)pipe = rConn.pipeline()for x in xrange(5):    times = random.randint(0, 10)    pipe.set('user:%d:login_times'%x, times)pipe.execute()

这段生成5个String, key为user:id:login_times,其中id的值为0-4,value为0到10之间的随机数。

最后登录时间

#pythonimport redisimport randomimport timeif __name__ == '__main__':    rConn = redis.Redis(host='192.168.111.131', port=6379)    pipe = rConn.pipeline()    for x in xrange(5):        pipe.set('user:%d:last_login_times'%x, time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime()))    pipe.execute()

同上一段代码一样,生成5个keyuser:id:last_login_times, value为%Y-%m-%d %H:%M:%S格式的时间字符串。

ID查找用户名

import redisimport randomif __name__ == '__main__':    rConn = redis.Redis(host='192.168.111.131', port=6379)    pipe = rConn.pipeline()    for x in xrange(5):        pipe.set('user:%d:name'%x, 'name_%d'%x)    pipe.execute()

生成5个keyuser:id:name, value为name_id的名字。

用户名查找ID

用户登录,我们需要用户输入用户名,根据用户查找相应id,然后根据id查找相应的登录信息。所以,我们还需要一个name:id的映射。
import redis
import random

if __name__ == '__main__':    rConn = redis.Redis(host='192.168.111.131', port=6379)    pipe = rConn.pipeline()    keys = []    for x in xrange(5):        name = 'name_%s'%x        pipe.set('user:%s:id'%name, x)        keys.append('user:%s:id'%name)    pipe.execute()

这样用户登录信息准备工作完成。下面模拟用户登录操作。

Created with Raphaël 2.1.0Start 通过用户名查找ID KEY为user:name_x:id通过ID查找登录次数KEY为user:id:login_times登录次数加1修改最后登录时间End
#pythonimport redisimport randomimport time if __name__ == '__main__':    rConn = redis.Redis(host='192.168.111.131', port=6379)    id = rConn.get('user:%s:id'%(username))     loginTimesKey = 'user:%d:login_times'%(id)    #登录次数+1    rConn.incr(loginTimesKey)    #修改最后登录时间    rConn.set(lastLogTimeKey, time.strftime('%Y-%m-%d %H:%M:%s'), time.gmtime())

假设系统中查看最新登录的N个用户的需求,我们可以使用Redis的List来实现这个功能。

#python#添加当前用户rConn.lpush('user:lastlogin', uid)#保持当前列表只要N个rConn.ltrime('user:lastlogin', 0, N-1)#获取最新登录的N个用户last_login_lst = rConn.lrange('user:lastlogin', 0, N -1)

另外Redis中的ZSET非常适用于类似统计登录次数最多用户的需求。

#pythonrConn.zadd('user:logintimes', 5, uid1)rConn.zadd('user:logintimes', 10, uid2)rConn.zadd('user:logintimes', 3, uid3)

当用户登录时,我们需要对这个sorted set中相应的menber自增1。

#pythonrConn.zincr('user:logintimes', 1, uid1)

获取登录次数最多的N个用户

#pythonrConn.zrevrange('user:logintimes', 0, N-1)

获取登录次数最多的N个用户,及登录次数

#pythonrConn.zrevrange('user:logintimes', 0, N-1, withscores=True)
0 0
原创粉丝点击