Redis缓存网页及数据行

缓存网页

在有些网站上的首页不会经常发生大的变化,这些页面不需要每次载入都要动态生成的内容,我们可以使用缓存来降低网站处理相同负载所需的服务器数量,并让网站的速度变得更快。

Flask+Redis使用缓存页面的功能:

import redis
from flask import Flask,request
app = Flask(__name__)
@app.route('/index')
def index():
    conn = redis.Redis(connection_pool=pool)
    content = cache_request(conn,request.url,callback)
    return content

def cache_request(conn,request,callback):

    # 1.判断请求是否可以被缓存
    if not can_cache(conn,request):
        return callback(request)
    # 2.生成key
    page_key = "cache" + hash_request(request)
    print("page_key:",page_key)
    #3.判断是否已经被缓存
    content = conn.get(page_key)
    #如果没有被缓存,则生成缓存,过期时间300秒
    if not content:
        content = callback(request)
        conn.setex(page_key,300,content)
    return content
#判断此请求是否应该被缓存
def can_cache(conn,request):
    return True
#
def hash_request(request):
    return str(hash(request))

def callback(request):
   return '<h1>Hello World!</h1>'
if __name__ == '__main__':
    pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
    app.run(host='127.0.0.1',port=8080,debug=True)

#  pool = redis.ConnectionPool(host='localhost', password='密码',port=6379, decode_responses=True)
#  pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)

关于flask其他缓存方面:使用 Flask-Cache 缓存应用

缓存数据行

  前面提到了缓存网页来提速,这种方式在有些情况是不适合的,比如电商网站中促销活动,网站不能对整个促销页面进行缓存,因为会导致用户看到错误的商品剩余数量,但是用户每次刷新都走数据库,会给数据库带来巨大的压力,并导致我们花费额外的成本扩展数据库。

   我们应该怎么做?整个页面需要更新的只是商品信息,我们可以只对数据行进行缓存(商品在数据库对应的一行)。具体做法:编写应该持续运行的守护进程函数,让这个函数将将指定的数据行缓存到redis中,并不定期的对这些缓存数据进行更新,缓存数据编码为json字典存储到redis字符串中,数据列的名字被映射为json字典的键,数据行的值被映射为json字典的值。怎么更新,通过ajax技术将缓存异步刷新。

import time
import json
def schedule_row_cache(conn,row_id,delay):
    #两个有序集合
    #存储对应id数据的缓存时间
    conn.zadd('delay:',row_id,delay)
    #存储对应id数据下次更新时间
    conn.zadd('schedule:', row_id, time.time())

def cache_rows(conn):
    while 1:
        # zrange返回有序集 key 中,指定区间内的成员。
        # 其中成员的位置按 score 值递增(从小到大)来排序。
        #这里一直获取第一个成员
        #返回一个或者零个元组的列表
        next = conn.zrange('schedule:',0,0,withscores=True)
        now = time.time()
        #小于则需要缓存,大于则不需要
        if not next or next[0][1] > now:
            time.sleep(.05)
        #获取对应id
        row_id = next[0][0]
        #根据id获取缓存的时间
        delay = conn.zscore('delay:',row_id)
        if delay <= 0:
            conn.zrem('delay:', row_id)
            conn.zrem('delay:', row_id)
            conn.delete('inv:'+ row_id)
            continue
        #从数据库获取对应id下的数据
        row = get(row_id)
        # 更新
        conn.zadd('schedule:',row_id,now +  delay)
        #更新缓存
        conn.set('inv:' + row_id, json.dumps(row.to_dict()))

def get(id):
    pass
原文地址:https://www.cnblogs.com/-wenli/p/12951410.html