Redis用户登录场景

Redis用户登录场景

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

关系型数据库表设计

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

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

Redis设计

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

登录次数
#python
import redis
rConn = 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之间的随机数。

最后登录时间
#python
import redis
import random
import time

if __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 redis
import random

if __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.0 Start 通过用户名查找ID KEY为user:name_x:id 通过ID查找登录次数 KEY为user:id:login_times 登录次数加1 修改最后登录时间 End
#python
import redis
import random
import 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非常适用于类似统计登录次数最多用户的需求。

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

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

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

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

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

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

#python
rConn.zrevrange('user:logintimes', 0, N-1, withscores=True)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值