Redis基本数据结构String List

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的阻塞操作)

列表有一个特殊的特性,使它们适合于实现队列,并且通常作为进程间通信系统的构建块:阻塞操作。

想象一下,您想用一个流程将项目推到列表中,并使用不同的流程来实际处理这些项目。这是通常的生产者/消费者模式,可以通过以下简单方式实现:

  1. 为了将项目推到列表中,生产者调用LPUSH。
  2. 为了从列表中提取/处理项目,消费者调用RPOP。

但是,有时列表可能是空的,并且没有什么要处理的,所以RPOP只返回NULL。在这种情况下,消费者必须等待一段时间,然后使用RPOP重试。这叫做轮询,在这种情况下不是一个好主意,因为它有几个缺点:

  1. 强制Redis和客户端处理无用的命令(当列表为空时,所有请求都无法完成实际工作,它们只返回NULL)。
  2. 为项目处理增加了延迟,因为在工作程序收到NULL后,它会等待一段时间。为了使延迟更小,我们可以在调用RPOP之间等待更少的时间,从而放大问题1,即更多无用的调用Redis。

因此,Redis实现了名为BRPOP和BLPOP的命令,这些命令是RPOP和LPOP的版本,如果列表为空,则可以阻止:只有在列表中添加了新元素或达到用户指定的超时时,它们才会返回到调用者。

> brpop tasks 5
1) "tasks"
2) "do_something"

这意味着:“等待列表任务中的元素,但如果5秒后没有元素可用,则返回”。

请注意,您可以使用0作为超时来永久等待元素,也可以指定多个列表,而不仅仅是一个列表,以便同时等待多个列表并在第一个列表接收到元素时得到通知

关于BRPOP需要注意的几点:

  1. 客户端以有序的方式提供服务:阻止等待列表的第一个客户端,当某个元素被其他客户端推送时,首先提供服务,依此类推。
  2. 返回值与RPOP不同:它是一个双元素数组,因为它还包括键的名称,因为BRPOP和BLPOP能够阻止等待多个列表中的元素。
  3. 如果达到超时,则返回NULL。

# Automatic creation and removal of keys(创建或删除keys的原子性操作)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值