在Windows上安装Memcached
Memcached并没有官方支持Windows系统。不过,可以通过设置Windows Subsystem for Linux 2并进行配置来安装它。或者,可以使用Docker在容器中运行Memcached,本文将涵盖这一内容。首先,在Windows机器上安装Docker。可以从下载Docker Desktop。安装过程相当简单直接。现在已经在机器上安装了Docker,进入命令提示符并输入以下命令,从Docker Hub获取Memcached镜像,用于构建和运行容器。
docker pull memcached
完成这些步骤后,第三步是使用之前下载的Memcached镜像启动一个容器。点击‘RUN’按钮。请参考下图。恭喜,现在已经成功地在机器上启动了Redis服务器。
安装Pymemcache
为了在Python中连接和使用Memcached,将使用一个名为pymemcache的Python模块。可以通过在命令提示符中运行以下命令来安装它。
pip install pymemcache
现在已经准备好了一切,让开始编程部分。
使用Pymemcache
在执行任何CRUD操作之前,首先需要连接到Memcached服务器。让继续连接到Memcached服务器。
from pymemcache.client import base
client = base.Client(('localhost', 11211'))
现在已经成功连接到Memcached服务器,让开始执行简单的CRUD操作。
要设置一个键值对,可以使用“set”函数或“add”函数,它们接受键和值作为参数。请注意,键始终应该是字符串数据类型或字节。
client.set('hello', 'world')
要从Memcached服务器获取存储在其中的键的值,可以使用“get”函数,它接受键名作为参数。响应始终是字节,因此需要手动将响应解码为字符串,这是相当简单的。
client.get('hello') # 这始终返回字节
b'world'
要将字节转换为字符串,可以简单地在‘UTF-8’格式中解码字节。
client.get('hello').decode("utf-8") # 将字节转换为字符串
'world'
默认情况下,存储的数据不会过期。由于Memcached是基于内存的数据存储,存储空间有限,数据可能会因内存不足而被清除。可以使用“add”函数通过指定秒数来设置键值对的过期时间。过期时间应根据正在构建的应用程序类型仔细决定。
client.add(key="lorem", value="ipsum", expire=10) # 10秒后过期
client.get('lorem')
'ipsum'
如果在10秒后尝试访问该键,将不会得到任何响应,因为该键将从数据库中删除。
可以使用“set_multi”函数设置多个键值对,它接受多个键值对作为字典数据集。它还接受“expire”参数,用于设置键值对过期,以便在Memcached服务器上为新数据腾出空间。
client.set_multi({"Ram": 22, "Vishnu": 21, "Sanjay": 17},expire=200)
client.get('Ram')
b'22'
现在让尝试增加键“Ram”的值。可以使用“incr”函数对Memcached中的数值进行加法操作。
client.incr('Ram', value=5)
client.get('Ram')
b'27'
类似地,可以使用“decr”函数对Memcached中的数值进行减法操作。
client.decr('Ram', value=2)
client.get('Ram')
b'25'
除了数值之外的所有值在键值对中都会被转换为字符串字节,因此在存储之前和之后只会得到字符串作为响应,而不是原始数据结构,这可能是一个问题。
client.add(key="languages", value=['python', 'C++', 'C'])
client.get('languages').decode('utf-8')
"['python', 'C++', 'C']"
在这里,可以看到将一个列表存储在Memcached服务器中,但是当尝试获取这些数据时,得到的是字符串作为响应,而不是列表。为了确保存储的数据类型不仅仅是字符串,可以使用序列化和反序列化技术,使用像JSON或pickle这样的模块。将使用JSON来解释如何使用序列化和反序列化技术来存储和提取相同数据类型的数据。
让首先尝试将一个嵌套对象存储在Memcached服务器中,看看得到什么响应,以便与使用JSON进行序列化和反序列化后得到的响应进行比较。
personal_data = {
'name': 'Prakash',
'age': 34,
'programming_languages': ['python', 'C#', 'java'],
'address': {
'flat_no': 177,
'area': 'Velachery',
'pincode': 600042
}
}
client.set('prakask_personal_data', personal_data)
client.get('prakask_personal_data').decode("utf-8")
"{'name': 'Prakash', 'age': 34, 'programming_languages': ['python', 'C#', 'java'], 'address': {'flat_no': 177, 'area': 'Velachery', 'pincode': 600042}}"
如果尝试访问name属性,会得到一个错误,因为响应是一个字符串而不是一个字典。现在让使用JSON来序列化数据,然后将其存储在Memcached中,并使用相同的JSON进行提取和反序列化。
import json
personal_data = {
'name': 'Prakash',
'age': 34,
'programming_languages': ['python', 'C#', 'java'],
'address': {
'flat_no': 177,
'area': 'Velachery',
'pincode': 600042
}
}
client.set('prakask_personal_data', json.dumps(personal_data))
data = json.loads(client.get('prakask_personal_data').decode("utf-8"))
print(data)
{'name': 'Prakash',
'age': 34,
'programming_languages': ['python', 'C#', 'java'],
'address': {'flat_no': 177, 'area': 'Velachery', 'pincode': 600042}}
现在,让尝试访问address属性中的area属性,检查否得到任何错误。
data['address']['area']
'Velachery'
可以看到得到了正确的响应。
缓存系统只是加速应用程序的一种方式。传统的SQL数据库,如MySQL、Oracle,以及新的NoSQL数据库,如MongoDB,都存储在磁盘上。与在内存或RAM中执行的操作相比,磁盘上执行的操作通常较慢。由于Redis和Memcached这样的技术是基于内存的数据存储,操作速度非常快,但这些技术的劣势是RAM有限,不能用来存储所有信息。为了使应用程序快速,像Redis和Memcached这样的技术与适当的完整数据库如MySQL、MongoDB等一起使用。让看看Memcached如何在应用程序中与另一个数据库一起使用。
假设在Memcached服务器上设置了一个键值对,并在一段时间后尝试访问它。假设该键已从Memcached服务器中过期。在这种情况下,尝试从传统数据库中访问数据,比如说MySQL。所有数据都是持久的,不会像Memcached那样过期。
client.add('analytics', 'vidhya', expire=15)
def fetch_from_mysql(key=''):
data = ... # 从MySQL服务器获取
return data
data = client.get('analytics')
if not data
# 从MySQL获取,因为Memcached服务器中找不到键
data = fetch_from_mysql('analytics')
print(data)
else: print(data)
- 什么是Memcached?
- 在Windows上安装Docker
- 在Docker容器中运行Memcached
- 使用Pymemcache连接到Memcached
- 使用Pymemcache执行简单的CRUD操作
- 在应用程序中使用Memcached的缓存机制