文章目录
Keys
- key可以为空值
- key长度不易过长,占内存,查询是比较浪费时间
- key长度不能太短,redis中存在很多的key,长度过短,可读性变差
- key最大512MB
- key建议明明规则,object-type:id,例如comment:4321:reply.to
Redis中的String类型是最简单的数据类型,在memcached中是一个只读类型
String
set mykey somevalue //存入数据
get mykey //获取value值
- set命令中会替换已存在的key相对应的值,即使值为空。
- string可以存储多种类型,甚至可以将jpeg格式的数据存入,最大值512MB。
- set命令可以选择当key存在时存入成功,或者key不存在时存入成功。
set mykey newval nx
set mykey newval xx
//原子性自增
incr mykey
//原子性加法
incrby mukey num
//多个keys同事设置值
mset a 10 b 20 c 30
//读个keys获取值
mget a b c
//是否存在相对应的key
exists mykey
//删除key
del mykey
//key的类型
type mykey
Key expiration
- 过期时间可以精确到秒和毫秒;
- 过期时间的判断精确到1毫秒内;
- 有关过期的信息被复制并保存在磁盘上,当您的Redis服务器保持停止时,时间实际上就过去了(这意味着Redis会保存密钥过期的日期);
设置过期数据代码演示:
> set key some-value
OK
> expire key 5
(integer) 1
> get key (immediately)
"some-value"
> get key (after some time)
(nil)
在设置key时同时设置过期指令:
> set key 100 ex 10
OK
> ttl key
(integer) 9
List
- Redis中List的实现方式是通过LinkedList;
- 使用LPUSH添加10个元素和RPUSH添加10000个元素的速度是差不多的;
- 对list中的元素进行随机访问的时候需要从头或尾进行遍历;
- 在redis中对于经常访问数组中间的元素时,经常使用sort set数据结构;
First steps with Redis Lists
常用指令
> rpush mylist A
(integer) 1
> rpush mylist B
(integer) 2
> lpush mylist first
(integer) 3
> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
注意,LRANGE使用两个索引,即要返回的范围的第一个和最后一个元素。这两个索引都可以是负数,告诉Redis从末尾开始计数:因此-1是最后一个元素,-2是列表的倒数第二个元素,依此类推。
在使用LPUSH 和 RPUSH时可以一次性存入多个数据。
> rpush mylist 1 2 3 4 5 "foo bar"
(integer) 9
> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
4) "1"
5) "2"
6) "3"
7) "4"
8) "5"
9) "foo bar"
取出数据操作(读取数据并删除数据)
> rpush mylist a b c
(integer) 3
> rpop mylist
"c"
> rpop mylist
"b"
> rpop mylist
"a"
Lists的常用案例
列表对于许多任务都很有用,下面是两个非常有代表性的用例:
记住用户在社交网络中发布的最新更新。
流程之间的通信,使用消费者-生产者模式,生产者将项目推送到列表中,消费者(通常是工人)消费这些项目并执行操作。Redis有特殊的列表命令,使这个用例更加可靠和高效。
例如,流行的Ruby库resque和sidekiq都在后台使用Redis列表来实现后台作业。
受欢迎的Twitter社交网络将用户发布的最新推文纳入Redis列表。
为了逐步描述一个常见的用例,假设您的主页显示了照片共享社交网络中发布的最新照片,并且您希望加快访问速度。
每次用户发布新照片时,我们都会将其ID添加到LPUSH列表中。
当用户访问主页时,我们使用LRANGE 0 9来获取最新发布的10个项目。
Capped lists
Redis允许去使用list作为一个复制集合,保留集合的前N个元素,抛弃其他的元素。
LTRIM命令和LRANGE相似,但是有一个明显的区别,LTRIM是将LRANGE获取的数值作为一个全新的集合保存下来。
> rpush mylist 1 2 3 4 5
(integer) 5
> ltrim mylist 0 2
OK
> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"
Blocking operations on Lists(Lists的阻塞操作)
列表有一个特殊的特性,使它们适合于实现队列,并且通常作为进程间通信系统的构建块:阻塞操作。
想象一下,您想用一个流程将项目推到列表中,并使用不同的流程来实际处理这些项目。这是通常的生产者/消费者模式,可以通过以下简单方式实现:
- 为了将项目推到列表中,生产者调用LPUSH。
- 为了从列表中提取/处理项目,消费者调用RPOP。
但是,有时列表可能是空的,并且没有什么要处理的,所以RPOP只返回NULL。在这种情况下,消费者必须等待一段时间,然后使用RPOP重试。这叫做轮询,在这种情况下不是一个好主意,因为它有几个缺点:
- 强制Redis和客户端处理无用的命令(当列表为空时,所有请求都无法完成实际工作,它们只返回NULL)。
- 为项目处理增加了延迟,因为在工作程序收到NULL后,它会等待一段时间。为了使延迟更小,我们可以在调用RPOP之间等待更少的时间,从而放大问题1,即更多无用的调用Redis。
因此,Redis实现了名为BRPOP和BLPOP的命令,这些命令是RPOP和LPOP的版本,如果列表为空,则可以阻止:只有在列表中添加了新元素或达到用户指定的超时时,它们才会返回到调用者。
> brpop tasks 5
1) "tasks"
2) "do_something"
这意味着:“等待列表任务中的元素,但如果5秒后没有元素可用,则返回”。
请注意,您可以使用0作为超时来永久等待元素,也可以指定多个列表,而不仅仅是一个列表,以便同时等待多个列表并在第一个列表接收到元素时得到通知
关于BRPOP需要注意的几点:
- 客户端以有序的方式提供服务:阻止等待列表的第一个客户端,当某个元素被其他客户端推送时,首先提供服务,依此类推。
- 返回值与RPOP不同:它是一个双元素数组,因为它还包括键的名称,因为BRPOP和BLPOP能够阻止等待多个列表中的元素。
- 如果达到超时,则返回NULL。
# Automatic creation and removal of keys(创建或删除keys的原子性操作)