redis
特点:
a.持久化
b.单进程、单线程
c.5大数据类型
redis={
k1:'123',
k2:[1,2,3,],
k3:{1,2,3,4},
k4:{name:123,age:666},
k5:{('alex',60),('EVA-J',80),('rt',70)}
}
使用字典:
-基本操作
-慎重使用hgetall,优先使用hscan_iter
-计数器
注意事项:redis操作时,只有第一层value支持:list,dict....
redis={
k4:{
id:1,
title:'xxxx',
price_list:[
{id:1,title:'xx'},
{id:2,title:'xx'},
{id:3,title:'xx'},
{id:4,title:'xx'},
]
}
}
redis连接池
import redis
#创建连接
# conn=redis.Redis(host="127.0.0.1",port=6379)
# # conn.set('x1','王华强')
# val=conn.get('x1')
# print(val)
#创建连接池
# import redis
# pool=redis.ConnectionPool(host="127.0.0.1",port=6379,max_connections=1000)
# r=redis.Redis(connection_pool=pool)
# r.set('foo','Bar')
#问题来了
# from redis_pool import POOL
# from redis_0801.redis_pool import POOL
#
# while True:
# key=input("请输入key:")
# value=input("请输入value:")
# #创建连接池
#
# #去连接池获取连接
# conn=redis.Redis(connection_pool=POOL)
# #设置值
# conn.set(key,value)
import redis
pool=redis.ConnectionPool(host="127.0.0.1",port=6379,max_connections=1000)
conn=redis.Redis(connection_pool=pool)
# r.set('foo','Bar')
"""
redis={
k4:{
username:alex,
age:18
}
}
"""
# conn.hset('k4','username','alex')
# conn.hset('k4','age',18)
# val=conn.hget('k4','username')
# print(val)
# vals=conn.hgetall('k4')
# print(vals)
# {b'username': b'alex', b'age': b'18'}
#计数器
# print(conn.hget('k4','age'))
# conn.hincrby('k4','age',amount=2)
# print(conn.hget('k4','age'))
#问题:如果redis的k4对应的字典中有1000W条数据,请打印所有的数据
#不可取:从redis取到数据之后,服务器内存无法承受,爆炸
# result=conn.hgetall('k4')
# print(result)
# ret=conn.hscan_iter('k4',count=100)
# for item in ret:
# print(item)
Redis缓存(依赖:pip3 install django-redis)
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100}
# "PASSWORD": "密码",
}
}
}
用法:
from django_redis import get_redis_connection
conn = get_redis_connection("default")
应用示例:
from django.shortcuts import render,HttpResponse
# Create your views here.
from utils.redis_pool import POOL
import redis
# pool=redis.ConnectionPool(host="127.0.0.1",port=6379,max_connections=1000)
"""
from django_redis import get_redis_connection
def index(request):
# conn=redis.Redis(connection_pool=POOL)
conn=get_redis_connection("default")
# conn.hset('kkk','age',18)
return HttpResponse("设置成功")
def order(request):
# conn = redis.Redis(connection_pool=POOL)
conn = get_redis_connection("default")
# conn.hget('kkk','age')
return HttpResponse("获取成功")
"""
import time
from django.views.decorators.cache import cache_page
@cache_page(60*15)
def index(request):
ctime=str(time.time())
return HttpResponse(ctime)
def order(request):
return HttpResponse("获取成功")
2、应用
a. 全站使用
使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,
如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存 MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', # 其他中间件... 'django.middleware.cache.FetchFromCacheMiddleware', ] CACHE_MIDDLEWARE_ALIAS = "" CACHE_MIDDLEWARE_SECONDS = "" CACHE_MIDDLEWARE_KEY_PREFIX = ""
b. 单独视图缓存
方式一:
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def my_view(request):
...
方式二:
from django.views.decorators.cache import cache_page
urlpatterns = [
url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
]
c、局部视图使用
a. 引入TemplateTag
{% load cache %}
b. 使用缓存
{% cache 5000 缓存key %}
缓存内容
{% endcache %}
redis事务
from utils.redis_pool import POOL
import redis
conn=redis.Redis(connection_pool=POOL)
#初始化事物对象
pipe=conn.pipeline()
try:
pipe.set("name1","xiayuhao")
pipe.set("name2","xiayuhao","舔狗")
pipe.set("name3","李文周")
pipe.execute()
except Exception as e:
print(e)
'''
pipe.set("name1","xiayuhao")
pipe.set("name2","xiayuhao","舔狗")
pipe.set("name3","李文周")
'''
print(conn.get('name1'))
print(conn.get('name2'))
print(conn.get('name3'))
Redis发布者
import redis
from utils.redis_pool import POOL
conn=redis.Redis(connection_pool=POOL)
conn.publish('xiayuhao','ladyboy')
Redis订阅者
import redis
from utils.redis_pool import POOL
conn=redis.Redis(connection_pool=POOL)
#第一步 生成一个订阅者对对象
pubsub=conn.pubsub()
#第二步 订阅一个消息 实际上就是监听这个键
pubsub.subscribe("xiayuhao")
#第三步 死循环一直等待监听结果
while True:
print("working...")
msg=pubsub.parse_response()
print(msg)
django缓存
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值
保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。
Django中提供了6种缓存方式:
- 开发调试
- 内存
- 文件
- 数据库
- Memcache缓存(python-memcached模块)
- Memcache缓存(pylibmc模块)
1、配置
a、开发调试
# 此为开始调试用,实际内部不做任何操作
# 配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎
'TIMEOUT': 300, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大缓存个数(默认300)
'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
},
'KEY_PREFIX': '', # 缓存key的前缀(默认空)
'VERSION': 1, # 缓存key的版本(默认1)
'KEY_FUNCTION' 函数名 # 生成key的函数(默认函数会生成为:【前缀:版本:key】)
}
}
# 自定义key
def default_key_func(key, key_prefix, version):
"""
Default function to generate keys.
Constructs the key used by all other methods. By default it prepends
the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
function with custom key making behavior.
"""
return '%s:%s:%s' % (key_prefix, version, key)
def get_key_func(key_func):
"""
Function to decide which key function to use.
Defaults to ``default_key_func``.
"""
if key_func is not None:
if callable(key_func):
return key_func
else:
return import_string(key_func)
return default_key_func
内存
# 此缓存将内容保存至内存的变量中
# 配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
}
}
# 注:其他配置同开发调试版本
文件
# 此缓存将内容保存至文件
# 配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache',
}
}
# 注:其他配置同开发调试版本
数据库
# 此缓存将内容保存至数据库
# 配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table', # 数据库表
}
}
# 注:执行创建表命令 python manage.py createcachetable
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/database/279231.html