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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

基于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

 

 

 

示例:把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)

 

 

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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
10天前
|
缓存 NoSQL Java
Redis应用—8.相关的缓存框架
本文介绍了Ehcache和Guava Cache两个缓存框架及其使用方法,以及如何自定义缓存。主要内容包括:Ehcache缓存框架、Guava Cache缓存框架、自定义缓存。总结:Ehcache适合用作本地缓存或与Redis结合使用,Guava Cache则提供了更灵活的缓存管理和更高的并发性能。自定义缓存可以根据具体需求选择不同的数据结构和引用类型来实现特定的缓存策略。
Redis应用—8.相关的缓存框架
|
4天前
|
NoSQL Java Redis
Redis Pipeline介绍 ---- 提高操作Redis数据库的执行效率。
Redis Pipeline是提高Redis执行效率的重要技术,通过批量发送命令,显著减少了网络往返次数,提高了系统的吞吐量和性能。在实际应用中,合理使用Pipeline可以有效优化Redis的性能,特别是在需要批量操作的场景下。本文通过Python和Java的示例代码展示了如何实现和使用Redis Pipeline,为开发者提供了具体的操作指南。
32 16
|
6天前
|
存储 缓存 NoSQL
Redis缓存设计与性能优化
Redis缓存设计与性能优化涵盖缓存穿透、击穿、雪崩及热点key重建等问题。针对缓存穿透,可采用缓存空对象或布隆过滤器;缓存击穿通过随机设置过期时间避免集中失效;缓存雪崩需确保高可用性并使用限流熔断组件;热点key重建利用互斥锁防止大量线程同时操作。此外,开发规范强调键值设计、命令使用和客户端配置优化,如避免bigkey、合理使用批量操作和连接池管理。系统内核参数如vm.swappiness、vm.overcommit_memory及文件句柄数的优化也至关重要。慢查询日志帮助监控性能瓶颈。
35 9
|
1天前
|
消息中间件 缓存 NoSQL
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
|
24天前
|
缓存 NoSQL Redis
Redis原理—2.单机数据库的实现
本文概述了Redis数据库的核心结构和操作机制。
Redis原理—2.单机数据库的实现
|
6天前
|
SQL 关系型数据库 MySQL
MySQL生产环境迁移至YashanDB数据库深度体验
这篇文章是作者将 MySQL 生产环境迁移至 YashanDB 数据库的深度体验。介绍了 YashanDB 迁移平台 YMP 的产品相关信息、安装步骤、迁移中遇到的各种兼容问题及解决方案,最后总结了迁移体验,包括工具部署和操作特点,也指出功能有优化空间及暂不支持的部分,期待其不断优化。
|
1月前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
138 25
|
18天前
|
关系型数据库 数据库 数据安全/隐私保护
云数据库实战:基于阿里云RDS的Python应用开发与优化
在互联网时代,数据驱动的应用已成为企业竞争力的核心。阿里云RDS为开发者提供稳定高效的数据库托管服务,支持多种数据库引擎,具备自动化管理、高可用性和弹性扩展等优势。本文通过Python应用案例,从零开始搭建基于阿里云RDS的数据库应用,详细演示连接、CRUD操作及性能优化与安全管理实践,帮助读者快速上手并提升应用性能。
|
18天前
|
监控 关系型数据库 MySQL
云数据库:从零到一,构建高可用MySQL集群
在互联网时代,数据成为企业核心资产,传统单机数据库难以满足高并发、高可用需求。云数据库通过弹性扩展、分布式架构等优势解决了这些问题,但也面临数据安全和性能优化挑战。本文介绍了如何从零开始构建高可用MySQL集群,涵盖选择云服务提供商、创建实例、配置高可用架构、数据备份恢复及性能优化等内容,并通过电商平台案例展示了具体应用。
|
25天前
|
SQL 关系型数据库 MySQL
数据库数据恢复——MySQL简介和数据恢复案例
MySQL数据库数据恢复环境&故障: 本地服务器,安装的windows server操作系统。 操作系统上部署MySQL单实例,引擎类型为innodb,表空间类型为独立表空间。该MySQL数据库没有备份,未开启binlog。 人为误操作,在用Delete命令删除数据时未添加where子句进行筛选导致全表数据被删除,删除后未对该表进行任何操作。

热门文章

最新文章