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/279231.html