django中使用redis
Redis k1:‘123‘ 字符串
k2:[1,2,3,4] 列表/数组
k3:{1,4} 集合:去重,爬虫去重
k4:{name:mcc,age:18} 字典/哈希表
k5:{(‘mcc‘,18),(‘zl‘,12)} 有序集合:游戏排行榜
redis支持持久化,两种持久化方案
python操作 redis 新建一个py文件 --安装 最新版本 from redis import Redis # 实例化产生对象,就是拿到一个redis链接 conn=Redis(host=‘localhost‘,posr=6379) 现在都是默认的,不用写 操作redis(value部分都是以bytes的格式存储),所以要转一下 ret=conn.get(‘name‘) print(ret) str() bytes() redis操作只连接池 from redis import Connection # 池子应该写成单列 写在模块中,然后引入直接用就好 pool=ConnectionPool(host=‘127.0.0.1‘,port=6379,max_connection=100) conn=Redis(connection_pool=pool) print(conn.get(‘name‘)) redis操作之字符串 conn.set() 四个参数
ex:过期时间(秒)
px:过期时间(毫秒)
nx:默认是False,如果设置为True,则只有name不存在的时候,当前set对象才执行,若值存在,则修改不了,执行没有效果
xx:默认是False,如果设置为True,只有name存在的时候才会执行,不存在不会执行 -- 存在就会覆盖
示例 conn.set(‘name‘,‘egon‘,ex=5,xx=True) print(conn.get(‘name‘)) setnx 默认nx=True conn.setex(‘xxx‘,5,‘ppp‘) name,time,value 批量设置? 重点记忆 conn.mset(mapping) 传一个字典 conn.mset({‘k1‘:‘v1‘,‘k2‘:‘v2‘}) 批量取值 conn.mget(keys,*args) keys是个列表 conn.mget([‘k1‘,‘k2‘])/conn.mget(‘k1‘,‘k2‘) 其他的一些方法 getrange(key,start,end) 取出字符串的一部分 其他语言不支持字符串取值,只能自己取 setrange 修改字符串内容,从指定的字符串后面开始替换 拿到的结果是字节 setrange(name,offset,value) name 是主键,offset 要替换的索引位置,value 替换成什么内容 setrange(egon,1,lxx) --elxx strlen --返回字符串的长度 其他语言计算比较复杂,所以用的多 重点 conn.incr(‘age‘) 自增 # 应用场景 文章阅读数 在线直播人数 conn.incr(‘age‘,amount=3) 指定增长为3,每一次 conn.incr(‘age‘,amount=-3) 指定自减为3 # 自减 conn.decr(‘age‘,amount=3) 追加 conn.append(‘age‘,‘xxx‘) 18xxx 注意,数字是可以自增和自减的,但是只限制是纯数字 redis之字典操作 --hash操作 conn.hset(‘hash1‘,‘k1‘,‘v1‘) hash1--类似表 k1是表中的key值 v1是表中的value值 conn.hsetnx nx:值存在就不修改 批量设值 conn.hmset(‘hash1‘,{‘name‘:‘mcc‘,‘age‘:18}) conn.hmget(‘hash1‘,‘k1‘) ?批量取值 conn.hmget(‘hash1‘,[‘name‘,‘age‘]) conn.hmget(‘hash1‘,‘name‘,‘age‘) 取值 字典取值 获取所有 conn.hgetall(‘hash1‘,[b‘name‘]) --b‘mcc‘ 获取键值对的长度 conn.hlen(‘hash1‘) --就是一个表中有多少条数据 hkeys/hvalue/hexits conn.hdel(‘hash1‘,‘k1‘) 删除 conn.hincrby(‘hash1‘,‘k3‘) 增加值 重点 hscan 参数是游标,count,
hscan_iter 其实拿到的是一个生成器 内部是while 循环嵌套for循环,yidld
只支持一层的5大数据类型,也就是说字典的value只能是字符串,列表的value只能是字符串
redis之列表操作 conn.flushdb() 删掉所有库,不要做 conn.lpush(‘list1‘,10) 插入多个值,是插到上方,rpush是插入到下方 conn.llen(‘list1‘) # 获取长度 conn.linsert(‘list1‘,‘before‘,10,100) 对列表list1,在10的前面插入100,如果有多个10,是以第一个10为标准 conn.linsert(‘list1‘,‘after‘,100) conn.lset(‘list1‘,‘4‘,123) # 从0开始 索引**不是row,value值 row是软件做的,内部是从0开始 conn.lrem(‘list1‘,count,value) count是0代表所有全删 2代表从前往后删除2个 -2代表从后往前删除两个 conn.lpop() 从左侧pop出一个元素 # 如果一值移除,没有的话会给一个None conn.lrange() 获取从几到几的元素 前后都取,都是闭区间 重点 没有阻塞住,可以实现分布式 conn.blpop # 基于这个做一个生产者消费者模型 #这个是在取值的时候,如果没有值会一值在原地等待,所以我们可以起一个新项目,给他push值,这样就相当于完成了一个生产者消费者模型 print(conn.blpop(‘list1‘)) 没有原地等待 分布式的东西 添加值 conn.push(‘list1‘,10) 之后运行会发现 print(conn.blpop(‘list1‘)) --(b‘list1‘,b‘10‘) 带b就是阻塞 获取列表中所有值 conn.lrange(‘list1‘,end) for i in range(10000): conn.lpush(‘list1‘,i) print(conn.lrange(‘list1‘,conn,llen(‘list1‘))) # 将所有的值都拿了出来,不太好,需要有一个类似于生成器的东西scan,只能自己写 自定义生成器 def scan_list(name,count=10): index = 0 while True: # count+index-1 是因为取得是自闭和的值,从0-9就是10条了 data_list = conn.lrange(name,index,count+index-1) if not data_list: return # 这里就是将所有的数据都取出后,列表空了,那就直接结束这个函数 # 下面是正常的逻辑 index = count # 这样的话下面再取的值的话就是从索引10 开始了 for data in data_list: yield data # 使用生成器直接将data一个一个的给出 print(conn.lrange(‘list1‘,100)) # 这个就是将100条全部取出 for i in scan_list(‘list1‘,5): print i # 和全部取出有了明显的对比,下面这个更省内存 redis其他操作--不管数据类型,通用操作 conn.delete() 根据key值删除 conn.exists() 返回0/1 conn.keys() 里面可以传正则 模糊匹配 expire conn.rename() 给key值重命名 conn.move() 移动数据库 randomkey() 随机获取一个key conn.type() 查看数据类型 scan,scan_iter django中操作 管道-实现事务 pipe = conn.pipeline(transaction = True) pipe.multi() pipe.set(‘name‘,‘alex‘) pipe.set(‘role‘,‘sb‘) pipe.execute() # 这个才是真正的去执行 所有框架都能用的方式 -新建一个py文件,生成一个redis数据库连接池 from redis import ConnectionPool POOL = ConnectionPool(host=‘127.0.0.1‘,max_connection=100) 在哪用,导过来 conn = Redis(connection_pool=POOL) conn.set(‘xxx‘,‘yyy‘) conn.get(‘name‘) django中使用 django-redis 1.安装 # 缓存配置:采用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} } } } 3.使用: from django-redis import get_redis_connection def index(request): conn = get_redis_connection() print conn.get(‘name‘) conn.set return HttpResponse(‘ok‘) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- python day 8
- Python深入06――python的内存管理详解
- python – Django:将变量传递给登录设置文件
- python-3.x – 在最小化AdamOptimizer时,在op输入和计算输入
- python – Aiohttp,Asyncio:RuntimeError:事件循环已关闭
- python – 将像素转换为LatLng来自谷歌静态图像的坐标
- 使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
- python:验证条件和引发异常的最佳方法
- dict_key对象不支持indexing-python 3
- day13:迭代器&高阶函数(map,reduce,filter,sorted)