专栏首页授客的专栏Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3.3.2 基于Python操作Redis 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); 2、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) 3、redis关联数据库的数据处理 不要求强一致实时性的读请求,都由redis处理 要求强一致实时性的读请求,由数据库处理 通常包含以下两种处理模式: 模式1: 如图,先判断是否存在缓存(通常是根据key),如果存在则从缓存读取,否则从数据库读取并更新缓存。 ? 适用场景:对数据实时性要求不高,更新比较不频繁,比如签到排行榜 模式2: 如下图,先写入redis然后,利用守护进程等方式,定时写入到数据库 模式3: 如下图,先写入数据库,然后再更新到缓存 ? 适用场景:数据量较大,更新较为频繁 说明: 模式2和模式3的区别在于,前者把redis当作数据库用,通过写入redis后马上返回程序,然后定时把数据写入数据库,这也大大提高了访问速度。这种方式不足的是,这种对redis的可靠性依赖性太强 4、案例 ./dbconfig.conf配置 [TESTDB] host = 192.168.1.103 port = 3306 user = testacc passwd = test1234 db = testdb charset = utf8 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'shouke' import configparser import sys import mysql.connector import redis if __name__ == '__main__': pool = redis.ConnectionPool(host='192.168.1.103', port=6379, db=0) r = redis.Redis(connection_pool=pool) # r.expire('tb_signin_rank:id:signin_num', 20) config = configparser.ConfigParser() # 从配置文件中读取数据库服务器IP、域名,端口 config.read('./dbconfig.conf') host = config['TESTDB']['host'] port = config['TESTDB']['port'] user = config['TESTDB']['user'] passwd = config['TESTDB']['passwd'] db_name = config['TESTDB']['db'] charset = config['TESTDB']['charset'] try: dbconn = mysql.connector.connect(host=host, port=port, user=user, password=passwd, database=db_name, charset=charset) except Exception as e: print('初始化数据连接失败:%s' % e) sys.exit() # 执行签到 try: db_cursor = dbconn.cursor() 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') # 更新缓存 r.zincrby("tb_signin_rank:id:signin_num", id, 1) except Exception as e: print('执行数据库更新操作失败:%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('----从数据库读取用户签到次数----') 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('执行数据库查询操作失败:%s' % e) db_cursor.close() else: # 存在缓存,从缓存读取 print('----从缓存读取用户签到次数----') result = int(result) print('sigin_num of user[id=%s]: %s' % (id, result)) # 展示签到排行榜 result = r.zrevrange('tb_signin_rank:id:signin_num', 0, 10) print('签到排行榜:', result) 参考连接: http://www.cnblogs.com/qq78292959/archive/2013/02/05/2892735.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python yield关键词使用总结

    简单来说,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 gene...

    授客
  • Fiddler 使用fiddler无法抓取苹果手机https请求问题解决方案

    手机浏览器访问代理主机监听端口(例中为:http://192.168.0.104:8888,其中192.168.0.104为fiddler所在主机地址,8888...

    授客
  • Easyui 修改jquery validatebox为英文校验提示为中文提示

    授客
  • 07 Confluent_Kafka权威指南 第七章: 构建数据管道

    当人们讨论使用apache kafka构建数据管道时,他们通常会应用如下几个示例,第一个就是构建一个数据管道,Apache Kafka是其中的终点。丽日,从ka...

    冬天里的懒猫
  • 大疆汪滔:深圳成就了我们,这里宽容失败,鼓励创新

    我常常想,这一群初出茅庐的年轻人,不用去阿谀奉承、投机取巧,就可以在踏实做事的埋头苦干当中,达到创业之巅,这样的故事恐怕只有深圳才可以实现。 ——汪滔,2016...

    机器人网
  • JIT中的LogCompilation

    我们知道在JVM中为了加快编译速度,引入了JIT即时编译的功能。那么JIT什么时候开始编译的,又是怎么编译的,作为一个高傲的程序员,有没有办法去探究JIT编译的...

    程序那些事
  • 搭建 karma + jasmine 测试环境

    在前端开发的过程中,我们会写很多的功能函数,这样就会涉及到对这些功能函数进行单元测试,而karma就是一个很好用的可以在浏览器环境中进行测试的集成工具。

    liuxuan
  • 是风口,还是封口?

    2018年7月拼多多在美国纳斯达克敲钟上市,短短三年时间,拼多多汇聚了三亿多用户,过百万卖家,建立起异类的、“拼”的线上电商生态。如此红利让很多企业家投资人纷纷...

    机器思维研究院
  • Maven项目遇到的BUG汇总

    Maven使用的过程中,可能会遇到各种各样的问题。 下面介绍项目中遇到的两个BUG.

    白凡
  • 移动端是时候考虑抛弃jQuery了?

    jQuery确实非常有用,它的初衷就是为诸多浏览器提供统一的接口,避免书写各种条件语句判断当前环境 移动端已经被类似 Safari 和 Chrome 的 web...

    dys

扫码关注云+社区

领取腾讯云代金券