渣翻Redis基础命令学习 (上)
最近老板推荐了一个网站:http://try.redis.io/
在这个网站上可以直接使用Redis的一些基础的命令,这样不用自己安装配置数据库了,对于初学者迅速上手Redis很有帮助。
这个网站也附带了最基础的教程,接下来的几篇文章我会尝试翻译这些基础教程。
对键值对的赋值SET, 取值GET, 删除DEL
SET server:name "fido"
GET server:name => "fido"
SET server:name "dido"
GET server:name => "dido"
SETNX server:name "fido"
GET server:name => "dido"
SETNX new:server:name "fido"
GET new:server:name => "fido"
DEL server:name => 1
DEL server:name => 0
GET server:name => (nil)
redis键值都是全是string,返回空为null/nil,返回布尔值为1/0. SETNX(SET-if-not-exists)如果key不存在则赋值
原子增加键值
SET connections 10
INCR connections => 11
INCR connections => 12
DEL connections
INCR connections => 1
GET connections => 1
INCR(increment), 为给定的key的值增1,前提是那个值本身必须是个整数,即使redis本身存储的是string。如果给定的key在库中并不存在,就会创建一个键为给定的key,值为0的键值对,然后再增1。
为什么要做这样一个简单的运算符呢,即使用代码实现也是非常简单的两行,如:
x = GET count
x = x + 1
SET count x
这样似乎没有问题呢。可这是在一个客户端操作这个键值对的情况下。如果有多个客户端同时操作这个值,就会出现问题:
- 小明的代码读取了count的值为10,赋给了x.
- 同时小红的代码也读取了count的值,赋给了x.
- 小明将x的新值11赋给了count.
- 小红将x的新值11赋给了count.
我们本愿是count的值应该是12,可现在只有了11了,明明操作了两次,为什么会这样?在高并发的场景下,这种情况很普遍,重新赋值时间即使很短,也不能保证不会出问题啊。所以应该使用原子操作符,直接对数据库进行细粒度的操作。类似这种原子操作符,reids多了去。
设置key过期
redis可以设置一个key的保存时间,过期失效。使用EXPIRE命令设置,搭配TTL命令查询。
SET resource:lock "Redis Demo"
EXPIRE resource:lock 120
于是这个key resource:lock只会存在120秒,你可以用TTL命令查询这个key剩余的存在时间:
TTL resource:lock => 113
// after 113s
TTL resource:lock => -2
返回-2
代表key已经不存在,返回-1
代表此key不会过期。注意如果你再次SET这个key的值,那么过期时间也随之消失。
SET resource:lock "Redis Demo 1"
EXPIRE resource:lock 120
TTL resource:lock => 119
SET resource:lock "Redis Demo 2"
TTL resource:lock => -1
生存时间可以通过使用 DEL
命令来删除整个 key
来移除,或者被 SET
和 GETSET
命令覆写(overwrite),这意味着,如果一个命令只是修改(alter)一个带生存时间的 key 的值而不是用一个新的 key 值来代替(replace)它的话,那么生存时间不会被改变。
比如说,对一个 key 执行 INCR
命令,对一个列表进行 LPUSH
命令,或者对一个哈希表执行 HSET
命令,这类操作都不会修改 key 本身的生存时间。
另一方面,如果使用 RENAME
对一个 key 进行改名,那么改名后的 key 的生存时间和改名前一样。
RENAME
命令的另一种可能是,尝试将一个带生存时间的 key 改名成另一个带生存时间的 another_key ,这时旧的 another_key (以及它的生存时间)会被删除,然后旧的 key 会改名为 another_key ,因此,新的 another_key 的生存时间也和原本的 key 一样。
使用 PERSIST
命令可以在不删除 key 的情况下,移除 key 的生存时间,让 key 重新成为一个『持久的』(persistent) key 。
EXPIREAT
EXPIREAT
的作用和 EXPIRE
类似,都用于为 key 设置生存时间。
不同在于 EXPIREAT
命令接受的时间参数是 UNIX
时间戳(unix timestamp)。
redis> SET cache www.google.com
OK
redis> EXPIREAT cache 1355292000 # 这个 key 将在 2012.12.12 过期
(integer) 1
redis> TTL cache
(integer) 45081860