1 redis之列表
| ''' |
| 1 lpush(name, values) |
| 2 rpush(name, values) 表示从右向左操作 |
| 3 lpushx(name, value) |
| 4 rpushx(name, value) 表示从右向左操作 |
| 5 llen(name) |
| 6 linsert(name, where, refvalue, value)) |
| 7 r.lset(name, index, value) |
| 8 r.lrem(name, value, num) |
| 9 lpop(name) |
| 10 rpop(name) 表示从右向左操作 |
| 11 lindex(name, index) |
| 12 lrange(name, start, end) |
| 13 ltrim(name, start, end) |
| 14 rpoplpush(src, dst) |
| 15 blpop(keys, timeout) |
| 16 r.brpop(keys, timeout),从右向左获取数据 |
| 17 brpoplpush(src, dst, timeout=0) |
| |
| ''' |
| |
| import redis |
| |
| conn = redis.Redis() |
| |
| 1 lpush(name, values) |
| conn.lpush('girls', '迪丽热巴', '刘亦菲') |
| conn.lpush('girls', '周淑怡') |
| |
| 2 rpush(name, values) 表示从右向左操作 |
| conn.rpush('girls', '小红') |
| |
| 3 lpushx(name, value) |
| conn.lpushx('boys','小刚') |
| conn.lpush('boys','小刚') |
| conn.lpushx('boys','小刚') |
| |
| |
| |
| 4 rpush(name, value) |
| conn.rpush('boys','吴彦祖','周润发') |
| |
| 5 rpushx(name, value) |
| |
| |
| 6 llen(name) |
| res = conn.llen('girls') |
| |
| |
| 7 linsert(name, where, refvalue, value) |
| |
| conn.linsert('girls','before','迪丽热巴','古力娜扎') |
| |
| |
| conn.linsert('girls', 'after', '小黑', '小嘿嘿') |
| |
| 8 r.lset(name, index, value) |
| conn.lset('girls',1,'xxx') |
| |
| |
| 9 r.lrem(name, num, value) |
| conn.lrem('girls',-1,'xxx') |
| conn.lrem('girls',0,'xxx') |
| |
| 10 lpop(name) |
| res=conn.lpop('girls') |
| |
| 11 rpop(name) |
| |
| |
| 12 lindex(name, index) |
| res = str(conn.lindex('girls', 1), encoding='utf-8') |
| print(res) |
| |
| |
| 13 lrange(name, start, end) |
| res=conn.lrange('girls',2,4) |
| res=conn.lrange('girls',0,0) |
| |
| |
| 14 ltrim(name, start, end) |
| conn.ltrim('girls',2,3) |
| |
| 15 rpoplpush(src, dst) |
| |
| |
| |
| 16 blpop(keys, timeout) |
| res = conn.blpop('boys') |
| |
| conn.close() |
| |
| ''' |
| lpush |
| lpop |
| llen |
| lrange |
| ''' |
2 redis之hash
| ''' |
| 1 hset(name, key, value) |
| 2 hmset(name, mapping) |
| 3 hget(name,key) |
| 4 hmget(name, keys, *args) |
| 5 hgetall(name) |
| 6 hlen(name) |
| 7 hkeys(name) |
| 8 hvals(name) |
| 9 hexists(name, key) |
| 10 hdel(name,*keys) |
| 11 hincrby(name, key, amount=1) |
| 12 hincrbyfloat(name, key, amount=1.0) |
| 13 hscan(name, cursor=0, match=None, count=None) |
| 14 hscan_iter(name, match=None, count=None) |
| |
| ''' |
| |
| import redis |
| |
| conn = redis.Redis() |
| 1 hset(name, key, value) |
| conn.hset('userinfo','name','wei') |
| conn.hset('userinfo',mapping={'age':19,'hobby':'篮球'}) |
| |
| 2 hmset(name, mapping) |
| |
| |
| 3 hget(name,key) |
| res = conn.hget('userinfo','name') |
| print(res) |
| |
| |
| 4 hmget(name, key, *agrs) |
| res = conn.hmget('userinfo',['name','age']) |
| res = conn.hmget('userinfo', 'name', 'age') |
| print(res) |
| |
| 5 hgetall(name) |
| res=conn.hgetall('userinfo') |
| |
| 6 hlen(name) |
| res = conn.hlen('userinfo') |
| print(res) |
| |
| |
| 7 hkeys(name) |
| res = conn.hkeys('userinfo') |
| print(res) |
| |
| |
| 8 hvals(name) |
| res = conn.hvals('userinfo') |
| print(res) |
| |
| |
| 9 hexists(name, key) |
| res = conn.hexists('userinfo', 'name') |
| res = conn.hexists('userinfo', 'name1') |
| |
| |
| 10 hdel(name, *keys) |
| res = conn.hdel('userinfo','age') |
| print(res) |
| |
| 11 hincrby(name, key, amount=1) |
| conn.hincrby('userinfo', 'age', 2) |
| |
| |
| 12 hincrbyfloat(name, key, amount=1.0) |
| |
| |
| 13 hgetall 会一次性全部取出,效率低,可以能占内存很多 |
| |
| |
| for i in range(100): |
| conn.hset('hash_test','id_%s'%i,'鸡蛋_%s号'%i) |
| |
| res = conn.hgetall('hash_test') |
| |
| 14 hscan(name, cursor=0, match=None, count=None) |
| |
| |
| |
| |
| |
| |
| 15 hscan_iter(name, match=None, count=None) |
| res=conn.hscan_iter('hash_test',count=10) |
| print(res) |
| for i in res: |
| print(i) |
| |
| |
| ''' |
| hset |
| hget |
| hmget |
| hlen |
| hdel |
| hscan_iter 获取所有值,但是省内存 等同于hgetall |
| ''' |
3 redis其他操作
| '''通用操作 不指定类型,所有类型都支持 |
| 1 delete(*names) |
| 2 exists(name) |
| 3 keys(pattern='*') |
| 4 expire(name ,time) |
| 5 rename(src, dst) |
| 6 move(name, db)) |
| 7 randomkey() |
| 8 type(name) |
| ''' |
| |
| import redis |
| |
| conn = redis.Redis() |
| |
| 1 delete(*names) |
| conn.delete('name','userinfo2') |
| |
| conn.delete(*['name', 'userinfo2']) |
| |
| |
| 2 exists(name) |
| res=conn.exist('userinfo') |
| print(res) |
| |
| |
| 3 keys(pattern='*') |
| res = conn.keys('*') |
| res1 = conn.keys('*b') |
| res2=conn.keys('w?e') |
| print(res) |
| print(res1) |
| print(res2) |
| |
| |
| 4 expire(name, time) |
| conn.expire('userinfo',3) |
| |
| |
| 5 rename(src, dst) |
| conn.rename('hobby','hobby111') |
| |
| |
| 6 move(name, db) |
| conn.move('hobby111', 8) |
| |
| 7 randomkey() |
| res = conn.randomkey() |
| |
| |
| 8 type(name) |
| print(conn.type('age')) |
| print(conn.type('boys')) |
4 redis 管道
| |
| -原子性 |
| -一致性 |
| -隔离性 |
| -持久性 |
| |
| |
| |
| -执行命令 一条一条执行 |
| - 张三 金额 -100 |
| conn.decr('zs_money', 100) |
| |
| - 李四 金额 +100 |
| conn.incr('ls_money', 100) |
| |
| |
| -把这两条命令 放到一个管道中,先不执行,执行excute,一次性都执行完成 |
| conn.decr('zs_money', 100) conn.incr('ls_money', 100) |
| |
| |
| |
| import redis |
| |
| conn = redis.Redis() |
| p = conn.pipeline(transaction=True) |
| p.multi() |
| |
| p.decr('zs_money', 100) |
| |
| p.incr('ls_money', 100) |
| |
| p.execute() |
| conn.close() |
5 django中使用redis
| |
| -第一步: 写一个pool.py |
| import redis |
| POOL = redis.ConnectionPool(max_connections=100) |
| |
| conn = redis.Redis(connection_poo=POOL) |
| conn.incr('count') |
| res = conn.get('count') |
| |
| |
| |
| -方案一: django的缓存使用redis 【推荐使用】 |
| -setting.py |
| 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} |
| |
| } |
| } |
| } |
| |
| -再使用redis的地方: |
| def test_redis(request): |
| res = cache.get('count') |
| cache.set('count', res+1) |
| -pickle序列化后,存入的 |
| |
| |
| -方案二: 第三方: django-redis模块 |
| from django_redis import get_redis_connection |
| def test_redis(request): |
| conn=get_redis_connection() |
| print(conn.get('count')) |
| return JsonResponse({'count': '今天这个接口被访问的次数为:%s'}, json_dumps_params={'ensure_ascii': False}) |
| |
5 celery介绍和安装
| |
| -翻译过来是 芹菜 但是和芹菜没有什么关系 |
| -框架:服务,python的框架,跟django无关 |
| -能用来做什么 |
| -1 异步任务 |
| -2 定时任务 |
| -3 延时任务 |
| |
| |
| |
| """ |
| 1 可以不依赖任何服务器,通过自身命令,启动服务 |
| 2 celery服务为其他项目服务提供异步解决任务需求的 |
| 注:会有两个服务同时运行,一个是项目服务,一个是celery服务,项目服务将需要异步处理的任务交给celery服务,celery就会在需要时异步完成项目的需求 |
| |
| 人是一个独立运行的服务 | 医院也是一个独立运行的服务 |
| 正常情况下,人可以完成所有健康情况的动作,不需要医院的参与;但当人生病时,就会被医院接收,解决人生病问题 |
| 人生病的处理方案交给医院来解决,所有人不生病时,医院独立运行,人生病时,医院就来解决人生病的需求 |
| |
| """ |
| |
| |
| |
| -1 任务中间件 Broker(中间件), 其他服务提交的异步任务,放在里面排队 |
| -需要借助于第三方 redis rabbitmq |
| -2 任务执行单元 worker 真正执行异步任务的进程 |
| -celery提供的 |
| -3 结果存储 backend 结果存储,函数的返回结果,存到 backend中 |
| -需要借助于第三方: redis, mysql |
| |
| |
| |
| 异步执行: 解决耗时任务 |
| 延迟执行:解决延迟任务 |
| 定时执行: 解决周期(周期)任务 |
| |
| |
| |
6 celery快速使用
| |
| pip install celery |
| win: pip install eventlet |
| |
| |
| |
| |
| from celery import Celery |
| |
| broker = 'redis://127.0.0.1:6379/1' |
| |
| backend = 'redis://127.0.0.1:6379/2' |
| app = Celery('test', broker=broker, backend=backend) |
| |
| @app.task |
| def add(a, b): |
| import time |
| time.sleep(3) |
| print('------',a + b) |
| return a + b |
| |
| |
| res = add.delay(5,6) |
| print(res) |
| |
| |
| |
| |
| win: |
| -4.0之前版本 |
| celery worker -A main -l info -P eventlet |
| -4.x之后 |
| celery -A main worker -l info -P eventlet |
| mac: |
| celery -A main worker -l info |
| |
| |
| |
| |
| |
| |
| |
| from main import app |
| from celery.result import AsyncResult |
| id = '22e149bf-16fa-4e95-bad8-d89182a5ba83' |
| if __name__ == '__main__': |
| a = AsyncResult(id=id, app=app) |
| if a.successful(): |
| result = a.get() |
| print(result) |
| elif a.failed(): |
| print('任务失败') |
| elif a.status == 'PENDING': |
| print('任务等待中被执行') |
| elif a.status == 'RETRY': |
| print('任务异常后正在重试') |
| elif a.status == 'STARTED': |
| print('任务已经开始被执行') |
7 celery包结构
| project |
| ├── celery_task |
| │ ├── __init__.py |
| │ ├── celery.py |
| │ └── tasks.py |
| ├── add_task.py |
| └── get_result.py |
| |
| |
| |
| |
| from celery import Celery |
| broker = 'redis://127.0.0.1:6379/1' |
| backend = 'redis://127.0.0.1:6379/2' |
| app = Celery('test', broker=broker, backend=backend, include=['celery_task.order_task', 'celery_task.user_task']) |
| |
| |
| |
| |
| from .celery import app |
| import time |
| |
| @app.task |
| def add(a, b): |
| print('-----', a + b) |
| time.sleep(2) |
| return a + b |
| |
| |
| |
| |
| from .celery import app |
| import time |
| |
| @app.task |
| def send_sms(phone, code): |
| print("给%s发送短信成功,验证码为:%s" % (phone, code)) |
| time.sleep(2) |
| return True |
| |
| |
| |
| |
| |
| |
| |
| |
| from celery_task.user_task import send_sms |
| from celery_task.order_task import add |
| |
| '异步调用' |
| res = send_sms.delay(199999999, '88888') |
| print(res) |
| |
| |
| |
| |
| |
| celery -A celery_task worker -l info -P eventlet |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| from celery_task import app |
| from celery.result import AsyncResult |
| id = '7d39033c-4cc7-4af2-8d78-e62c277db183' |
| if __name__ == '__main__': |
| a = AsyncResult(id=id, app=app) |
| if a.successful(): |
| result = a.get() |
| print(result) |
| elif a.failed(): |
| print('任务失败') |
| elif a.status == 'PENDING': |
| print('任务等待中被执行') |
| elif a.status == 'RETRY': |
| print('任务异常后正在重试') |
| elif a.status == 'STARTED': |
| print('任务已经开始被执行') |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构