1 redis 列表操作
'''
1 lpush(name,values)
2 lpushx(name,value)
3 rpushx(name, value) 表示从右向左操作
4 llen(name)
5 linsert(name, where, refvalue, value))
6 lset(name, index, value)
7 lrem(name, value, num)
8 lpop(name)
9 lindex(name, index)
10 lrange(name, start, end)
11 ltrim(name, start, end)
12 rpoplpush(src, dst)
13 blpop(keys, timeout)
14 brpoplpush(src, dst, timeout=0)
15 自定义增量迭代
'''
from redis import Redis
conn = Redis()
# 1 lpush(name,values)
# conn.lpush('girl_friend','刘亦菲','迪丽热巴')
# 2 lpushx(name,value) 只有name已经存在时,值添加到列表的最左边
# conn.lpushx('girl_friend','杨颖')
# 3 rpushx(name, value) 表示从右向左操作
# conn.rpush('girl_friend','彭于晏')
# 4 llen(name)
# print(conn.llen('girl_friend'))
# 5 linsert(name, where, refvalue, value))
# name: redis的key值, where: before或者after refvalue: 列表中的元素(刘亦菲), value :要插入的值
# conn.linsert('girl_friend',where='after',refvalue='刘亦菲',value='lqz')
# conn.linsert('girl_friend',where='before',refvalue='刘亦菲',value='lqz')
# conn.linsert('girl_friend',where='before',refvalue='迪丽热巴',value='lqz')
# 6 lset(name, index, value) # 从零开始
# conn.lset('girl_friend',0,'凤姐')
# 7 lrem(name, value, num) # 正数是从左侧,负数是从右侧,0表示删所有
# conn.lrem('girl_friend',1,'lqz') # 从左侧删1个
# conn.lrem('girl_friend',-1,'lqz') # 从右侧删1个
# 8 lpop(name) # 从左侧弹出
# res=conn.lpop('girl_friend')
# res = conn.rpop('girl_friend')
# print(str(res, encoding='utf-8'))
# 9 lindex(name, index)
# res=conn.lindex('girl_friend',2)
# print(str(res,encoding='utf-8'))
# 10 lrange(name, start, end)
# res=conn.lrange('girl_friend',0,2) # 前闭后闭区间
# print(res)
print(conn.lrange('test',0,conn.llen('test')))
# 11 ltrim(name, start, end) # 修剪
# conn.ltrim('girl_friend',1,3)
# 12 rpoplpush(src, dst)
# conn.lpush('wife1','ee')
# conn.rpoplpush('girl_friend','wife1')
# 13 blpop(keys, timeout) # 记住---》消息队列本质就是基于它---》redis可以作为消息队列
# 阻塞式 弹出,如果列表中有值,就弹出,如果没有值就阻塞,直到有值再弹出
# print(conn.blpop('lqz'))
# 14 brpoplpush(src, dst, timeout=0)
# 15 自定义增量迭代----》
'''
# 由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要:
# 1、获取name对应的所有列表
# 2、循环列表
# 但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆,所有有必要自定义一个增量迭代的功能:
'''
# conn.lpush('test',*[1,2,3,4,45,5,6,7,7,8,43,5,6,768,89,9,65,4,23,54,6757,8,68])
# def scan_list(name, count=2):
# index = 0
# while True:
# data_list = conn.lrange(name, index, count + index - 1)
# if not data_list:
# return
# index += count
# for item in data_list:
# yield item
#
#
# # print(conn.lrange('test', 0, 100))
# for item in scan_list('test', 5):
# print('---')
# print(item)
conn.close()
2 redis管道
# redis不支持事务---》管道的操作---》多个命令放到一个管道中,然后一次性执行,要么都成功,要么都失败
# redis支持事务码?支持--》通过管道实现弱事务
-事务四个特性
-事务隔离级别
from redis import Redis
conn=Redis()
# 创建要给管道
pipe = conn.pipeline(transaction=True)
pipe.multi() # 接受多条命令,放到管道中
pipe.decrby('zhangsan',50)
raise Exception('异常了')
pipe.incrby('lisi',50)
pipe.execute() # 一次性执行管道中所有命令
conn.close()
3 redis其它操作
# redis的通用操作---》跟类型无关的操作
from redis import Redis
conn = Redis()
# 1 delete(*names)
# conn.delete('wife')
# 2 exists(name)
# res = conn.exists('age')
# print(res)
# 3 keys(pattern='*')
# res=conn.keys('*')
# res=conn.keys('userinfo?')
# print(res)
# 4 dbsize
# res=conn.dbsize()
# print(res)
#5 expire(name ,time)
# conn.expire('wife1',5)
#6 rename(src, dst)
# conn.rename('test','test1')
#7 move(name, db))
# conn.move('test1',3)
#8 randomkey()
# # 随机获取一个redis的name(不删除)
# print(conn.randomkey())
#9 type(name)
print(conn.type('girl_friend'))
conn.close()
4 django中集成redis
# 两种方案
-1 通用方案
-写一个pool包
import redis
POOL=redis.ConnectionPool(max_connections=1024,decode_responses=True)
-在使用的位置导入
conn = Redis(connection_pool=POOL)
res = conn.get('name')
-2 使用第三方:django-redis
-pip 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": "123",
}
}
}
-在使用的位置
conn = get_redis_connection()
conn.set.....
# 一旦配置文件配置 CACHES 后,django的缓存框架(默认是内存),存储的位置也是redis
# 以后根本不需要会redis的操作,只需要使用
cache.set('name',对象)
cache.get()
# 强大之处在于不需要关注设置的类型,直接设置就行
# 把python的对象,通过pickle序列化后,以string形式存到redis中了
5 celery介绍架构和安装
# celery:芹菜,分布式异步任务框架
# 注意:Celery is a project with minimal funding, so we don’t support Microsoft Windows. Please don’t open any issues related to that platform. ---》使用别的方式可以运行在win上
# celery可以做的事:
1 异步执行:解决耗时任务,将耗时操作任务提交给Celery去异步执行,比如发送短信/邮件、消息推送、音视频处理等等
2 延迟执行:解决延迟任务
3 定时执行:解决周期(周期)任务,比如每天数据统计
# celery的概念:celery是独立的服务,跟其它框架无关,需要单独启动
"""
1)可以不依赖任何服务器,通过自身命令,启动服务
2)celery服务为为其他项目服务提供异步解决任务需求的
注:会有两个服务同时运行,一个是项目服务,一个是celery服务,项目服务将需要异步处理的任务交给celery服务,celery就会在需要时异步完成项目的需求
人是一个独立运行的服务 | 医院也是一个独立运行的服务
正常情况下,人可以完成所有健康情况的动作,不需要医院的参与;但当人生病时,就会被医院接收,解决人生病问题
人生病的处理方案交给医院来解决,所有人不生病时,医院独立运行,人生病时,医院就来解决人生病的需求
"""
# celery的架构
# 1 消息中间件broker---》redis,rabbitmq
# 2 任务执行单元worker--》celery的进程
# 3 结果存储(backend):Task result store---》redis,mysql,rabbitmq。。。
![img]()
6 celery基本使用
# pip install celery
# 第一步:实例化得到app对象,注册任务
from celery import Celery
backend='redis://127.0.0.1:6379/1' # 结果存储
broker='redis://127.0.0.1:6379/2' # 消息中间件
app=Celery('main',broker=broker,backend=backend)
#任务 --->变成了celery的任务了
@app.task
def add(a,b):
import time
time.sleep(2)
return a+b
# 第二步:提交任务---第三方来提交
from main import add
res=add.delay(4,5) # 把任务提交到消息中间件中
# 第三步:使用celery 来执行任务:启动worker
# win上:装eventlet
celery -A main worker -l info -P eventlet
# linux、mac上
celery -A main worker -l info
# 第四步:查看任务执行结果---》手动去redis中看
问题分析
# 1 redis key值最大可以多大?
# 2 事务四个特性
# 3 事务隔离级别
# 4 mysql 5.7 的默认隔离级别是多少