来自网上的一个互动教程,TRY REDIS,通过练习初步认识redis,也分享给大家。
TUTORIAL
Redis是一个键值存储,一般归为NoSQL数据库。key-value存储实质是将data存放到一个key里,之后只有当我们知道key值时才能取出对应的data。
SET
指令将valuefido
存储到server:name
这个key中:
SET server:name "fido"
GET
取出这个key中的值:
GET server:name
"fido"
DEL
删除指定的key和关联的值,SETNX
(SET-if-not-exists)设置一个值当它不存在时,INCR
自增一个存储在key中的值:
SET connections 10
INCR connections => 11
INCR connections => 12
DEL connections
INCR connections => 1
为什么要用INCR自增,而不是自己完成:
x = GET count
x = x + 1
SET count x
上面也是一个自增,但是它仅能在一个client的时候正常工作,如果有两个同时访问该值时可能会出错。
1. client A读出count为10
2. client B读出count为10
3. Client A增加1然后设为11
4. Client B增加1然后设为11
结果并不是我们想要的12,而是11。这是因为通过上面代码的增加方式并不是原子操作
。而通过INCR命令可以避免发生这样的事情。因为它是原子操作。Redis这对不同的数据类型,还提供了很多像这样的原子操作。
通过EXPIRE
and TTL
,我们可以告知Redis保存一个key一段固定的时间。
SET resource:lock "Redis Demo"
EXPIRE resource:lock 120
这会让resource:lock这个key在120秒后被删除。用TTL可以查看还有多久被删除,-2表示已经被删除。
TTL resource:lock => 113
// after 113s
TTL resource:lock => -2
TTL结果-1表示不会过期,如果中途重新设置了相同key的值,TTL会被重置为-1。
SET hehe "Demo 1"
EXPIRE hehe 120
TTL hehe => 118
SET hehe "Demo 2"
TTL hehe => -1
Redis也支持一些复杂的数据结构
list
列表是一列有序的值。一些重要的和list交互的命令有RPUSH, LPUSH, LLEN, LRANGE, LPOP, RPOP
。
RPUSH 将新的value放到list尾部:
RPUSH friends "Alice"
RPUSH friends "Bob"
LPUSH 将新的value放在list开始位置:
LPUSH friends "Sam"
现有列表friends: [“Sam”, “Alice”, “Bob”]。
LRANGE 得到一个子列表。通过传入索引值,-1表示直到list尾部。
LRANGE friends 0 -1
// 1)"Sam", 2)"Alice", 3)"Bob"
LRANGE friends 0 1
// 1)"Sam", 2)"Alice" 可以看到不同于python是闭区间的
LLEN 返回当前list长度:
LLEN friends => 3
LPOP 移除第一个元素并返回该值:
LPOP friends => "Sam"
RPOP 移除最后一个元素并返回。
现在list就只剩一个值了:
LLEN friends => 1
LRANGE friends 0 -1 => 1) "Alice"
set
set和list很像,除了set没有固定的顺序,每个元素在当中只能出现一次。一些重要的命令,SADD, SREM, SISMEMBER, SMEMBERS, SUNION
。
SADD 添加给定的值到set
SADD superpower "x-ray vision"
SADD superpower "flight"
SADD superpower "reflexes"
SREM 从set移除指定的value:
SREM superpower "reflexes"
SISMEMBER 测试给定的值是否在set,如果是返回1,否则0:
SISMEMBER superpower "flight" => 1
SISMEMBER superpower "reflexes" => 0
SMEMBERS 返回set所有的成员。
SUNION 合并两个或多个sets并返回所有的元素:
SADD birdpowers "pecking"
SADD birdpowers "flight"
SUNION superpowers
// 1) "pecking", 2) "x-ray vision", 3) "flight"
set是一种十分方便的数据类型,但是因为它的无序,导致它不能处理一些问题。所以Redis在1.2中介绍了Sorted Sets。它和普通的set类似,但是每个value有一个关联的score,这个score被用来排序。
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"
在这个例子中score是出生年,value是一些有名hacker的名字。
ZRANGE hackers 2 4 => 1) "Claude Shannon", 2) "Alan Kay", 3) "Richard Stallman"
Redis已经能够处理简单的字符串,set和sorted set,但是还有一种数据类型Redis可以处理:
Hash
哈希是字符串字段和字符串值之间的映射,所以她是用来表示对象的完美数据类型。(比如一个User有一些字段,name/surname/age等等):
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 user:1001 name "Mary Jones" password "hidden" email "mjones@example.com"
HGET可以取回指定字段的值:
HGET user:1001 name => "Mary Jones"
数值在hash字段中的处理和字符串相同,下面是一些增量的原子操作:
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
更多关于Hash的操作指令,可以查看这里。
更多
以上是关于TRY Redis Tuturial的内容,更多内容请参考以下链接: