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