赞
踩
1、 创建示例数据库表
- CREATE TABLE tb_signin_rank(
- id INT,
- user_name VARCHAR(10) COMMENT '用户名',
- signin_num INT COMMENT '签到次数',
- signin_time DATETIME COMMENT '签到时间',
- gold_coin INT COMMENT '金币'
- );
初始化数据
- INSERT INTO tb_signin_rank
- VALUES(1, 'shouke', 0, NULL, 0),
- (2, 'chuangke', 0, NULL, 0),
- (3, 'ishouke', 0, NULL, 0),
- (4, 'keshou', 0, NULL, 0),
- (5, 'shouke', 0, NULL, 0);
redis缓存键值设计
key value
表名:主键值:列名 列值
或者如下,通过为不同列之间建立较为紧密的关联
key value
表名:主键值:列值1:列名2 列值2
示例:把id为1的人的签到次数(假设为5)存储到redis中则可如下操作:
set('tb_signin_rank:1:signin_num', 5)
这样做的好处是,类似数据库一样,通过主键便可获取其它值。
示例:把id和用户名关联
set('tb_signin_rank:shouke:id', 1)
这样,通过用户名就可以查询出关联的id了:uid = r.get("tb_signin_rank:%s:id" % username)
redis关联数据库的数据处理
不要求强一致实时性的读请求,都由redis处理
要求强一致实时性的读请求,由数据库处理
案例
- if __name__=="__main__":
- # print ("yes")
- # c = CrazyRedis()
- # c.lpush("b","v")
- # print ("yes")
- #
- pool = redis.ConnectionPool(host=host, port=6379, db=0)
- r = redis.Redis(connection_pool=pool)
- try:
- dbconn = pymysql.connect(
- host="127.0.0.1",
- port=3306,
- user="root",
- password="123456",
- database='ooxx',
- )
- except Exception as e:
- print(u'初始化数据连接失败:%s' % e)
- sys.exit()
-
- # 执行签到
- try:
- print("id=====%s" % id)
- db_cursor = dbconn.cursor()
- print("id=====%s" % id)
- for id in range(1, 6):
- db_cursor.execute(
- 'UPDATE tb_signin_rank SET signin_num = signin_num + 1, signin_time = NOW(), gold_coin = gold_coin + (1 + RAND()*9) WHERE id = %s',
- (id,))
- db_cursor.execute('commit')
- # 更新缓存
- print("id=====%s"%id)
- r.zincrby("tb_signin_rank:id:signin_num", id, 1)
- except Exception as e:
- print(u'执行数据库更新操作失败:%s' % e)
- db_cursor.execute('rollback')
- db_cursor.close()
- exit()
-
- # 展示用户签到次数
- for id in range(1, 6):
- result = r.zscore('tb_signin_rank:id:signin_num', id)
- if not result: # 不存在缓存,从数据库读取
- print(u'----从数据库读取用户签到次数----')
- try:
- db_cursor = dbconn.cursor()
- db_cursor.execute('SELECT signin_num FROM tb_signin_rank WHERE id = %s', (id,))
- result = db_cursor.fetchone()[0]
- # 更新到缓存
- r.zadd('tb_signin_rank:id:signin_num', id, result)
- except Exception as e:
- print(u'执行数据库查询操作失败:%s' % e)
- db_cursor.close()
- else: # 存在缓存,从缓存读取
- print(u'----从缓存读取用户签到次数----')
- result = int(result)
-
- print(u'sigin_num of user[id=%s]: %s' % (id, result))
-
-
- # 展示签到排行榜
- result = r.zrevrange('tb_signin_rank:id:signin_num', 0, 10)
- print(u'签到排行榜:')
- print(result)
结果打印:
- ----从缓存读取用户签到次数----
- sigin_num of user[id=1]: 1
- ----从缓存读取用户签到次数----
- sigin_num of user[id=2]: 1
- ----从缓存读取用户签到次数----
- sigin_num of user[id=3]: 1
- ----从缓存读取用户签到次数----
- sigin_num of user[id=4]: 1
- ----从缓存读取用户签到次数----
- sigin_num of user[id=5]: 18
- 签到排行榜:
- ['1', '2', '3', '4', '5']
参考:http://blog.sina.com.cn/s/blog_13cc013b50102wb5w.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。