python web(bottle框架)知行合一之-简单知识付费平台-”全栈“实践(12)---缓存处理-分页获取课程列表信息接口

python web(bottle框架)知行合一之-简单知识付费平台-”全栈“实践(12)---缓存处理-分页获取课程列表信息接口

PS:笔记只是为了更好表达我怎么语言表述,有些时候可能难免废话一推!
因知识有限, 如有错误, 欢迎指正!

每日细语:传说中,痴心的眼泪会倾城~

续言

这里为什么需要使用到缓存?关于缓存的重要性其实对应用层系统设计来说是必不可少的,因为频繁数据库链接和打开对数据库系统来说压力还是有的~所以我们在应用层中尽量还是需要引入缓存相关机制,避免频繁进行数据库操作处理。

那缓存其实又分内存的缓存和其他redis或其他缓存,那我们这里就有必要封装处理一下相关缓存操作,这里我自己使用的redis来进行处理缓存。
缓存常用的操作有:

  • 缓存设置
  • 缓存获取
  • 缓存清除
  • 缓存按key清除
  • 缓存有效期设置
  • 缓存写入磁盘

而对于缓存来说还是也会遇到一些问题如:

  • 缓存穿透
  • 缓存击穿
  • 缓存雪崩

对于上述几个缓存可能遇到的问题点,大家百度一下,其实都会有相关的答案,我这里且不会做太多的深入说明,百度都知道的东西,好像再讲也没什么意思!

解决参考:
https://blog.csdn.net/fei33423/article/details/79027790

关于缓存库

个人的推荐使用这个封装好的库,当然其实也可以自己封装一个!
https://github.com/hustcc/wrapcache
相关的使用介绍其实github说的也很详细了!我这里也就不细说!

我们直接安装使用即可!

不过需要说明的一点就是一般它的装饰器的方式的话,是对整个函数的结果进行缓存,而对于的KEY设置是什么,我暂时还不清楚!

所以我们使用的话一般直接的使用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': '',
    # 数据库序号
    '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

    # 否则从数据库中进行读取
    print('否则从数据库中进行读取')
    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
        # 把对应的结果保存到缓存中
        redis_cache_helper.set(cache_key_course_paginate, result_list, timeout=10)
        return result_list, is_ends

course_logic.py细节小优化

#!/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  # 查询没有结果的时候
        return result_list, False

    # 否则从数据库中进行读取
    print('否则从数据库中进行读取')
    with session_scope():
        result = Course.select().dicts().order_by(Course.id).paginate(int(page_num), 4)
        if not result:
            # 把对应的结果保存到缓存中---缓存穿透:处理
            redis_cache_helper.set(cache_key_course_paginate, "null", timeout=20)
            return [], True  # 查询没有结果的时候
        # for row in result: result_list.append(row)
        result_list = [v for v in result]  # 使用列表推导式
        # 把对应的结果保存到缓存中
        redis_cache_helper.set(cache_key_course_paginate, result_list, timeout=10)
        # 返回最终查询结果
        return result_list, False

测试

image.png
image.png

结束

以上笔记纯属个人学习实践总结,有兴趣的同学可以加群一起学习讨论QQ:308711822

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容