转载自浅谈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
格式的时间字符串。
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查找相应的登录信息。所以,我们还需要一个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()
这样用户登录信息准备工作完成。下面模拟用户登录操作。
#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)