当前位置:   article > 正文

使用python 结合mysql和redis进行缓存设计_python mysql 怎么做缓存表

python mysql 怎么做缓存表

基于Python操作Redis

1、 创建示例数据库表
  1. CREATE TABLE tb_signin_rank(
  2. id INT,
  3. user_name VARCHAR(10) COMMENT '用户名',
  4. signin_num INT COMMENT '签到次数',
  5. signin_time DATETIME COMMENT '签到时间',
  6. gold_coin INT COMMENT '金币'
  7. );
初始化数据
  1. INSERT INTO tb_signin_rank
  2. VALUES(1, 'shouke', 0, NULL, 0),
  3. (2, 'chuangke', 0, NULL, 0),
  4. (3, 'ishouke', 0, NULL, 0),
  5. (4, 'keshou', 0, NULL, 0),
  6. (5, 'shouke', 0, NULL, 0);

 redis缓存键值设计
key  value
表名:主键值:列名   列值
或者如下,通过为不同列之间建立较为紧密的关联
key  value
表名:主键值:列值1:列名2   列值2

示例:把id1的人的签到次数(假设为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处理
要求强一致实时性的读请求,由数据库处理

案例
  1. if __name__=="__main__":
  2. # print ("yes")
  3. # c = CrazyRedis()
  4. # c.lpush("b","v")
  5. # print ("yes")
  6. #
  7. pool = redis.ConnectionPool(host=host, port=6379, db=0)
  8. r = redis.Redis(connection_pool=pool)
  9. try:
  10. dbconn = pymysql.connect(
  11. host="127.0.0.1",
  12. port=3306,
  13. user="root",
  14. password="123456",
  15. database='ooxx',
  16. )
  17. except Exception as e:
  18. print(u'初始化数据连接失败:%s' % e)
  19. sys.exit()
  20. # 执行签到
  21. try:
  22. print("id=====%s" % id)
  23. db_cursor = dbconn.cursor()
  24. print("id=====%s" % id)
  25. for id in range(1, 6):
  26. db_cursor.execute(
  27. 'UPDATE tb_signin_rank SET signin_num = signin_num + 1, signin_time = NOW(), gold_coin = gold_coin + (1 + RAND()*9) WHERE id = %s',
  28. (id,))
  29. db_cursor.execute('commit')
  30. # 更新缓存
  31. print("id=====%s"%id)
  32. r.zincrby("tb_signin_rank:id:signin_num", id, 1)
  33. except Exception as e:
  34. print(u'执行数据库更新操作失败:%s' % e)
  35. db_cursor.execute('rollback')
  36. db_cursor.close()
  37. exit()
  38. # 展示用户签到次数
  39. for id in range(1, 6):
  40. result = r.zscore('tb_signin_rank:id:signin_num', id)
  41. if not result: # 不存在缓存,从数据库读取
  42. print(u'----从数据库读取用户签到次数----')
  43. try:
  44. db_cursor = dbconn.cursor()
  45. db_cursor.execute('SELECT signin_num FROM tb_signin_rank WHERE id = %s', (id,))
  46. result = db_cursor.fetchone()[0]
  47. # 更新到缓存
  48. r.zadd('tb_signin_rank:id:signin_num', id, result)
  49. except Exception as e:
  50. print(u'执行数据库查询操作失败:%s' % e)
  51. db_cursor.close()
  52. else: # 存在缓存,从缓存读取
  53. print(u'----从缓存读取用户签到次数----')
  54. result = int(result)
  55. print(u'sigin_num of user[id=%s]: %s' % (id, result))
  56. # 展示签到排行榜
  57. result = r.zrevrange('tb_signin_rank:id:signin_num', 0, 10)
  58. print(u'签到排行榜:')
  59. print(result)
结果打印:
  1. ----从缓存读取用户签到次数----
  2. sigin_num of user[id=1]: 1
  3. ----从缓存读取用户签到次数----
  4. sigin_num of user[id=2]: 1
  5. ----从缓存读取用户签到次数----
  6. sigin_num of user[id=3]: 1
  7. ----从缓存读取用户签到次数----
  8. sigin_num of user[id=4]: 1
  9. ----从缓存读取用户签到次数----
  10. sigin_num of user[id=5]: 18
  11. 签到排行榜:
  12. ['1', '2', '3', '4', '5']

参考:http://blog.sina.com.cn/s/blog_13cc013b50102wb5w.html
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/670275
推荐阅读
相关标签
  

闽ICP备14008679号