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

 

posted @ 2022-04-26 22:10  那就凑个整吧  阅读(19)  评论(0编辑  收藏  举报