redis操作以及celery的使用

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 的默认隔离级别是多少

posted on 2022-08-02 21:17  淦白嫖怪  阅读(247)  评论(0)    收藏  举报

导航