list类型是简单的字符串列表,按照插入顺序排序。每个列表最多可以存储 232 - 1 个元素(40多亿) ,list类型主要有以下应用场景。
个人用的比较多的是不分页的数据列表,或者是变动较少的列表。
1. 消息队列
list类型的lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能,故而可以用Redis的list类型实现简单的点对点的消息队列。不过我不推荐在实战中这么使用,因为现在已经有Kafka、NSQ、RabbitMQ等成熟的消息队列了,它们的功能已经很完善了,除非是为了更深入地理解消息队列,不然我觉得没必要去重复造轮子。
2. 排行榜
list类型的lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中,如京东每日的手机销量排行、学校每次月考学生的成绩排名、斗鱼年终盛典主播排名等,下图是酷狗音乐“K歌擂台赛”的昨日打擂金曲排行榜,每日计算一次,存储在list类型中,接口访问时,通过page和size分页获取打擂金曲。(打个小广告,酷狗音乐“K歌擂台赛”每天都能产生一批优质翻唱作品,对普通人优质歌声有兴趣的朋友不妨来听听)。
创建测试类【demo11.py】
lpush(name,values)
在name对应的list中添加元素,每个新的元素都添加到列表的最左边
import redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.flushall()
r.lpush("list1", "琢石", "璞玉", "破梦")#向左侧添加
r.rpush("list1","灭神")#向右侧添加
print(r.lrange('list1', 0, -1))#-1代表所有值
import redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.flushall()
r.lpush("list1", "琢石", "璞玉", "破梦")#向左侧添加
r.rpush("list1","灭神")#向右侧添加
len=r.llen("list1")
print("list长度是:",len)
print(r.lrange('list1', 0, len-1))#这里是可以越界的
linsert(name, where, refvalue, value))
在name对应的列表的某一个值前或后插入一个新值
参数:
- name - redis的name
- where - BEFORE或AFTER
- refvalue - 标杆值,即:在它前后插入数据
- value - 要插入的数据
import redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.flushall()
r.lpush("list1", "琢石", "璞玉", "破梦")#向左侧添加
r.rpush("list1","灭神")#向右侧添加
r.linsert("list1", "after", "璞玉", "诸佛")#在"璞玉"的右侧添加了"诸佛",如果是"befor"则是左侧
print(r.lrange("list1", 0, -1))
r.lset(name, index, value)
对name对应的list中的某一个索引位置重新赋值
参数:
- name - redis的name
- index - list的索引位置
- value - 要设置的值
import redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.flushall()
r.lpush("list1", "琢石", "璞玉", "破梦")#向左侧添加
r.rpush("list1","灭神")#向右侧添加
r.lset("list1", 2, "诸佛") # 把索引号是2的元素修改成"诸佛"
print(r.lrange("list1", 0, -1))
r.lrem(name, num, value)
在name对应的list中删除指定的值
参数:
- name - redis的name
- num - num=0,删除列表中所有的指定值;
- num=2从前到后,删除2个, num=1,从前到后,删除左边第1个
- num=-2从后向前,删除2个
- value - 要删除的值
import redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.flushall()
r.lpush("list1","璞玉","琢石", "璞玉", "破梦","璞玉","璞玉","璞玉","璞玉","诸佛","璞玉","璞玉")#向左侧添加
r.rpush("list1","灭神")#向右侧添加
print(r.lrange("list1", 0, -1))
r.lrem("list1",1,"璞玉")#从左边删除1个
print(r.lrange("list1", 0, -1))
r.lrem("list1",2,"璞玉")#从左边删除2个
print(r.lrange("list1", 0, -1))
r.lrem("list1",-2,"璞玉")#从右边删除2个
print(r.lrange("list1", 0, -1))
lpop(name)rpop(name)
在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
更多:
rpop(name) 表示从右向左操作
import redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.flushall()
r.lpush("list1","璞玉","琢石", "璞玉", "破梦","诸佛","璞玉")#向左侧添加
r.rpush("list1","灭神")#向右侧添加
print(r.lrange("list1", 0, -1))
one=r.lpop("list1")#左删除
print("左1",one)
two=r.lpop("list1")#左删除
print("左2",two)
three=r.rpop("list1")#右删除
print("右1",three)
four=r.rpop("list1")#右删除
print("右2",four)
print(r.lrange("list1", 0, -1))
删除索引之外的值
ltrim(name, start, end)
在name对应的列表中移除没有在start-end索引之间的值
参数:
- name - redis的name
- start - 索引的起始位置
- end - 索引结束位置
import redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.flushall()
r.lpush("list1","璞玉","琢石", "璞玉", "破梦","诸佛","璞玉")#向左侧添加
r.rpush("list1","灭神")#向右侧添加
print(r.lrange("list1", 0, -1))
r.ltrim("list1", 2, 4)#存留下标2-4,也就是234三个值
print(r.lrange("list1", 0, -1))
lindex(name, index)
在name对应的列表中根据索引获取列表元素
import redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.flushall()
r.lpush("list1","璞玉","琢石", "璞玉", "破梦","诸佛","璞玉")#向左侧添加
r.rpush("list1","灭神")#向右侧添加
print(r.lrange("list1", 0, -1))
print(r.lindex("list1", 2))#下标值是2,也就是"破梦"
希望能对大家有所帮助,谢谢,欢迎一键三连。