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