分享

Redis入门 基础教程

sstutu 发表于 2015-5-28 16:51:04 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 11083

问题导读

1.Redis命令中DEL、SETNX、INCR命令如何操作?
2.INCR 命令的作用是什么?
3.让一个键值对只存在于指定的时间段内,用什么命令实现?









简介

Redis 是一个键值存储仓库,经常被称为 NoSQL 数据库。键值存储仓库的本质是有能力按 照一个键映射一个值的方式存储一些数据,然后你可以只通过这个键寻找到你之前通过这个 键存储的值。我们可以使用命令SET将值『fido』存储在键『server:name』中:


[mw_shl_code=bash,true]SET server:name "fido"[/mw_shl_code]

Redis 将会把我们的数据永久存储。于是,我们可以假设这样询问 Redis 数据库:键 server:name 对应的值是什么? 然后,Redis 会返回『fido』。

[mw_shl_code=bash,true]GET server:name # => "fido"[/mw_shl_code]

下面列出了一些其他常用的命令:
  • DEL 根据给定的键,删除相应的键值关系
  • SETNX 当且仅当给定键没有指定值的时候,才设定相应的键值对
  • INCR 将数字递增


递增

对于 INCR 命令,我们有一些特别的事情要说明。Redis 为什么会提供一个自己很简单就 能实现的功能呢?就像下面这么简单:

[mw_shl_code=bash,true]x = GET count
x += 1
SET count x[/mw_shl_code]

然而问题是,这种递增操作只能用于单客户端上。看一下,如果两个客户端同时执行这样 的操作会发生什么:
  • 客户端 A 读取值 x 为10
  • 客户端 B 读取值 x 为10
  • 客户端 A 写 x 的值为11
  • 客户端 B 写 x 的值为11
我们希望 x 的值为12,但是真实的 x 的值仅仅是11,这是因为你自己定义的递增操作不是 一个原子性操作。使用 Redis 的 INCR 命令可以防止这样的事情发生, 因为它是一个原 子性操作。Redis 为许多不同类型的数据提供了类似的原子性操作。

过期
Redis 可以使用命令 EXPIRE 和 TTL,能让一个键值对只存在于指定的时间段内。

[mw_shl_code=bash,true]SET resource:lock "Redis Demo"
EXPIRE resource:lock 120[/mw_shl_code]

这会导致键 resource:lock 会在120s 后被删除,你可以使用 TTL 去查看一个键还能存 在多少时间:
[mw_shl_code=bash,true]TTL resource:lock # => 120

# after 122s later
TTL resource:lock # => -2[/mw_shl_code]


这里的 -2 是指 resource:lock 已经不存在了,如果返回值是 -1 说明这个键永远不会过 期。注意:当你使用 SET 重新设置一个键, 它对应的 TTL 就会被重置。
[mw_shl_code=bash,true]SET resource:lock "Redis demo 1"
EXPIRE resource:lock 120
TTL resource:lock # => 119
SET resoource.lock "Redis demo 2"
TTL resource:lock # => -1[/mw_shl_code]


列表

此外,Redis 也支持一些更复杂的数据结构。我们第一个会看的是列表。一个列表是一系列 有序的值。与数组有关的一系列操作是:RPUSH, LPUSH, LLEN, LRANGE, LPOP和 RPOP。列表和普通的值一样,可以被直接使用。

RPUSH 将值添加到列表的末尾

[mw_shl_code=bash,true]RPUSH friends "Alice"
RPUSH friedns "Joe"[/mw_shl_code]

LPUSH 将值添加到列表的开始
[mw_shl_code=bash,true]LPUSH friends "Sam"[/mw_shl_code]

LRANGE是从列表中去一个指定范围的子集。它通过你想取的范围的第一个元素的下标和 最后一个元素的下标作为参数。将 -1 作为参数意味着取值到列表的最后。
[mw_shl_code=bash,true]LRANGE friends 0 -1 # => 1) "Sam", 2) "Alice", 3) "Joe"
LRANGE friends 0  1 # => 1) "Sam", 2) "Alice"
LRANGE friends 1  2 # => 1) "Alice", 2) "Joe"[/mw_shl_code]

LLEN 返回指定列表的长度
[mw_shl_code=bash,true]LLEN friends # => 3[/mw_shl_code]

LPOP 从列表中删除第一个元素,并将它作为返回值
[mw_shl_code=bash,true]LPOP friends # => "Sam"[/mw_shl_code]

RPOP 从列表中删除最后一个元素,并将它作为返回值
[mw_shl_code=bash,true]RPOP friends # => "Joe"[/mw_shl_code]

注意看现在的列表:
[mw_shl_code=bash,true]LLEN friends # => 1
LRANGE friends 0 -1 # => 1) "Alice"[/mw_shl_code]


集合

接下来我们要看的数据结构是集合。集合和列表类似,但是集合中元素是无序且不能重复的。 和集合有关的一些重要的命令是:SADD, SREM, SISMEMBER, SMEMBERS 和 SUNION.

SADD 将给定的值添加到集合中

[mw_shl_code=bash,true]SADD superpowers "flight"
SADD superpowers "x-ray vision"
SADD superpowers "reflexes"[/mw_shl_code]

SREM 从集合中移除指定的值
[mw_shl_code=bash,true]SREM superpowers "reflexes"[/mw_shl_code]

SISMEMBER 检查一个值是否在集合中,返回0不在,返回1在。
[mw_shl_code=bash,true]SISMEMBER superpowers "flight" # => 1
SISMEMBER superpowers "reflexes" # => 0[/mw_shl_code]

SMEMBERS 返回集合中所有的元素
[mw_shl_code=bash,true]SMEMBERS superpowers # => 1) "flight", 2) "x-ray vision"[/mw_shl_code]

SUNION 合并两个或者更多个集合,并且将所有的元素返回。
[mw_shl_code=bash,true]SADD birdpowers "pecking"
SADD birdpowers "flight"
SUNION superpowers birdpowers # => 1) "pecking", 2) "flight", 3) "x-ray vision"
[/mw_shl_code]


可排序集合

集合是一个非常有用的数据类型,但是因为它是无序的,所以因此会导致很多的问题。因此 Redis 1.2 开始添加了可排序集合。可排序集合和标准的集合类似,只是添加了一个分数和 集合中的元素相关联。这个分数用来给元素排序。

[mw_shl_code=bash,true]ZADD hackers 1940 "Alan Kay"
ZADD hackers 1906 "Grace Hopper"
ZADD hackers 1954 "Wang Zhi He"
ZADD hackers 1988 "Li Feng"

ZRANGE hackers 1, 3 # => 1) "Alan Kay", 2) "Grace Hopper", 3) "Wang Zhi He"[/mw_shl_code]


哈希表

除了字符串、列表、集合之外,Redis 还能储存一种类型的数据————哈希表。哈希表将两个 字符串类型的值映射在一起,它是最好的用来表示对象的数据结构。

[mw_shl_code=bash,true]HSET user:1000 name "John Smith"
HSET user:1000 email "john.smith@google.com"
HSET user:1000 password "public"[/mw_shl_code]

使用命令 HGETALL 获得保存的数据
[mw_shl_code=bash,true]HGETALL user:1000[/mw_shl_code]

我们也可以一起行设置多个域
[mw_shl_code=bash,true]HMSET user:1001 name "Zack Lee" email "zack.lee@facebook.com" password "public"[/mw_shl_code]

我们也可以只获取特定域的值:

[mw_shl_code=bash,true]HGET user:1001 name # => "Zack Lee"[/mw_shl_code]

数字类型的值在哈希表里面有一些方便的原子性的递增方法:
[mw_shl_code=bash,true]HSET user:1000 visits 10
HINCRBY user:1000 visits 1  # => 11
HINCRBY user:1000 visits 10 # => 21
HDEL    user:1000 visits
HINCRBY user:1000 visits 1  # => 1[/mw_shl_code]

关于哈希表的完整命令列表,请查看官方文档


更多关于 Redis 文档:











欢迎加入about云群425860289432264021 ,云计算爱好者群,关注about云腾讯认证空间

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条