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

by:授客  QQ:1033553122

测试环境

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

转载于:https://www.cnblogs.com/shouke/p/10157756.html

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

  1. python文本框与数据库的关联_Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理...

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3. ...

  2. python基于PHP+MySQL的健身俱乐部网站的设计与实现

    随着我国国民经济的发展,人们越来越重视健身的重要性,很多时候人们在工作之余会到健身房进行体育锻炼从而提高自己的身体素质,本系统就是这样的一个健身房管理系统.系统结合当前企业的实际,采用PHP技术以My ...

  3. python基于php+MySQL的个人网站的设计与实现

    随着时代的发展,人们希望通过越来越多的渠道展示自己才华和抒发自己的感情.网络无疑是一个很好的渠道.他可以在一个虚拟的大环境下畅所欲言的抒发自己的情感,同时可以给那些陌生人来展示自己更加完美的一面,从而 ...

  4. python基于PHP+MySQL的美食网站的设计与实现

    自古以来就有,唯有美食不可辜负的美传.由此可见,人们对美食的终极追求从未止步.对一些美食爱好者,也是一直在不停的研究和分享美食.对这些美食爱好者来说,他们也一直在寻找一个美食交流的平台.为了让更多的人 ...

  5. python基于PHP+MySQL婚介交友网站的设计与开发

    在过去30年,结婚都是父母或者媒人怎么说我们就怎么做.随着社会的开放,人们的思想的得到了进步,更多选择的是自由恋爱.而且现在这个社会,读书人愈来愈多,文化水平愈来愈高,人们除了选择物质上的伴侣外,更多 ...

  6. Redis设计与实现 -- 浅谈Redis持久化

    在讲解Redis持久化相关的话题之前,我们需要了解的是Redis为什么这么快?也就是Redis的IO模型 – 多路复用. 我们一句话概括为什么Redis这么快: Redis是单线程的,使用多路复用的I ...

  7. 浅谈HTTP缓存以及后端,前端如何具体实现HTTP缓存

    <浅谈HTPP缓存>原版: https://juejin.im/post/5bdeabbbe51d4505466cd741?utm_source=gold_browser_extensio ...

  8. 浅谈无缓存I/O操作和标准I/O文件操作区别 (转载)

    首先,先稍微了解系统调用的概念: 系统调用,英文名system call,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的的内核函数完 ...

  9. 浅谈强缓存和协商缓存

    浅谈强缓存与协商缓存 最近面试被问到很多次关于http缓存的问题,在此做下笔记以此记录.话不多说,先来看张图来直观感受下http缓存的整体流程. 强缓存 当浏览器向服务器请求资源时,首先检查有无缓存. ...

最新文章

  1. windows下 nginx安装 使用
  2. 创建型模式之Prototype
  3. 性能远超AtomicLong,LongAdder原理完全解读
  4. linux网络编程之posix 线程(四):posix 条件变量与互斥锁 示例生产者--消费者问题
  5. windows 下的文件对比工具
  6. Java Web学习总结(27)——JavaEE中Web服务器、Web容器、Application服务器区别及联系
  7. Visual Studio开发工具(5):VS2010 精美壁纸,总有一款适合你!
  8. 互联网金融网站走马观花
  9. Soft-Masked BERT 一种新的中文纠错模型
  10. XCode 4创建ipa文件及提交应用程序
  11. 如何在不卸载的情况下暂时禁用Tuxera NTFS
  12. vue根据拼音选择城市better-scroll
  13. 虚拟机安装Mac OS系统
  14. 温度计数值转换C语言,f和c温度换算(体温计f怎样转换c)
  15. 3d Max人物动画学习笔记(一) 骨骼创建
  16. it guy流利说_Guy RoutledgeCSS预处理器和字体末端开发
  17. 5G NR 基础原理与关键技术
  18. html知识点复习整理
  19. windows下如何查看端口列表以及如何开放指定端口
  20. 又看到一种新的日志转贴方法

热门文章

  1. Java 7之基础 - 强引用、弱引用、软引用、虚引用
  2. Perl中use、require的用法和区别
  3. Servlet应用之细节
  4. [转]web.xml 中的listener、 filter、servlet 加载顺序及其详解
  5. AI and logistics Patent
  6. C++构造函数调用虚函数的后果
  7. ETC2 区别于ETC的重要点
  8. leetcode203.移除链表元素
  9. Tomcat源码分析 - 1
  10. 2017年上半年最受关注度的几大免费OA品牌