python web(bottle框架)知行合一之-簡單知識付費平臺-”全椖∶觯“實踐(12)---緩存處理-分頁獲取課程列表信息接口

python web(bottle框架)知行合一之-簡單知識付費平臺-”全椞憧В“實踐(12)---緩存處理-分頁獲取課程列表信息接口

PS:筆記只是為了更好表達我怎么語言表述,有些時候可能難免廢話一推付鹿!
因知識有限, 如有錯誤, 歡迎指正比藻!

每日細語:傳說中,癡心的眼淚會傾城~

續(xù)言

這里為什么需要使用到緩存倘屹?關(guān)于緩存的重要性其實對應用層系統(tǒng)設(shè)計來說是必不可少的,因為頻繁數(shù)據(jù)庫鏈接和打開對數(shù)據(jù)庫系統(tǒng)來說壓力還是有的~所以我們在應用層中盡量還是需要引入緩存相關(guān)機制慢叨,避免頻繁進行數(shù)據(jù)庫操作處理纽匙。

那緩存其實又分內(nèi)存的緩存和其他redis或其他緩存,那我們這里就有必要封裝處理一下相關(guān)緩存操作拍谐,這里我自己使用的redis來進行處理緩存烛缔。
緩存常用的操作有:

  • 緩存設(shè)置
  • 緩存獲取
  • 緩存清除
  • 緩存按key清除
  • 緩存有效期設(shè)置
  • 緩存寫入磁盤

而對于緩存來說還是也會遇到一些問題如:

  • 緩存穿透
  • 緩存擊穿
  • 緩存雪崩

對于上述幾個緩存可能遇到的問題點馏段,大家百度一下,其實都會有相關(guān)的答案践瓷,我這里且不會做太多的深入說明院喜,百度都知道的東西,好像再講也沒什么意思晕翠!

解決參考:
https://blog.csdn.net/fei33423/article/details/79027790

關(guān)于緩存庫

個人的推薦使用這個封裝好的庫喷舀,當然其實也可以自己封裝一個!
https://github.com/hustcc/wrapcache
相關(guān)的使用介紹其實github說的也很詳細了淋肾!我這里也就不細說硫麻!

我們直接安裝使用即可!

不過需要說明的一點就是一般它的裝飾器的方式的話樊卓,是對整個函數(shù)的結(jié)果進行緩存拿愧,而對于的KEY設(shè)置是什么,我暫時還不清楚碌尔!

所以我們使用的話一般直接的使用API的方式浇辜!

緩存redis_cache_helper.py工具類封裝:

image.png

1:安裝對應的wrapcache庫


image.png

2:編寫工具模塊

#!/usr/bin/evn python
# coding=utf-8
"""
Author = zyx
@Create_Time: 2018/4/25 22:39
@version: v1.0.0
@Contact: 308711822@qq.com
@File: redis_cache_helper.py
@文件功能描述:
"""

import wrapcache
import redis
from wrapcache.adapter.RedisAdapter import RedisAdapter


def init(_redis):
    REDIS_POOL = redis.ConnectionPool(host=_redis.get('host', ''), port=_redis.get('post', ''),
                                      db=_redis.get('db', ''),
                                      password=_redis.get('password', ''),
                                      socket_timeout=1, socket_connect_timeout=1)
    REDIS_INST = redis.Redis(connection_pool=REDIS_POOL, charset='utf8')
    RedisAdapter.db = REDIS_INST


def set(key='', value='', timeout=3000):
    print('key', key)
    print('v', value)
    return wrapcache.set(key, value, timeout=timeout, adapter=RedisAdapter)


def get(key):
    return wrapcache.get(key, adapter=RedisAdapter)


def remove(key):
    return wrapcache.remove(key, adapter=RedisAdapter)


# clear all the cache.
def flush():
    return wrapcache.flush(adapter=RedisAdapter)


from business_logic.configs import redis_config
if __name__ == '__main__':
    init(_redis=redis_config.REDIS)

3:啟動的時候初始化好redis的配置


image.png

4:編寫對應的redis_config模塊


image.png
const = {
    # 服務地址
    'host': 'localhost',
    # 服務端口
    'post': 6379,
    # 服務密碼
    'password': '',
    # 數(shù)據(jù)庫序號
    'db': 2
}

5:修改獲取課程的course_logic.py邏輯處理

from business_logic.db_model.knowledgepay_model import session_scope, Course
from base_framework.cache import redis_cache_helper

# 分頁查詢
def get_course_paginate(page_num=1):
    # 緩存的Key
    cache_key_course_paginate = 'get_course_paginate' + str(page_num)
    # 獲取緩存值
    result_list = redis_cache_helper.get(cache_key_course_paginate)
    # 判斷是否有值
    if result_list:
        is_ends = False
        if not result_list:
            is_ends = True
        # 直接的從緩存中返回
        print('直接的從緩存中返回')
        return result_list, is_ends

    # 否則從數(shù)據(jù)庫中進行讀取
    print('否則從數(shù)據(jù)庫中進行讀取')
    with session_scope():
        result = Course.select().dicts().order_by(Course.id).paginate(int(page_num), 4)
        result_list = []
        is_ends = False
        if result:
            for row in result:
                result_list.append(row)
        if not result_list:
            is_ends = True
        # 把對應的結(jié)果保存到緩存中
        redis_cache_helper.set(cache_key_course_paginate, result_list, timeout=10)
        return result_list, is_ends

course_logic.py細節(jié)小優(yōu)化

#!/usr/bin/evn python
# coding=utf-8

"""
Author = zyx
@Create_Time: 2018/4/25 11:23
@version: v1.0.0
@Contact: 308711822@qq.com
@File: course_logic.py
@文件功能描述:
"""

from business_logic.db_model.knowledgepay_model import session_scope, Course
from base_framework.cache import redis_cache_helper


# 分頁查詢
def get_course_paginate(page_num=1):
    # 緩存的Key
    cache_key_course_paginate = 'get_course_paginate' + str(page_num)
    # 獲取緩存值
    result_list = redis_cache_helper.get(cache_key_course_paginate)
    # 判斷是否有值
    if result_list:
        print('直接的從緩存中返回')
        if result_list == 'null':
            return [], True  # 查詢沒有結(jié)果的時候
        return result_list, False

    # 否則從數(shù)據(jù)庫中進行讀取
    print('否則從數(shù)據(jù)庫中進行讀取')
    with session_scope():
        result = Course.select().dicts().order_by(Course.id).paginate(int(page_num), 4)
        if not result:
            # 把對應的結(jié)果保存到緩存中---緩存穿透:處理
            redis_cache_helper.set(cache_key_course_paginate, "null", timeout=20)
            return [], True  # 查詢沒有結(jié)果的時候
        # for row in result: result_list.append(row)
        result_list = [v for v in result]  # 使用列表推導式
        # 把對應的結(jié)果保存到緩存中
        redis_cache_helper.set(cache_key_course_paginate, result_list, timeout=10)
        # 返回最終查詢結(jié)果
        return result_list, False

測試

image.png
image.png

結(jié)束

以上筆記純屬個人學習實踐總結(jié),有興趣的同學可以加群一起學習討論QQ:308711822

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唾戚,一起剝皮案震驚了整個濱河市柳洋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颈走,老刑警劉巖膳灶,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異立由,居然都是意外死亡轧钓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門锐膜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毕箍,“玉大人,你說我怎么就攤上這事道盏《蹋” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵荷逞,是天一觀的道長媒咳。 經(jīng)常有香客問我,道長种远,這世上最難降的妖魔是什么涩澡? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮坠敷,結(jié)果婚禮上妙同,老公的妹妹穿的比我還像新娘射富。我一直安慰自己,他們只是感情好粥帚,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布胰耗。 她就那樣靜靜地躺著,像睡著了一般芒涡。 火紅的嫁衣襯著肌膚如雪柴灯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天拖陆,我揣著相機與錄音弛槐,去河邊找鬼。 笑死依啰,一個胖子當著我的面吹牛乎串,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播速警,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼叹誉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闷旧?” 一聲冷哼從身側(cè)響起长豁,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忙灼,沒想到半個月后匠襟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡该园,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年酸舍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片里初。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡啃勉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出双妨,到底是詐尸還是另有隱情淮阐,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布刁品,位于F島的核電站泣特,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挑随。R本人自食惡果不足惜群扶,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竞阐,春花似錦、人聲如沸暑劝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽担猛。三九已至幕垦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間傅联,已是汗流浹背先改。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蒸走,地道東北人仇奶。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像比驻,于是被迫代替她去往敵國和親该溯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容