Redis 的使用

安装

$ brew install redis

检查安装:

$ redis-server -v
Redis server v=6.0.3 sha=00000000:0 malloc=libc bits=64 build=5bce11175f58e836

启动

$ brew services start redis

检查是否在运行:

$ redis-cli ping
PONG

停止

另,停止 Redis 可通过如下的命令:

$ redis-cli shutdown

使用

登录

$ redis-cli
127.0.0.1:6379>

帮助

使用前,了解下帮助,可方便使用过程中随时查阅。

127.0.0.1:6379> help
redis-cli 6.0.3
To get help about Redis commands type:
      "help @<group>" to get a list of commands in <group>
      "help <command>" for help on <command>
      "help <tab>" to get a list of possible help topics
      "quit" to exit

To set redis-cli preferences:
      ":set hints" enable online hints
      ":set nohints" disable online hints
Set your preferences in ~/.redisclirc

查看具体命令的帮助

help rpop

  RPOP key
  summary: Remove and get the last element in a list
  since: 1.0.0
  group: list

基本存取

SET server:name "fido"
GET server:name => "fido"

可通过 EXISTS 检查 key 是否存在:

EXISTS server:name => 1
EXISTS server:blabla => 0

数值型的增减

对于数值类型,Redis 提供了相应命令对其进行增减操作:

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

除了上面步长为 1 的增减,也可使用 INCRBY DECRBY 一次增减指定步长:

INCRBY connections 100 => 101
DECRBY connections 10 => 90

操作的原子性

对于数字的增减,完全可以取出来后自己完成,比如:

x = GET count
x = x + 1
SET count x

之所以提供对应的命令,是考虑到并发的问题。

假设对于同一 key,多个用户都读取后进行了增减操作,那么最后得到的值存在不确定性,比如:

  • 用户 A 读取 count 得到 10
  • 用户 B 读取 count 得到 10
  • 用户 A 对其加 1 并保存得到 11
  • 用户 B 对其加 1 并保存得到 11

这里 A B 都对同一字段进行了加 1 操作,期望得到 12 ,但实际得到的是 11。

如果 B 的操作是在 A 保存之后,则一切正常。

所以当并发时,就会存在时机上的不确定性。

使用 Redis 提供的方法进行操作时用户无需关心上面的时机问题,Redis 保证了操作的原子性的,防止了上面问题的出现。

EXPIRE & TTL

存储时还可为 key 指定过期时间,过期后自动删除,以于一些临时和周期性数据特别有用。

设置过期时间

SET resource:lock “redis demo”
EXPIRE resource:lock 120

或者,在 set 的时候可以同时设置过期时间:

SET resource:lock “redis demo” ex 120

查看过期时间

TTL = Time to Live,单位为秒。

查看还有多久过期:

TTL resource:lock => 110

TTL 的返回值:

  • 未过期的情况下,返回剩余时间
  • 过期后,返回 -2
  • -1 表示永远不过期

注意:重新 SET 后,过期时间失效,变量变成永不过期

SET resource:lock “redis demo” ex 120
SET resource:lock “redis demo”
TTL resource:lock => -1

取消过期的设置

SET resource:lock "Redis Demo 3" EX 5
PERSIST resource:lock
TTL resource:lock => -1

PEXPIRE and PTTL

EXPIRETTL 对应,单位为毫秒

数组数据类型/list

可用的操作:

  • 添加:RPUSH,LPUSH
  • 移除:RPOP,LPOP
  • 其他:LLEN,LRANGE(L 前缀表示 List)

数组元素的添加删除

这里,可不事先创建 key,直接添加元素时会自动创建。

RPUSH friends “Bob”
EXISTS friends => 1

其中:

  • RPUSH 添加元素的数组末尾并返回操作后的数组长度
  • LPUSH 添加元素到数组首位并返回操作后的数组长度
  • RPOP 移除末尾元素并返回该元素
  • LPOP 移除首位元素并返回该元素

自动创建 key 的情形对其他类型数据也适用。

与自动创建 key 对应,如果执行命令后将 key 置空了,key 也会自动被删除。

RPUSH friends “Bob”
EXISTS friends => 1
RPOP friends
EXISTS friends => 0

LPUSH/RPUSH 可接收多个元素作为参数:

LPUSH friends "Alice" "David"

取数组子集

LRANGE 接收两个参数

  • 第一个表示子集中首个元素的索引,从 0 开始
  • 第二个表示子集最后个元素的索引,-1 表示取到末尾,-2 表示取到倒数第二个
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"

Set 数据类型

类似数组,但元素无序且唯一,前者可快速访问首尾附近的元素,后者在确定元素是否存在上有优势。

可用操作:

  • SADD:添加元素,支持同时添加多个,
    • 返回 0 表示元素已经存在,1 表示之前不存在
    • 同时添加多个时,返回不存在的元素的个数
  • SREM:删除元素,返回 1 或 0 表示元素存在与否
  • SISMEMBER:检查元素是否存在,返回 1 表示存在否则 0
  • SMEMBERS:返回所有元素
  • SUNION:合并多个 set 并返回合并后的结果

LRANGE 类似,这里 S 前缀表示 Set

其他操作还有:

  • SPOP,与 list 的 LPOP/RPOP 类似,但因为 Set 是无序的,返回的元素不固定。
SADD letters a b c d e f => 6
SPOP letters 2 => 1) "c" 2) "a"
  • SRANDMEMBER,与 SPOP 类似,但不删除元素,只随机返回元素。当指定数量为负数时,返回中可能存在重复的元素。

有序 Set

无序 Set 使用上会存在很多不便,Redis 1.2 引入了有序 Set。和常规 Set 雷同,只是每个元素有了自己的 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"
ZRANGE hackers 2 4 => 1) "Claude Shannon", 2) "Alan Kay", 3) "Richard Stallman"

Hash 数据类型

键值对形式,可表示对象。

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

或者同时设置多个字段:

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

获取:

HGETALL user:1000

获取单个字段:

HGET user:1001 name => "Mary Jones"

数值类型的字段

对于数值类型的字段,同简单字符串一样,可对其进行增加或减少操作:

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

相关资源