redis之列表操作及在django中操作等相关内容-124

1 redis之列表操作

import redis

#
# class MyRedis():
#     def __enter__(self):
#         self.conn = redis.Redis()
#         return self.conn
#
#     def __exit__(self, exc_type, exc_val, exc_tb):
#         self.conn.close()
#
#
# with MyRedis() as conn:
# 列表操作
# 1 lpush(name,values)
# conn.lpush('l1',1,2,3,4,5,'lqz')

# 2 rpush
# conn.rpush('l1','egon')

# 3 lpushx(name,value)
# 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边
# conn.lpushx('l2',9)
# conn.lpushx('l1',9)

# llen(name)
# res=conn.llen('l1')
# print(res)

# linsert(name, where, refvalue, value)) 在某个位置插入值
# where :BEFORE或AFTER,大小写都行
# refvalue: lqz 表示以lqz为标准(不是下标索引)
# conn.linsert('l1','after','lqz','刘亦菲')
# conn.linsert('l1','before','lqz','baby')

# lset
# conn.lset('l1',0,'黄晓明')
# conn.lset('l1',5,'老伙计')

# lrem
# 第二个参数count:
# count = 0,删除列表中所有的指定值;
# count=2,从前到后,删除2个;
# count=-2,从后向前,删除2个
# conn.lrem('l1',0,'lqz') # 把所有lqz都删除
# conn.lrem('l1',2,'lqz') # 从前往后,删除2个lqz
# conn.lrem('l1',-1,'lqz') # 从前往后,删除2个lqz

# lpop
# res=conn.lpop('l1')

# res=conn.rpop('l1')
# print(res)

# lindex(不删除)
# res=conn.lindex('l1',0)
# print(res)

# lrange   # 前闭后闭区间
# res = conn.lrange('l1', 0, 0)
# print(res)

# ltrim
# res=conn.ltrim('l1',3,5)
# print(res)


# rpoplpush 需要两个列表
# conn.lpush('l2','lqz','egon')
# conn.rpoplpush('l1','l1')


# blpop   # block:阻塞 左边弹出

# res=conn.blpop('l1')
# print(res)


'''
lpush
llen
linsert
lset
lrem
lpop
lrange # 使用它,自定义增量迭代
blpop
'''

### redis类库中没有提供对列表元素的增量迭代,借助lrange

import redis

conn = redis.Redis()
# res=conn.lrange('l2',0,9999) # 全部取出来
# res=conn.lrange('l2',0,conn.llen('l2')) # 从0取到列表长度


# 类似于字典的hgetall,一次性全取出来,存在的问题是,因为不知道列表有多大,很有可能撑爆内存
# 我们实现一个增量迭代
# print(res)

# for i in range(10000):
#     conn.lpush('l_test','test_%s'%i)


# res=conn.lrange('l2',0,conn.llen('l2'))
# print(res)
# res = conn.lrange('l_test', 0, 9)
# print(res)


# def lscan_iter(name, conn, count=10):
#     cursor = 0
#     lenght = conn.llen(name) # 计算列表总长度
#     while cursor < lenght:
#         data = conn.lrange(name, cursor, (cursor+count) - 1)
#         cursor += count
#
#         for item in data:
#             yield item

def lscan_iter(name, conn, count=10):
   cursor = 0
   while True:
       data = conn.lrange(name, cursor, (cursor+count) - 1)
       if data:
           cursor += count
           for item in data:
               yield item
       else:
           break

for i in lscan_iter('l_test',conn,20):
   print(i)

 

2 redis之其它操作

import redis


## 公共操作

# 搭建哨兵。用了集群,这个模块就不够用了
# conn=redis.Redis()

# delete
# res=conn.delete('l2','name')


#exists
# res=conn.exists('l1','l_test','l2')
# res=conn.exists('l_test')

# expire
# res=conn.expire('l_test',5)

# rename
# conn.lpush('l1',1,2,3)
# res=conn.rename('l1','l2')

#
# res=conn.move('l2',3)

## redis的库是隔离的
conn = redis.Redis()
# res=conn.lpop('l2')


# 随机出一个key值
# res=conn.randomkey()


# conn.sadd('choujiang',9)
# conn.sadd('choujiang',90)
# conn.sadd('choujiang',99)
# print(res)
# res=conn.spop('choujiang')
# print(res)




# type----查看类型



# res=conn.type('choujiang')
# res=conn.type('ss')
res=conn.type('zzz')
print(res)
conn.close()

3 django中使用redis

3.1 通用方案

redis_pool.py

import redis

POOL=redis.ConnectionPool(host='127.0.0.1',port=6379,max_connections=100)

views.py

from utils.redis_pool import POOL
import redis
def test_redis(request):
   conn=redis.Redis(connection_pool=POOL)
   age=str(conn.get('age'),encoding='utf-8')

   return HttpResponse('人的年龄,从redis中取出来了是:%s'%age)

3.2 django提供的方案

pip3 install django-redis

配置文件

# redis的配置
#以后django的缓存,用的就是redis,很方便使用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",
      }
  }
}

views.py

from django_redis import get_redis_connection
def test_django_redis(request):
   # 从连接池中拿到连接
   conn=get_redis_connection()

   age = str(conn.get('age'), encoding='utf-8')

   from django.core.cache import cache
   cache.set('name','lqz',4)  # 往缓存中放key和value,其实放到了redis中了


   cache.set('xxx',test_redis)
   return HttpResponse('人的年龄是:%s' % age)

 

4 celery简介,架构

1 celery:芹菜(跟芹菜没有任何关系)
2 python中的一个分布式异步任务框架
-执行异步任务---(对立:同步任务):解决耗时任务,将耗时操作任务提交给Celery去异步执行,比如发送短信/邮件、消息推送、音视频处理等等
   -执行延时任务(5分钟后干一件事):解决延迟任务
   -执行定时任务:每天,隔几分钟,干什么事:解决周期(周期)任务,比如每天数据统计
3 解释
Celery is a project with minimal funding, so we don’t support Microsoft Windows. Please don’t open any issues related to that platform.

4 celery特点(了解)
   1)可以不依赖任何服务器,通过自身命令,启动服务(内部支持socket)
   2)celery服务为为其他项目服务提供异步解决任务需求的

5 Celery架构
Celery的架构由三部分组成,消息中间件(message broker)、任务执行单元(worker)和 任务执行结果存储(task result store)组成
   
   #消息中间件
Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis等等

# 任务执行单元
Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。

# 任务结果存储
Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, redis等

img

安装

pip install celery

 

posted @ 2021-01-07 19:32  投降输一半!  阅读(214)  评论(0编辑  收藏  举报