redis | 认识非关系型数据库Redis的列表类型及python如何操作redis
Redis 非关 kv型
- 数据类型
- 列表
- 常用命令
- 应用场景
- 练习
- pyredis 操作redis
- ubuntu
- windows
- 连接redis
- 生产者消费者模型
数据类型
数据类型丰富,字符串strings,散列hashes,列表lists,集合sets,有序集合sorted sets等等
列表
单进程 单线程 尽可能规避掉阻塞的操作
常用命令
-
LPUSH key value1 value2
说明:从列表头部压入元素
返回:list最新的长度 -
RPUSH key value1 value2
说明:从列表尾部压入元素
返回:list最新的长度 -
查看列表中元素
LRANGE key start stop -
获取列表长度
LLEN key
-
RPOPLPUSH src dst
说明:从列表srC尾部弹出1个元素,压入到列表dst的头部
返回:被弹出的元素 -
LINSERT key after|before value newvalue
说明:在列表指定元素后/前插入元素
返回:
1,如果命令执行成功,返回列表的长度
2,如果没有找到pivot,返回-1
3,如果key不存在或为空列表,返回0 -
从列表头部弹出1个元素
LPOP key -
从列表尾部弹出1个元素6
RPOP key -
列表头部,阻塞弹出,列表为空时阻塞
BLPOP key timeout -
列表尾部,阻塞弹出,列表为空时阻塞
BRPOP key timeout
关于BLPOP和BRPOP说明
1、如果弹出的列表不存在或者为空,就会阻塞
2、超时时间设置为0,就是永久阻塞,直到有数据可以弹出
3、如果多个客户端阻塞再同一个列表上,使用First In First Service原则,先到先服务
-
LREM key count value
说明:删除指定元素
count:>0:表示从头部开始向表尾搜索,移除与value相等的元素,数量为count
count<0:表示从尾部开始向表头搜索,移除与value相等的元素,数量为count
count:=0:移除表中所有与value:相等的值返回:被移除元素的数量
-
LTRIM key start stop
说明:保留指定范围内的元素
返回:ok
场景:
保存微博评论最后500条 LTRIM weibo:comments 0 499 -
LSET key index newvalue
说明:设置Iist指定索引的值
应用场景
1,存储微博评论,做切割,只保留最新的x个
2,生产者消费者模型,做中间层,存放生产者的任务
练习
1、查看所有的键
keys *
2、向列表spider:urls中以RPUSH放入如下几个元素:01 baidu.com、
02 taobao.com,03 sina.com,04 jd.com 05 xxx.com
RPUSH spider:urls 01 baidu.com、
02 taobao.com,03 sina.com,04 jd.com 05 xxx.com
3、查看列表中所有元素
LRANGE spider:urls 0 -1
4、查看列表长度
LLEN spider:urls
5、将列表中01 baidu.com改为01 tmall…com
LSET 0 01 baidu.com 01 tmall…com
6、在列表中04jd.com之后再加1个元素02 taobao.com
LINSERT spider:urls after 04jd.com 02 taobao.com
7、弹出列表中的最后一个元素
RPOP spider:urls
8、删除列表中所有的02 taobao.com
LREM spider:urls 0 02_taobao.com
9、剔除列表中的其他元素,只剩前3条
LTRIM spider:urls 0 2
pyredis 操作redis
ubuntu
除用redis:客户端进行redis操作外,也可以使用Python直接操作redis
检查当前ubuntu是否安装
sudo pip3 freezelgrep -i ‘redis’
安装Python的redis 模块
sudo pip3 install redis
windows
前提是已经安装了redis
- python安装相关包
conda install redis
我的是anconda环境
连接redis
返回字节串
:
[b’k3’,b’l1’,b’k2’,b’uuuname’,b’k1’,b’uuname’]
生产者消费者模型
producer.py
import redis
import json
r = redis.Redis(host='',port=,db=,password=)
json_obj = {'task':'send_email','email_body':aaa','from''bbb','to''gxn'}
json_str = json.dumps(json_obj)
r.lpush('pyl2',json_str)
consumer.py
import redis
import json
r = redis.Redis(host='',port=,db=,password=)
while True:
task = r.brpop('pyl2',10)
print(task)
if task:
json_obj = json.loads(task[1])
# 具体任务逻辑
else:
print('---no task---')
break