“Try Redis” 试用指南

来源:互联网 发布:易语言游戏登陆器源码 编辑:程序博客网 时间:2024/05/29 03:46

Redis 是一个开源的内存数据存储结构,被用作数据库、缓存或者消息中间件。Redis 支持的数据类型包括字符串、哈希值、列表、集合、支持范围查询的有序集合、位图、HyperLogLog、支持半径查询的地理空间索引。Redis 支持内建的复制、Lua 脚本、LRU(Least Recently Used)回收、会话、不同级别的磁盘持久等功能,并通过 Redis Sentinel 和 Redis Cluster 自动分区来提供高可靠性。

如果不想在本机上安装 Redis,而只想试用一下,领略 Redis 的主要特征,可以登陆如下的交互式在线教程。

http://try.redis.io

截图
try.redis.io

我们可以看到,这是一个类似于命令行交互的界面,输入 tutorial 就开始了教程,然后一直输入 next 就可以了,help 可以显示支持的所有命令,现在我将所有的教程翻译在这里。

下面将涉及到如下内容

  1. 第一步:存储一个键值对
  2. 对键值对的简单操作
  3. Redis 的原子操作
  4. 键值对存活时间简介
  5. 列表(list)
  6. 集合(set)
  7. 有序集合(sorted list)
  8. 哈希(hash)
  9. 更多有用内容

1. Redis 以所谓的键值对来存储数据,这种方法也常被成为 NoSQL 数据库。键值对的本质是在“键”中存储某种数据(“值”)的能力,只要我们知道“键”是什么,数据库中存储的数据(“值”)可以被取出。例如,我们可以用命令“SET”来将值“fido”存在键“server:name”之中

SET server:name "fido"

Redis 将永久的存储这个数据,我们可以随后通过命令“GET”来询问键“server:name”中究竟存储了什么数据,Redis 将回答你“fido”

GET server:name => "fido"

2. 对于键值对的其他常见的操作包括:“DEL”来删除一个特定的键值对,“SET-if-not-exists (SETNX)”用来在一个键不存在时创建这个键并赋值,“INCR ”用来对一个键中存储的数字进行原子自加运算

SET connections 10INCR connections => 11INCR connections => 12DEL connectionsINCR connections => 1

3. 上面的 INCR 值得一提,我们也可以在程序中做自加,为何 Redis 要提供这样一个操?下面的自加伪代码看起来很简单

x = GET countx = x + 1SET count x

上面的代码问题在于,只有在一个使用者时可以正常运行。加入有两个客户端同时运行上面的代码修改 count,

客户端 A 读取 count 的值是 10.客户端 B 读取 count 的值是 10.客户端 A 将 10 加 1 并将 count 存储为 11.客户端 B 将 10 加 1 并将 count 存储为 11.

那么此时 count 中的实际值是 11 而非我们想要的 12!这源于这个加 1 的操作是不具备原子性的。而 Redis 的 INCR 命令可以阻止这种情况,因为其具备原子性。Redis 针对很多不同类型数据提供了类似的原子操作。

4. Redis 可以通过“EXPIRE”和“TTL”操作一个键的存活时间

SET resource:lock "Redis Demo"EXPIRE resource:lock 120

上面的命令使得键“resource:lock”在120秒后被删除。如果想知道一个键还有多久的存活时间,可以用“TTL”命令来返回以秒为单位的剩余存活时间

TTL resource:lock => 113// after 113sTTL resource:lock => -2

上例中“TTL”最后输出的“-2”意味着键不存在。如果是输出“-1”则意味着键将永远存在。注意:如果你“SET”一个键,其“TTL”值将被重置

SET resource:lock "Redis Demo 1"EXPIRE resource:lock 120TTL resource:lock => 119SET resource:lock "Redis Demo 2"TTL resource:lock => -1

5. Redis 也支持更复杂的数据结构,我们首先来看列表(list)。列表指的是一系列有序值,操作列表的常用命令有 RPUSH, LPUSH, LLEN, LRANGE, LPOP, RPOP。只要一个键没有被定义为其他数据类型,你就能定义这个键为列表类型(换言之你想把一个键当做列表使用,要么它已经被定义为列表了,要么就是还没有被使用)

RPUSH 将一个新值添加到列表的尾部

RPUSH friends "Alice"RPUSH friends "Bob"

LPUSH 将一个新值添加到列表的头部

LPUSH friends "Sam"

LRANGE 返回一个列表的子集,你只需要将你想获得的子集的第一个和最后一个元素的索引值作为输入。如果最后一个字符的索引值输入了-1,则表明你想从某个位置一直获取到列表的结尾

LRANGE friends 0 -1 => 1) "Sam", 2) "Alice", 3) "Bob"LRANGE friends 0 1 => 1) "Sam", 2) "Alice"LRANGE friends 1 2 => 1) "Alice", 2) "Bob"

LLEN 返回当前列表的长度

LLEN friends => 3

LPOP 删除并返回列表的第一个元素(最左)

LPOP friends => "Sam"

RPOP 删除并返回列表的最后一个元素(最右)

RPOP friends => "Bob"

注意,上例中的friends此时仅剩“Alice”一个值了

LLEN friends => 1LRANGE friends 0 -1 => 1) "Alice"

6. 下一个我们讨论的数据类型是集合(set)。集合类似于列表,除了集合中的元素是无序的且每个元素仅出现一次(只被保存一个副本)。一些关于集合的常用命令是:SADD, SREM, SISMEMBER, SMEMBERS, SUNION.

SADD 向集合中添加值(成功返回1,如果元素已经在集合中返回0)

SADD superpowers "flight"SADD superpowers "x-ray vision"SADD superpowers "reflexes"

SREM 从集合中删除值(成功返回1,如果元素不在集合中返回0)

SREM superpowers "reflexes"

SISMEMBER 用来测试一个值是否在集合中,如果在就返回1,否则返回0

SISMEMBER superpowers "flight" => 1SISMEMBER superpowers "reflexes" => 0

SMEMBERS 返回集合中所有元素的列表

SMEMBERS superpowers => 1) "flight", 2) "x-ray vision"

SUNION 将两个或多个集合整合在一起(取并集),并返回这些集合中所有元素的值

SADD birdpowers "pecking"SADD birdpowers "flight"SUNION superpowers birdpowers => 1) "pecking", 2) "x-ray vision", 3) "flight"

7. 虽然集合是一个方便灵活的数据结构,但其无序性使得集合不适合一些应用场景。这也是为何从 Redis 1.2 开始引入有序集合的原因(Sorted Sets)

有序集合类似于一个普通的集合,但在有序集合中每个值都一个对应的“分数”,用来在集合中给元素进行排序

ZADD hackers 1940 "Alan Kay"ZADD hackers 1906 "Grace Hopper"ZADD hackers 1953 "Richard Stallman"ZADD hackers 1965 "Yukihiro Matsumoto"ZADD hackers 1916 "Claude Shannon"ZADD hackers 1969 "Linus Torvalds"ZADD hackers 1957 "Sophie Wilson"ZADD hackers 1912 "Alan Turing"

在上例中,有序集合 hackers 的值是有名的黑客的名字,对应的“分数”是该黑客的出生年

ZRANGE hackers 2 4 => 1) "Claude Shannon", 2) "Alan Kay", 3) "Richard Stallman"

8. 简单的字符串,集合和有序集合已经可以完成许多工作,但还有一种 Redis 可以处理的有用的数据结构: 哈希(Hash)

哈希是字符串到字符串的映射,所以哈希特别适合对“对象”进行建模(例如:“用户”对象可能包含多个值域,如姓、名、年龄等等)

HSET user:1000 name "John Smith"HSET user:1000 email "john.smith@example.com"HSET user:1000 password "s3cret"

用 HGETALL 命令来取回哈希表中存储的全部元素

HGETALL user:1000=>1) "name"2) "John Smith"3) "email"4) "john.smith@example.com"5) "password"6) "s3cret"

也可以用 HMSET 命令一次设置多个域的取值:

HMSET user:1001 name "Mary Jones" password "hidden" email "mjones@example.com"

通过 HGET 或 HMGET 命令来获取某(几)个域的对应取值

HGET user:1001 name => "Mary Jones"

哈希表域的数值取值和简单的字符串读写操作相同,并且 Redis 提供了增长这些数值取值的原子操作

HSET user:1000 visits 10HINCRBY user:1000 visits 1 => 11HINCRBY user:1000 visits 10 => 21HDEL user:1000 visitsHINCRBY user:1000 visits 1 => 1

您可以查看关于哈希这种数据结构的全部命令列表。

9. 以上就是官方 Try Redis 教程网站的全部教程。除了上面介绍的这些例子,其支持的全部命令如下

DECR, DECRBY, DEL, EXISTS, EXPIRE, GET, GETSET, HDEL, HEXISTS, HGET, HGETALL, LLEN, LPOP, LPUSH, LRANGE, LREM, LSET, LTRIM, MGET, MSET, MSETNX, MULTI, PEXPIRE, SRANDMEMBER, SREM, SUNION, SUNIONSTORE, TTL, TYPE, ZADD, ZCARD, ZCOUNT, ZINCRBY, ZRANGE, ZRANGEBYSCORE, ZRANK, ZREM, ZREMRANGEBYSCORE, ZREVRANGE, ZSCORE

以下链接中将进一步的介绍 Redis 的相关内容:

Redis 官方文档
全部命令参考
在 Redis 中实现类似于 Twitter 的仿制网站
Redis 数据类型介绍
菜鸟学院 Redis 教程