初步使用pymemcache对memcached进行数据缓存操作
本章将介绍通过python中pymemcache模块对memcached缓存进行操作。
一、初始memcached
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。
Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。
Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。
本质上,它是一个简洁的key-value
存储系统。
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
以上内容来自:https://www.runoob.com/memcached/memcached-tutorial.html
以下为网站读取Memcached数据时的工作流程
首先客户端发送请求,通过web/app调用memcached接口去找数据,如果找到数据直接返回给客户端,如果没有数据则访问数据库,并返回,在返回数据的过程中在memcached缓存中存一份,当下一次客户端请求数据时直接通过memcached返回即可。减少了数据库的压力。本章会通过pymemcache模块模拟以上访问过程。
1.1、安装memcached
[root@yankai ~]# yum install memcached -y
Loaded plugins: fastestmirror
base | 3.6 kB 00:00:00
extras | 3.4 kB 00:00:00
mariadb | 2.9 kB 00:00:00
updates | 3.4 kB 00:00:00
Loading mirror speeds from cached hostfile
* base: ftp.sjtu.edu.cn
* extras: ftp.sjtu.edu.cn
* updates: ftp.sjtu.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package memcached.x86_64 0:1.4.15-10.el7_3.1 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
===========================================================================================================================================================================
Package Arch Version Repository Size
===========================================================================================================================================================================
Installing:
memcached x86_64 1.4.15-10.el7_3.1 base 85 k
Transaction Summary
===========================================================================================================================================================================
Install 1 Package
Total download size: 85 k
Installed size: 176 k
Downloading packages:
memcached-1.4.15-10.el7_3.1.x86_64.rpm | 85 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : memcached-1.4.15-10.el7_3.1.x86_64 1/1
Verifying : memcached-1.4.15-10.el7_3.1.x86_64 1/1
Installed:
memcached.x86_64 0:1.4.15-10.el7_3.1
Complete!
1.2、启动memcached
[root@yankai ~]# /usr/bin/memcached -p 11211 -m 128M -vv -u root
slab class 1: chunk size 96 perslab 10922
slab class 2: chunk size 120 perslab 8738
slab class 3: chunk size 152 perslab 6898
slab class 4: chunk size 192 perslab 5461
slab class 5: chunk size 240 perslab 4369
slab class 6: chunk size 304 perslab 3449
slab class 7: chunk size 384 perslab 2730
slab class 8: chunk size 480 perslab 2184
slab class 9: chunk size 600 perslab 1747
slab class 10: chunk size 752 perslab 1394
slab class 11: chunk size 944 perslab 1110
slab class 12: chunk size 1184 perslab 885
slab class 13: chunk size 1480 perslab 708
slab class 14: chunk size 1856 perslab 564
slab class 15: chunk size 2320 perslab 451
slab class 16: chunk size 2904 perslab 361
slab class 17: chunk size 3632 perslab 288
slab class 18: chunk size 4544 perslab 230
slab class 19: chunk size 5680 perslab 184
slab class 20: chunk size 7104 perslab 147
slab class 21: chunk size 8880 perslab 118
slab class 22: chunk size 11104 perslab 94
slab class 23: chunk size 13880 perslab 75
slab class 24: chunk size 17352 perslab 60
slab class 25: chunk size 21696 perslab 48
slab class 26: chunk size 27120 perslab 38
slab class 27: chunk size 33904 perslab 30
slab class 28: chunk size 42384 perslab 24
slab class 29: chunk size 52984 perslab 19
slab class 30: chunk size 66232 perslab 15
slab class 31: chunk size 82792 perslab 12
slab class 32: chunk size 103496 perslab 10
slab class 33: chunk size 129376 perslab 8
slab class 34: chunk size 161720 perslab 6
slab class 35: chunk size 202152 perslab 5
slab class 36: chunk size 252696 perslab 4
slab class 37: chunk size 315872 perslab 3
slab class 38: chunk size 394840 perslab 2
slab class 39: chunk size 493552 perslab 2
slab class 40: chunk size 616944 perslab 1
slab class 41: chunk size 771184 perslab 1
slab class 42: chunk size 1048576 perslab 1
<26 server listening (auto-negotiate)
<27 server listening (auto-negotiate)
<28 send buffer was 212992, now 268435456
<29 send buffer was 212992, now 268435456
<28 server listening (udp)
<28 server listening (udp)
<28 server listening (udp)
<29 server listening (udp)
<29 server listening (udp)
<28 server listening (udp)
<29 server listening (udp)
<29 server listening (udp)
/usr/bin/memcached -p 11211 -m 128M -vv -u root # -p:端口 -m设置最大内存默认为:64M,-vv, 输出详细信息 -u 用户名
二、通过telnet连接memcached进行操作
[root@yankai ~]# telnet localhost 11211
telnet localhost 11211 # 通过telnet 连接地址为 localhost 端口为11211的服务
2.1、Memcached set 命令
Memcached set 命令用于将 value(数据值) 存储在指定的 key(键) 中。如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。
set基本语法:
set key flags exptime bytes [noreply]
value
参数说明如下:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
操作:
[root@yankai ~]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
set name 0 20 2
yk
STORED
get name
VALUE name 0 2
yk
END
get name
END
验证在缓存中存储的字节数:
[root@yankai ~]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
set password 0 20 6
yankerp
CLIENT_ERROR bad data chunk
ERROR
get password
END
set password 0 20 6
yanker
STORED
get password
VALUE password 0 6
yanker
END
set password 0 0 6
yanker
STORED
get password
VALUE password 0 6
yanker
END
三、通过pymemcache模块对memcached进行操作
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/5/7 18:26
# @Author : YanZanG
# @File : memcached.py
# @Function: -----------
import time
import json
from pymemcache.client.base import Client
def get_data():
"""获取数据
1.从mysql中获取
2.从其他的一些接口获取数据
"""
data = {'iphone': ['iphone6', 'iphone7', 'iphone8'], 'Android': ['oppo', 'vivo']}
time.sleep(5)
return data
def show_data(data):
"""显示数据内容
"""
for k, v in data.items():
print(f"{k} : {v}")
def set_memcache(k, data):
"""将数据加入到缓存中
"""
try:
client = Client(('172.20.10.7', 11211))
client.set(k, json.dumps(data))
return True
except Exception as e:
print(e)
return False
def get_memcached(k):
"""获取memcached数据
"""
try:
client = Client(('172.20.10.7', 11211))
return json.loads(client.get(k))
except Exception as e:
print(e)
return False
def main():
"""入口函数
"""
k = "Phone_menu"
result = get_memcached(k)
if result:
print("这是从缓存中取数据")
show_data(result)
else:
print("这是从数据库取数据")
data = get_data()
show_data(data)
set_memcache(k, data)
main()
# ---------------------------第一次运行--------------------------
这是从数据库取数据
iphone : ['iphone6', 'iphone7', 'iphone8']
Android : ['oppo', 'vivo']
# ---------------------------第二次运行--------------------------
这是从缓存中取数据
iphone : ['iphone6', 'iphone7', 'iphone8']
Android : ['oppo', 'vivo']
# ---------------------------第三次运行--------------------------
这是从缓存中取数据
iphone : ['iphone6', 'iphone7', 'iphone8']
Android : ['oppo', 'vivo']
# ---------------------------清除memcached数据再次运行--------------------------
这是从数据库取数据
iphone : ['iphone6', 'iphone7', 'iphone8']
Android : ['oppo', 'vivo']
# ---------------------------第二次再次运行--------------------------
这是从缓存中取数据
iphone : ['iphone6', 'iphone7', 'iphone8']
Android : ['oppo', 'vivo']
清除memcached缓存数据
[root@yankai ~]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
flush_all
OK
希望对您有所帮助,再见~