日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2025/3/15 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于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 ? ? ? 示例:把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

?

轉載于:https://www.cnblogs.com/shouke/p/10157756.html

總結

以上是生活随笔為你收集整理的Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。