Pyhton学习-Python与中间件之Memcache(4)

Pyhton浅谈-Python与中间件之Memcache(4) 

一 、缓存的由来:

  我们使用应用程序时,应用程序通过与数据库进行交互来显示给用户,但是,当用户访问量增加,那么应用程序每秒处理的请求会增多,数据库服务器压力增加(数据量增大,内存增高),数据库就会出现一些问题:查询速度减慢,

网站出现延迟…,缓存的出现很好的解决了这个问题:

 图 1 应用程序和数据库进行交互

二、缓存的运行原理:

  如图:当用户发出请求时,应用程序首先去缓存查找数据(2),如果缓存没有(3),那么应用程序回去数据库查找(4),随后返还给应用程序(1),再去缓存缓存一份(2),这样可以较大的增加数据库运行效率。

  

图 2 缓存的运行原理

三、Memcache介绍:

  Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。

  Memcache特点:

    开源,协议简单;

    高效,C语言开发,基于libevent处理;

    速度快,内存存储;

    C/S架构,TCP连接方便;

    数据存满时,通过LRU (Least Recently Used) 机制进行删除;

四、Memache安装(以CentOS为例):

  1.安装 :

  yum install -y memcached

  2.查看位置:

  whereis memcached 、 which memcached

  3.查看帮助:

  /usr/bin/memcached -h

  4.启动程序:

  /usr/bin/memcached -p 11211 -m 128m -vv -u root

  -p 端口(默认为11211

  -m 设置的缓存大小

  -vv 打印详情

  -u 用户

  5.存入信息:

  官方指令文档:https://github.com/memcached/memcached/blob/master/doc/protocol.txt

  命令格式:<command name> <key> <flags> <exptime> <bytes>

  <command name> 命令

  <key> 关键字

  <flags> 标志位(为0即可)

  <exptime> 存活时间(0为永久存活)

  <bytes> 大小  注意:需要与下面的存储数据的大小一样,否则会报错

  添加数据:

  set myname 0 60 5

  catt1e(大小为5个Bytes)

  查找数据:

  get myname(key)

  6.退出:

  quit

五、Python操作—pymemcache:

  如下为Python操作pymemcache,主要实现功能为:存取数据,如若memcache缓存(get_cache)没有,则去get_data里面取,随后将信息缓存(mid_cache),如若缓存有数据,则去缓存里取数据。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:catt1e


import time
import json
from pymemcache.client.base import Client


def get_data():
    '''获取数据
    1. 从mysql获取
    2. 从其他接口获取
    '''

    data = {'ch':['ch001','ch002'], 'mudan':['牡丹A','牡丹B']}
    time.sleep(3)
    return data

def show_data(data):
    for k, v in data.items():
        print(k, v) 


def mid_cache(k, data):
    '''缓存数据
    '''
    client = Client(('192.168.0.115', 11211))
    ret = client.set(k, json.dumps(data))
    return ret

def get_cache(k):
    '''从k取缓存数据'''
    client = Client(("192.168.0.115", 11211))
    try:
        data = client.get(k)
        return json.loads(data)
    except Exception as e:
        print(e)
        return False



def main():
    k = 'tv'
    data = get_cache(k)
    if data:
        print('from cache...')
        show_data(data)
    else:
        print('no data, 第一次取')
        data = get_data()
        mid_cache(k, data)    

if __name__ == '__main__':
    main()

  

  pymemcache官方文档:

  https://pymemcache.readthedocs.io/en/latest/getting_started.html#serialization

原文地址:https://www.cnblogs.com/catt1e/p/12570884.html