redis的数据类型
python连接redis
安装模块:pip install redis
普通连接
from redis import Redis # 普通连接 # conn = Redis(host='localhost', port=6379, db=0, password=None) # conn.set('name', 'zys') # res = conn.get('name') # print(res)
连接池连接
import redis # 先构造一个池 # POOL必须是单例的,全局只有一个实例,无论程序怎么执行,POOL是同一个对象 POOL = redis.ConnectionPool(max_connections=10, host='localhost', port=6379) # 从池中拿一个连接 conn = redis.Redis(connection_pool=POOL) print(conn.get('name'))
redis字符串操作
1 set(name, value, ex=None, px=None, nx=False, xx=False) ex,过期时间(秒) px,过期时间(毫秒) nx,如果设置为True,则只有name不存在时,当前set操作才执行,值存在,就修改不了,执行没效果 xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值 2 setnx(name, value) 2 setex(name, value, time) 3 psetex(name, time_ms, value) 4 mset(*args, **kwargs) 5 get(name) 5 mget(keys, *args) 6 getset(name, value) 7 getrange(key, start, end) 8 setrange(name, offset, value) 9 setbit(name, offset, value) 10 getbit(name, offset) 11 bitcount(key, start=None, end=None) 12 bitop(operation, dest, *keys) 13 strlen(name) 14 incr(self, name, amount=1) 15 incrbyfloat(self, name, amount=1.0) 16 decr(self, name, amount=1) 17 append(key, value) ''' import redis conn=redis.Redis() # 1 set(name, value, ex=None, px=None, nx=False, xx=False) # conn.set('age',19) # ex,过期时间(秒)---->过期时间 # px,过期时间(毫秒) ---->过期时间 # conn.set('wife','lyf',ex=3) # nx,如果设置为True,则只有name不存在时,当前set操作才执行, 值存在,就修改不了,执行没效果 # conn.set('wife','dlrb',nx=True) # xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值 # conn.set('wife','dlrb',xx=True) # 2 setnx(name, value)--->等同于conn.set('wife','dlrb',nx=True) # 2 setex(name, value, time)--->conn.set('wife','lyf',ex=3) # 3 psetex(name, time_ms, value)--->conn.set('wife','lyf',px=3) # 4 mset(*args, **kwargs)--》批量设置 # conn.mset({'name1':'pyy','age1':20}) # 5 get(name) # print(conn.get('age1')) # 5 mget(keys, *args) # print(conn.mget(['age1','age'])) # print(conn.mget('name','age','age1')) # 6 getset(name, value) # print(conn.getset('name','dsb')) # 它跟get,再set有什么区别? # 7 getrange(key, start, end) # print(conn.getrange('name',0,1)) # 取字节 ,前闭后闭 # 8 setrange(name, offset, value) # conn.setrange('name',1,'qqq') # dsb--->dqqq # 9 setbit(name, offset, value) ---》后面再聊---》独立用户统计---》用户量过亿---》日活 # conn.setbit('name',1,0) # 改的是比特位,d 一个byte占8个比特位--》2进制---》10进制---》字符 # 10 getbit(name, offset) # print(conn.getbit('name',1)) # 11 bitcount(key, start=None, end=None) # print(conn.bitcount('name',0,1)) # 数字指的是字节,不是比特位 # 13 strlen(name) # 字节(一个byte)和字符(中 ? a 都是一个字符) # 面试题:mysql中utf8和utf8mb4有什么区别? # utf8---》不是咱们任务的utf-8,mysql字节的,两个字节表示一个字符---》生僻字,表示存不了 # utf8mb4--》utf-8,最多4个字节表示一个字符---》存标签,存生僻字 # print(conn.strlen('name')) # 字节--》9--》gbk编码一个中文占2个字节 utf-8编码 大部分一个中文占3个字节,生僻字可能占4 # 14 incr(self, name, amount=1)--->做计数器--》记录博客访问量--》博客表的文章上加个访问量字段,一旦有一个人访问,数字+1 # conn.incr('age') # 不存在并发安全的问题---》redis6.0之前是单线程架构,并发访问操作,实际只排着队一个个来 # 15 incrbyfloat(self, name, amount=1.0) # 16 decr(self, name, amount=1) # conn.decr('age') # 17 append(key, value) # conn.append('name','nb') # 记住:get set strlen
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','彭于晏') # conn.hset("userinfo_01",mapping={'name':"刘亦菲",'age':18}) # 2 hmset(name, mapping)---》弃用了-->直接使用hset即可 # conn.hmset("userinfo_02",mapping={'name':"刘亦菲",'age':18}) # 3 hget(name,key) # print(str(conn.hget('userinfo_01','name'),encoding='utf-8')) # print(str(conn.hget('userinfo_01','age'),encoding='utf-8')) # 4 hmget(name, keys, *args) # print(conn.hmget('userinfo_01',['name','age'])) # print(conn.hmget('userinfo_01','name','age')) # 5 hgetall(name)--->慎用,有可能数据量很大,会撑爆内存-->一般我们redis服务器使用内存很大的服务器,应用服务器内存小一些 # print(conn.hgetall('userinfo_01')) # 6 hlen(name) # print(conn.hlen('userinfo_01')) # 2 # 7 hkeys(name) # print(conn.hkeys('userinfo_01')) # [b'name', b'age'] # 8 hvals(name) # print(conn.hvals('userinfo_01')) # [b'\xe5\x88\x98\xe4\xba\xa6\xe8\x8f\xb2', b'18'] # 9 hexists(name, key) # print(conn.hexists('userinfo_01','name')) # print(conn.hexists('userinfo_01','height')) # 10 hdel(name,*keys) # conn.hdel('userinfo_01','name') # 11 hincrby(name, key, amount=1) # conn.hincrby('userinfo_01','age') # 12 hincrbyfloat(name, key, amount=1.0) # 因为hgetall不安全,有可能数据量过大,所以尽量使用,迭代取值 # 13 hscan(name, cursor=0, match=None, count=None) hash类型无序----》python 字典在3.6以后有序了,如何实现的? # for i in range(1000): # conn.hset('hash_test','id_%s'%i,'鸡蛋%s号'%i) # 分批获取,但是由于没有顺序,返回一个cursor,下次基于这个cursor再继续获取 # res=conn.hscan('hash_test',0,count=20) # print(res) # res=conn.hscan('hash_test',352,count=20) # print(res) # print(len(res[1])) # 14 hscan_iter(name, match=None, count=None) #全取出所有值,分批取,不是一次性全取回来,减小内存占用 # res=conn.hscan_iter('hash_test',count=10) # generator # # print(res) # for item in res: # print(item) # print(conn.hgetall('hash_test')) # hset hget hlen hexists
redis之列表操作
''' 1 lpush(name,values) 2 lpushx(name,value) 3 llen(name) 4 linsert(name, where, refvalue, value)) 4 r.lset(name, index, value) 5 r.lrem(name, value, num) 6 lpop(name) 7 lindex(name, index) 8 lrange(name, start, end) 9 ltrim(name, start, end) 10 rpoplpush(src, dst) 11 blpop(keys, timeout) 12 brpoplpush(src, dst, timeout=0) ''' import redis conn=redis.Redis() # 1 lpush(name,values) # conn.lpush('girls','lyf','dlrb') # 图形界面看到的 上面是左, 下面是右 # conn.rpush('girls','杨颖') # 2 lpushx(name,value) 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边 # conn.lpushx('girls','杨颖1') # conn.lpushx('girl','杨颖1') # 3 llen(name) # print(conn.llen('girls')) # 4 linsert(name, where, refvalue, value)) # conn.linsert('girls','before','lyf','张杰') # conn.linsert('girls','after','lyf','lqz') # 4 r.lset(name, index, value) 对name对应的list中的某一个索引位置重新赋值 # conn.lset('girls',1,'lqz') # 5 r.lrem(name, count,value) # conn.lrem('girls',1,'lqz') # 从左侧删第一个 # conn.lrem('girls',-1,'lqz') # 从右侧删第一个 # conn.lrem('girls',0,'lqz') # 全删 # 6 lpop(name) # res=conn.lpop('girls') # print(res) # r=b'\xe6\x9d\xa8\xe9\xa2\x961' # print(str(r,encoding='utf-8')) # 7 lindex(name, index) # print(conn.lindex('girls',1)) # 8 lrange(name, start, end) # print(conn.lrange('girls',0,1)) # 前闭后闭 # 9 ltrim(name, start, end) ---》修剪,只保留起始到终止 # conn.ltrim('girls',1,2) # 10 rpoplpush(src, dst) # 从第一个列表的右侧弹出,放入第二个列表的左侧 # 11 blpop(keys, timeout) # 阻塞式弹出--》可以做消息队列 -->block-->如果没有值,会一直阻塞 # 作用,可以实现分布式的系统---》分布式爬虫 # 爬网页,解析数据,存入数据库一条龙,一个程序做 # 写一个程序,专门爬网页---》中间通过redis的列表做中转 # 再写一个程序专门解析网页存入数据库 # print(conn.blpop('girls',timeout=1)) # 12 brpoplpush(src, dst, timeout=0) # lpush lpop linsert llen blpop