Redis 的使用
Redis 的使用
安装
$ brew install redis
# centos 示例
$ yum install redis
检查安装:
$ redis-server -v
Redis server v=6.0.3 sha=00000000:0 malloc=libc bits=64 build=5bce11175f58e836
启动
$ brew services start redis
# centos 示例
$ systemctl 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
删除键值
删除键值:
DEL key [key ...]
清空所有键:
flushall
数值型的增减
对于数值类型,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
与 EXPIRE
和 TTL
对应,单位为毫秒
数组数据类型/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 表示存在否则 0SMEMBERS
:返回所有元素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