Redis是一个开源的速度非常快的非关系数据库,它可以存储键(key)与5种不同类型的值(value)之间的映射(mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能。、
请注意:存储在Redis中的数据并不会由于计算机的关机而从内存中消失,必须手动删除数据才会消失。
Redis的集合和列表都可以存储多个字符串,它们之间的不同在于,列表可以存储多个相同的字符串,而集合则通过使用散列来保证自己存储的每个字符串都是各不相同的(这些散列表只有键,但没有与键相关联的值)。
一、List键值结构(有序可重复)
Redis支持list数据结构,底层是一个双向链表,允许重复值存在,按照插入顺序保存。lpush从左边插入,rpush从右边插入。lpop从左边弹出,rpop从右边弹出。
这样能轻易地实现FIFO队列思想:插入和弹出在不同方向操作。
也可以轻易地实现FILO队列思想:插入和弹出在相同方向操作。
二、重要API
参数 | 解释 |
Rpush | Lpush key-name value[value…]——将一个或多个值推入列表的右端 |
Lpush | Lpush key-name value[value…]——将一个或多个值推入列表的左端 |
Linsert | Linsert key-name BEFORE|AFTER pivot value——在list指定的值pivot前|后插入value |
Rpop | Rpop key-name——移除并返回列表最右端的元素 |
Lpop | Lpop key-name index newValue——移除并返回列表最左端的元素 |
Ltrim | Ltrim key-name start end——对列表进行修剪,只保留从start偏移量到end偏移量范围内的元素,包括start和end在内 |
Lrem | Lrem key-name count value——根据count值从列表中删除与value相等的项,(1)count>0,从左到右删除最多count个与value相等的项 (2)count<0,从右到左删除最多count个与value相等的项 (3)count=0,删除所有与value相等的项 |
Lset | Lset key-name index newValue——设置列表指定索引的值为newValue |
Lindex | Lindex key-name offset——返回列表中偏移量为offset的元素 |
Lrange | Lrange key-name start end——返回列表从start偏移量到end偏移量范围内的所有元素,包括start和end在内;end=-1表示取出从start开始到队列结尾的所有元素,包括start在内 |
Llen | Llen key-name——获取列表的长度 |
Blpop | Blpop key-name [key-name…] timeout——从第一个非空列表中弹出位于最左端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现 |
Brpop | Brpop key-name [key-name…] timeout——从第一个非空列表中弹出位于最右端的元素,或者在timeout秒之内阻塞并等待可弹出的元素出现 |
RpopLpush | RpopLpush source-key dest-key——从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素 |
BRpopLpush | BRpopLpush source-key dest-key timeout——从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素;如果source-key为空,那么在timeout秒之内阻塞并等待可弹出元素出现 |
三、注意事项
1、要小心使用Ltrim命令
实例演示:
1、Lpush和Rpush
Lpush list-key1 val1 val2 //list-key1值为:val2 val1,最左边的元素的索引为0
Lpush list-key1 val3 val4 //list-key1值为:val4 val3 val2 val1
Lpush list-key1 val5 //list-key1值为:val5 val4 val3 val2 val1
Rpush list-key1 val6 //list-key1值为:val5 val4 val3 val2 val1 val6
Rpush list-key1 val7 val8 //list-key1值为:val5 val4 val3 val2 val1 val6 val7 val82、Lpop和Rpop
Lpop list-key1 //list-key1值为:val4 val3 val2 val1 val6 val7 val8
Rpop list-key1 //list-key1值为:val4 val3 val2 val1 val6 val73、Lrange
Lrange list-key1 0 -1 //结果为:val4 val3 val2 val1 val6 val7
Lrange list-key1 0 5 //结果为:val4 val3 val2 val1 val6 val7
Lrange list-key1 4 5 //结果为:val6 val74、Lindex
Lindex list-key1 0 //结果为:val4
Lindex list-key1 3 //结果为:val15、Ltrim
Ltrim list-key1 3 5 //list-key1值为:val1 val6 val76、Blpop
在测试本命令之前先对需要用到的数据进行初始化。
Rpush list-key1 val5 val2 //list-key1值为:val1 val6 val7 val5 val2
Rpush list-key2 vala valb valc vald vale //list-key2值为:vala valb valc vald vale
Blpop list-key1 list-key2 100 //list-key1值为:val6 val7 val5 val2
//list-key2值为:vala valb valc vald vale7、Brpop
Brpop list-key2 list-key1 100 //list-key1值为:val6 val7 val5 val2
//list-key2值为:vala valb valc vald8、RpopLpush
RpopLpush list-key1 list-key2 //list-key1值为:val6 val7 val5
//list-key2值为:val2 vala valb valc vald9、BRpopLpush
BRpopLpush list-key2 list-key1 100 //list-key1值为:vald val6 val7 val5
//list-key2值为:val2 vala valb valc
四、任务调度系统简单案例
生产者不断产生任务,放入task-queue中,消费者不断从中取出任务来处理,同时放入temp-queue中进行缓存。如果任务执行成功,则清除temp-queue中暂存的任务,否则将temp-queue中暂存的任务再插回到task-queue中。