133.在django中使用memcached
1. 在django中使用memcached,可以在settings.py文件中DATABASES变量下面配置CACHES缓存相关配置信息,只允许本机连接memcached就可以设置LOCATION为:127.0.0.1:11211。示例代码如下:
# memcached settings
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211'
}
}
2. 如果想让多台机器都可以使用memcached,就可以设置LOCATION为一个列表,包含多台机器的IP地址和端口号。
'LOCATION': [
'127.0.0.1:11211',
'192.168.1.133:11211',
],
3.在视图views.py中使用cache存储我们的数据,示例代码如下:
from django.http import HttpResponse
<!--导入模块-->
from django.core.cache import cache
def index(request):
<!--设置数据-->
cache.set('username','guyan', 120)
<!--获取数据-->
username = cache.get('username')
print(username)
return HttpResponse('memcached index')
4.在cmd窗口查看cache中的items,执行命令:stats items,会显示出当前的items_id,如果想要获取具体items_id下的所有key,就可以执行命令stats cachedump 1 0,其中,这里的0代表的是获取所有的key。
获取的结果如下:
stats cachedump 1 0
ITEM :1:username [5 b; 341429408 s]
ITEM age [2 b; 1581842070 s]
END
这里获取的key值是已经经过处理的,为:1:username
之后我们就可以通过get :1:username就可以获取我们当前的key的值value,结果如下:
get :1:username
VALUE :1:username 16 5
guyan
END
可是为什么key会在存储在memcached中的时候,会经过这种处理的方式呢?
1. 因为我们在views.py文件中是直接在cache上调用了set()方法,所以即可来到cache中,查看cache中是否定义了set()方法,结果我们发现:
<!--此时的cache只是一个空壳类,并没有定义set()方法-->
cache = DefaultCacheProxy()
2. 之后,我们查看一下DefaultCacheProxy类中是否定义了set()方法,同样这个类中也没有定义set()方法,但是这个类中的所有方法都使用到了DEFAULT_CACHE_ALIAS,ctrl+b进行查看一下:
DEFAULT_CACHE_ALIAS = 'default'
3. 这里的default就是我们在settings.py文件中设置的CACHES中的default,因此如果我们想要了解set()方法的定义就可以查看django.core.cache.backends.memcached.MemcachedCache,
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
'127.0.0.1:11211',
'192.168.1.133:11211',
],
}
}
4. 进入MemcachedCache中查看,
class MemcachedCache(BaseMemcachedCache):
5. 没有定义set()方法,但是继承了父类BaseMemcachedCache,在进入父类进行查看:
def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
key = self.make_key(key, version=version)
if not self._cache.set(key, value, self.get_backend_timeout(timeout)):
# make sure the key doesn't keep its old value in case of failure to set (memcached's 1MB limit)
self._cache.delete(key)
其中set()方法中涉及到的make_key()方法的定义如下:
def make_key(self, key, version=None):
if version is None:
version = self.version
return self.key_func(key, self.key_prefix, version)
make_key()方法中涉及到的self.key_func为:
self.key_func = get_key_func(params.get('KEY_FUNCTION'))
这里面的params就可以认为是我们在settings.py文件中配置的CACHES
set()方法中涉及到的version为
self.version = params.get('VERSION', 1)
在没有传入任何参数的时候,默认为1
因此如果我们想要定义自己的set()方法对key进行一些特定的处理,就可以定义CACHES中的'KEY_FUNCTION'。示例代码如下:
'KEY_FUNCTION': lambda key, key_prefix, version: 'Django:' + key,
这样的话,再次查看items的所有key,如下:
<!--查看所有的key-->
stats cachedump 1 0
ITEM Django:username [5 b; 341431876 s]
ITEM age [2 b; 1581842070 s]
END
<!--查看键所对应的值-->
get Django:username
VALUE Django:username 16 5
guyan
END
这样的话,以后就可以在Django中使用memcache了。并且,可以根据memcached自身的算法将获取的键值对信息存储到settings.py文件中配置的多个IP地址的服务器上,就可以实现高可用式分布存储,提高访问的效率。
始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。