一、缓存的由来:
-
提升性能
绝大多数情况下,select 是出现性能问题最大的地方。一方面,select 会有很多像 join、group、order、like 等这样丰富的语义,而这些语义是非常耗性能的;另一方面,大多 数应用都是读多写少,所以加剧了慢查询的问题。
分布式系统中远程调用也会耗很多性能,因为有网络开销,会导致整体的响应时间下降。为了挽救这样的性能开销,在业务允许的情况(不需要太实时的数据)下,使用缓存是非常必要的事情。
-
缓解数据库压力
当用户请求增多时,数据库的压力将大大增加,通过缓存能够大大降低数据库的压力。
二、memcached的特点:
什么是Memcached:
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。
Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。
本质上,它是一个简洁的key-value存储系统。
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
特点如下:
(1)开源------协议简单
(2)高效------C语言开发 基于libevent处理
(3)速度快------内存存储
(4)c/s架构------tcp连接方便
(5)数据存满时------通过lru机制进行删除
注意:数据存储在内存中,断电消失,不是数据持久化数据库
支持语言:
- Perl
- PHP
- Python
- Ruby
- C#
- C/C++
- Lua
- 等等
三、memcached的安装和常见操作:
安装(centos7安装) yum install memcached
daemon后台启动
$ /usr/local/bin/memcached -p 11211 -m 64m -d
这里使用的memcached启动选项的内容如下。
选项说明
-p 使用的TCP端口。默认为11211
-m 最大内存大小。默认为64M
-vv 用very vrebose模式启动,调试信息和错误输出到控 制台
-d 作为daemon在后台启动
上面四个是常用的启动选项,其他还有很多,通过 $ /usr/local/bin/memcached –h 查看帮助
关于memcached的简单操作(增删改查)不做书写,请移步学习:https://www.runoob.com/memcached/memcached-tutorial.html
四、使用python对memcached进行操作:
pip install pymemcache #安装库
连接memcahed服务:
from pymemcache.client.base import Client client = Client(('localhost', 11211)) #创建连接 client.set('some_key', 'some_value') #将key的value上传缓存 result = client.get('some_key') #获取key的值
简单的序列化操作:
tv = {'ch':['ch1','ch2'], 'mudan':['md1', 'md2']} cli.set('menu_tv', json.dumps(tv))
然后一顿操作(简单的操作)如下:
1 import time 2 import json 3 from pymemcache.client.base import Client 4 5 6 # 演示缓存流程 7 def get_data(): 8 '''生成数据''' 9 data = {'ch': ['ch1', 'ch2'], 'md': ['mdA', 'mdB']} 10 time.sleep(3) 11 return data 12 13 14 def show_data(data): 15 '''显示数据内容''' 16 for k, v in data.items(): 17 print(k, v) 18 19 20 def mind_data(k, data): 21 '''将数据加入到缓存中''' 22 client = Client(('192.168.66.189', 11211)) 23 res = client.set(k, json.dumps(data)) 24 return res 25 26 27 def get_cache(k): 28 '''获取数据''' 29 try: 30 client = Client(('192.168.66.189', 11211)) 31 data = json.loads(client.get(k)) 32 return data 33 except Exception as e: 34 print(e) 35 return False 36 37 38 if __name__ == '__main__': 39 k = 'test' 40 data = get_cache(k) 41 if data: 42 show_data(data) 43 else: 44 data = get_data() 45 show_data(data) 46 mind_data(k, data)