關於我
一個有思想的程序猿,終身學習實踐者,目前在一個創業團隊任team lead,技術棧涉及Android、Python、Java和Go,這個也是咱們團隊的主要技術棧。
Github:github.com/hylinux1024
微信公衆號:終身開發者(angrycode)linux
幾乎如今全部應用都會用到緩存技術,而在服務器端redis
是不少實現緩存的首選技術。git
對於咱們這個應用也是須要使用緩存技術提升接口訪問速度。github
首先安裝redis
,並啓動redis
服務。redis
下載並編譯安裝sql
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar xzf redis-5.0.5.tar.gz
cd redis-5.0.5
make
複製代碼
啓動服務數據庫
src/redis-server
複製代碼
使用redis
命令行客戶端鏈接測試json
src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
複製代碼
建議詳細的配置能夠參閱相關官方文檔。本文的重點仍是關注在項目中的使用。flask
安裝緩存
pip install redis
複製代碼
(固然,你也可使用Flask-Cache
這個插件,使用起來也挺方便,不過本文延續以前的一些歷史代碼,就是直接使用redis
這個庫)bash
而後對redis
作了一個簡單的封裝,分別是建立實例,設置緩存和獲取緩存共三個靜態方法。
import redis
import json
import datetime
# 建立鏈接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
class Redis:
@staticmethod
def connect(db=0):
"""默認使用0號庫"""
r = redis.Redis(connection_pool=pool, db=db)
return r
# 將內存數據二進制經過序列號轉爲文本流,再存入redis
@staticmethod
def set(r, key: str, data, ex=None):
r.set(key, json.dumps(data, cls=CJsonEncoder), ex=ex)
# 將文本流從redis中讀取並反序列化,返回
@staticmethod
def get(r, key: str):
data = r.get(key)
if data is None:
return None
return json.loads(data)
複製代碼
在須要使用緩存的模塊中經過如下方式進行獲取redis
實例
r_cache = redis_helper.Redis.connect(db=5)
複製代碼
因爲我本機中還有其它的服務在開發,因此我選擇5號庫做爲緩存,避免與其它服務發生衝突。
前面幾講對模型中的關係在SQLAlchemy
中的表示沒有詳細的說明,今天來拆解一下。
咱們以用戶表(UserInfo
)與受權表(UserAuth
)進行說明。
class UserInfo(db.Model):
"""用戶基本信息"""
__tablename__ = 'user_info'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
email = db.Column(db.String(64)) # email
nickname = db.Column(db.String(64))
phone = db.Column(db.String(16))
gender = db.Column(db.Integer) # 1男2女0未知
...
class UserAuth(db.Model):
"""受權登陸表"""
__tablename__ = 'user_auth'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
user_id = db.Column(db.Integer, db.ForeignKey('user_info.id'))
user_basic = db.relationship(UserInfo, backref=db.backref('user_auth', uselist=False))
...
複製代碼
UserInfo
與UserAuth
是一對一的關係。即一個用戶對應一個受權信息,在SQLAlchemy
中表示關係是使用db.relationship()
接口
在UserAuth
中定義外鍵user_id
時須要指定db.ForeignKey('user_info.id'))
參數,說明是關聯的是user_info
表中的id
字段。經過外鍵關聯了這兩張表,但在實際的開發使用中,咱們但願在查詢到UserAuth
實例的時候,但願可以直接就可以獲得對應的用戶信息UserInfo
的實例,這時候就能夠用db.relationship()
接口。在UserAuth
就指定了這個關係
user_basic = db.relationship(UserInfo, backref=db.backref('user_auth', uselist=False))
複製代碼
說明在UserAuth
的實體中定義了一個user_basic
的字段,當查詢到UserAuth
實例時,能夠直接獲得UserInfo
的信息,而不須要程序猿再去經過外鍵user_id
去數據庫中查詢用戶信息。
db.relationship()
中的第一個參數表示要關聯的哪張表,能夠傳類名或表名稱的字符串;第二個參數backref
的意思是在UserInfo
中也定義一個user_auth
的屬性,方便查詢到用戶信息時,能夠經過這個屬性獲得對應的受權信息。uselist=False
的意思是user_auth
與user_info
是一對一的關係,若是是一對多的關係,這裏uselist=True
,不傳參數時默認uselist
是True
。
本文對前面幾講中的涉及到的模型定義中關係的表示和緩存的使用作一個補充說明。