可以在官网下载源码编译安装。对于 CentOS,还可以通过 yum install redis 安装。
Redis 安装完成后,通过 redis-server 命令可以启动 Redis 服务器,如果修改了配置文件,需要在启动服务器时指定配置文件的路径。通过 redis-cli 可以进入交互式的客户端(类似 MySQL 的 mysql 命令)。
数据类型 | 可存储的值的类型 | 支持的操作 |
---|---|---|
STRING | 字符串、整数、浮点数 | 操作整个字符串或字符串的一部分,整数和浮点数还可以执行自增、自减操作 |
LIST | 存储字符串的链表,允许有相同元素 | 链表两端增删元素(PUSH、POP),根据偏移量操作元素,读取一个或多个元素,根据节点的值查找、删除元素 |
HASH | 存储字符串键值对的无序散列表,适合存储对象。 每个 hash 可以存储 232 - 1 键值对(40多亿) |
增删查改单个键值对,读取所有键值对 |
SET | 存储字符串的无序数据结构(所有存储的元素不可相同) | 增删查改单个元素,检查元素是否存在,获取随机元素,求交集、并集、差集 |
ZSET | 有序集合(Sorted Set),存储字符串成员与浮点数分值(score)之间的有序映射(类似普通集合,所有存储的元素不可相同,但是分数可以重复),分值决定排列顺序 | 增删查改单个元素,根据分值范围(range)或成员读取元素 |
在 Redis 中,每存储一个键值对时,都可以为其设置过期时间,也可以修改或删除过期时间。
对于上面四种方式,Redis 内部最终都会转为使用 PEXPIREAT。
TTL 命令可以查看键值对的过期时间,永不过期的键返回 -1,已经过期(不存在)的键会返回 -2。EXPIRE 命令可以重设过期时间。
Redis 支持三种处理策略:
Redis 中,部分命令同时支持 5 种数据类型:
按照指定模式查找数据库中的键值。例如官方示例如下:
- redis> MSET firstname Jack lastname Stuntman age 35
- "OK"
- redis> KEYS *name*
- 1) "lastname"
- 2) "firstname"
- redis> KEYS a??
- 1) "age"
- redis> KEYS *
- 1) "lastname"
- 2) "firstname"
- 3) "age"
返回数据库键的数量:
- 127.0.0.1:6379> dbsize
- (integer) 4
判断键值是否存在。可以同时判断多个键值,用空格分割,返回存在的键值的数量:
- redis> SET key1 "Hello"
- "OK"
- redis> EXISTS key1
- (integer) 1
- redis> EXISTS nosuchkey
- (integer) 0
- redis> SET key2 "World"
- "OK"
- redis> EXISTS key1 key2 nosuchkey
- (integer) 2
删除键值对:
- redis> SET key1 "Hello"
- "OK"
- redis> SET key2 "World"
- "OK"
- redis> DEL key1 key2 key3
- (integer) 2
查看键值对的过期时间:
- redis> SET mykey "Hello"
- "OK"
- redis> EXPIRE mykey 10
- (integer) 1
- redis> TTL mykey
- (integer) 10
设置键值对的过期时间:
- redis> SET mykey "Hello"
- "OK"
- redis> EXPIRE mykey 10
- (integer) 1
- redis> TTL mykey
- (integer) 10
- redis> SET mykey "Hello World"
- "OK"
- redis> TTL mykey
- (integer) -1
删除过期时间:
- redis> SET mykey "Hello"
- "OK"
- redis> EXPIRE mykey 10
- (integer) 1
- redis> TTL mykey
- (integer) 10
- redis> PERSIST mykey
- (integer) 1
- redis> TTL mykey
- (integer) -1
查看数据类型:
- redis> SET key1 "value"
- "OK"
- redis> LPUSH key2 "value"
- (integer) 1
- redis> SADD key3 "value"
- (integer) 1
- redis> TYPE key1
- "string"
- redis> TYPE key2
- "list"
- redis> TYPE key3
- "set"
STRING 可以存储字符串、整型及浮点型。对于整型和浮点型可以执行自增和自减操作。
SET 指令用于设置键值对,可以同时设置过期时间,还可以指定只有在键已经存在(或不存在)时才进行设置。
GET 指定读取键对应的值,如果键不存在则返回 nil。
语法:
- set key value [EX seconds] [PX milliseconds] [NX|XX]
-
- get key
参数:
设置键值对,同时设置过期时间:
- 127.0.0.1:6379> set hello world EX 10
- OK
- 127.0.0.1:6379> ttl hello
- (integer) 7
- 127.0.0.1:6379> ttl hello
- (integer) -2
- 127.0.0.1:6379> get hello
- (nil)
- 127.0.0.1:6379> set hello world
- OK
- 127.0.0.1:6379> get hello
- "world"
- 127.0.0.1:6379> ttl hello
- (integer) -1
只有在键已经存在(或不存在)时才进行设置:
- 127.0.0.1:6379> set hello world
- OK
- 127.0.0.1:6379> get hello
- "world"
- 127.0.0.1:6379> ttl hello
- (integer) -1
- 127.0.0.1:6379> set hello world EX 10 NX
- (nil)
- 127.0.0.1:6379> ttl hello
- (integer) -1
- 127.0.0.1:6379> set hello world EX 10 XX
- OK
- 127.0.0.1:6379> ttl hello
- (integer) 8
MSET 指令一次设置多个键值对
MGET 指令一次读取多个键对应的值
语法:
- MSET key value [key value ...]
-
- MGET key [key ...]
示例:
- 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
- OK
- 127.0.0.1:6379> mget k1 k2 k3
- 1) "v1"
- 2) "v2"
- 3) "v3"
- 127.0.0.1:6379> keys k*
- 1) "k2"
- 2) "k3"
- 3) "k1"
将给定 key 的值设为 value ,并返回这个 key 对应的旧值。
语法:
- GETSET key value
示例:
- 127.0.0.1:6379> set hello world
- OK
- 127.0.0.1:6379> getset hello val
- "world"
- 127.0.0.1:6379> get hello
- "val"
如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。如果 key 不存在,则将给定 key 设为 value ,就像执行 SET key value 一样。
语法:
- APPEND key value
示例:
- 127.0.0.1:6379> get hello
- (nil)
- 127.0.0.1:6379> append hello good
- (integer) 4
- 127.0.0.1:6379> get hello
- "good"
- 127.0.0.1:6379> append hello " world"
- (integer) 10
- 127.0.0.1:6379> get hello
- "good world"
将 key 中储存的数字值增一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
语法:
- INCR key
示例:
- 127.0.0.1:6379> set hello 1
- OK
- 127.0.0.1:6379> incr hello
- (integer) 2
- 127.0.0.1:6379> incr hello
- (integer) 3
- 127.0.0.1:6379> get hello
- "3"
-
- 127.0.0.1:6379> del hello
- (integer) 1
- 127.0.0.1:6379> incr hello
- (integer) 1
将 key 所储存的值加上增量 increment 。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
语法:
- INCRBY key increment
-
- INCRBYFLOAT key increment
示例:
- 127.0.0.1:6379> set hello 1
- OK
- 127.0.0.1:6379> incrby hello 5
- (integer) 6
- 127.0.0.1:6379> incrbyfloat hello 5.5
- "11.5"
读取子字符串,字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。负数偏移量表示从字符串最后开始计数, -1 表示最后一个字符, -2 表示倒数第二个,以此类推。
语法:
示例:
- 127.0.0.1:6379> set hello "hello world!!"
- OK
- 127.0.0.1:6379> getrange hello 4 -1
- "o world!!"
- 127.0.0.1:6379> getrange hello 4 6
- "o w"
LIST 列表不能使用 GET 和 SET 命令。列表可以存储相同的字符串,索引从 0 开始,LRANGE 命令的结束索引是 -1 时表示到列表的最后一个元素。
支持的命令如下:
LPUSH:从左侧添加元素,可以一次添加多个元素。
RPUSH:从右侧添加元素,可以一次添加多个元素。
LPOP:从左侧弹出元素。
RPOP:从右侧弹出元素。
LINDEX:获取列表给定位置上的元素。
LRANGE:获取列表指定范围内的所有元素。
- 127.0.0.1:6379> get l
- (nil)
- 127.0.0.1:6379> rpush l 1
- (integer) 1
- 127.0.0.1:6379> get l
- (error) WRONGTYPE Operation against a key holding the wrong kind of value
- 127.0.0.1:6379> lindex l 1
- (nil)
- 127.0.0.1:6379> lindex l 0
- "1"
- 127.0.0.1:6379> rpush l 2
- (integer) 2
- 127.0.0.1:6379> lrange l 0 -1
- 1) "1"
- 2) "2"
- 127.0.0.1:6379> lpop l
- "1"
- 127.0.0.1:6379> lrange l 0 -1
- 1) "2"
SET 集合跟 LIST 列表类似,都可以存储多个字符串,但是 SET 中的字符串无序且不能相同。
支持的命令如下:
SADD:向集合添加元素。
SREM:从集合中删除元素。
SISMEMBER:检查元素是否已经存在于集合中。
SMEMBERS:获取集合中的所有元素。
SINTER:计算交集。
SUNION:计算并集。
SDIFF:计算差集。
- 127.0.0.1:6379> get s
- (nil)
- 127.0.0.1:6379> sadd s 666
- (integer) 1
- 127.0.0.1:6379> sadd s 777
- (integer) 1
- 127.0.0.1:6379> sadd s 888
- (integer) 1
- 127.0.0.1:6379> smembers s
- 1) "666"
- 2) "777"
- 3) "888"
- 127.0.0.1:6379> sismember s 666
- (integer) 1
- 127.0.0.1:6379> srem s 777
- (integer) 1
- 127.0.0.1:6379> sismember s 777
- (integer) 0
- 127.0.0.1:6379> smembers s
- 1) "666"
- 2) "888"
HASH 散列可以存储多个键值对。散列存储的键是字符串,值可以是字符串或数字,且散列的值为数字时可以执行自增或自减操作。很多字符串命令都有对应的散列版本。
可以将 Redis 中的散列看做关系数据库的行,可以同时读取或修改某个散列(用 key 标记)的多个字段(用 field 标记)。
支持的命令如下:
HSET:设置某个散列的键值对,如果散列已经存在则增加键值对。语法:HSET key field value
HGET:获取某个散列的指定的键对应的值。语法:HGET key field
HGETALL:获取某个散列的所有键值对。语法:HGETALL key
HDEL:删除某个散列的指定的键值对。语法:HGETALL key field [field ...]
示例:
- 127.0.0.1:6379> hgetall h
- (empty list or set)
- 127.0.0.1:6379> hset h k1 v1
- (integer) 1
- 127.0.0.1:6379> hset h k2 v2
- (integer) 1
- 127.0.0.1:6379> hset h k3 v3
- (integer) 1
- 127.0.0.1:6379> hgetall h
- 1) "k1"
- 2) "v1"
- 3) "k2"
- 4) "v2"
- 5) "k3"
- 6) "v3"
- 127.0.0.1:6379> hget h k1
- "v1"
- 127.0.0.1:6379> hdel h k1 k2
- (integer) 2
- 127.0.0.1:6379> hget h k1
- (nil)
ZSET 有序集合类似 HASH 散列,也存储键值对。有序集合的键成为成员(member),每个成员都不相同;值成为分值(score),必须是浮点数。有序集合既可以根据成员访问元素(类似散列),又可以根据分值及分值的排列顺序来访问元素。
向有序集合添加指定了分值的元素。
- zadd key [NX|XX] [CH] [INCR] score member [score member ...]
选项:
XX: 只更新已经存在的元素,不会添加新元素。
NX: 不会更新已经存在的元素,只会添加新元素。
CH: ZADD 命令默认返回添加的新元素数量,CH 选项将返回值修改为更改的元素总数(CHange)。更改的元素包括添加的新元素和更新分数的已有元素(如果分数不变,则不计算在内)。
INCR: 指定这个选项时,ZADD 的行为类似 ZINCRBY。这种模式下只能设置一个分值对。
示例,添加两个元素 a、b,分值分别为 10 和 20:
- 127.0.0.1:6379> zadd z 10 a 20 b
- (integer) 2
- 127.0.0.1:6379> zrange z 0 100
- 1) "a"
- 2) "b"
NX 表示如果 a 不存在,则添加 a 元素同时设置分值为 10(因为 a 已经存在,所以不会有任何修改):
- 127.0.0.1:6379> zadd z NX 10 a
- (integer) 0
没有添加新元素,所以返回 0(默认返回的是添加的新元素的数量):
- 127.0.0.1:6379> zadd z XX 10 a
- (integer) 0
通过 NX 可以成功添加元素:
- 127.0.0.1:6379> zadd z XX 10 aa
- (integer) 0
- 127.0.0.1:6379> zrange z 0 100
- 1) "a"
- 2) "b"
- 127.0.0.1:6379> zadd z NX 10 aa
- (integer) 1
- 127.0.0.1:6379> zrange z 0 100
- 1) "a"
- 2) "aa"
- 3) "b"
通过 CH 得到修改的元素数量:
- 127.0.0.1:6379> zadd z CH 30 a 100 aa
- (integer) 2
- 127.0.0.1:6379> zadd z CH 30 a 100 aa
- (integer) 0
删除元素,可以同时删除多个元素,空格分隔。
- zrem key member [member ...]
示例:
- 127.0.0.1:6379> zrem z a aa
- (integer) 2
- 127.0.0.1:6379> zrange z 0 100
- 1) "b"
根据排列顺序读取多个元素。start 和 stop 都是从零开始的索引,其中 0 是第一个元素,1 是下一个元素,依此类推。它们也可以是负数,表示从排序集的末尾开始的偏移,-1是排序集的最后一个元素,-2是倒数第二个元素,依此类推。
- zrange key start stop [WITHSCORES]
WITHSCORES 选项表示同时显示分数和值。
官方示例:
- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZADD myzset 2 "two"
- (integer) 1
- redis> ZADD myzset 3 "three"
- (integer) 1
- redis> ZRANGE myzset 0 -1
- 1) "one"
- 2) "two"
- 3) "three"
- redis> ZRANGE myzset 2 3
- 1) "three"
- redis> ZRANGE myzset -2 -1
- 1) "two"
- 2) "three"
- redis> ZRANGE myzset 0 1 WITHSCORES
- 1) "one"
- 2) "1"
- 3) "two"
- 4) "2"
根据分数读取多个元素。
语法:
- zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
其中 min 和 max 表示分值,可以用 -inf 和 +inf 表示无穷小和无穷大。
结果集默认包含 min 和 max,可以使用左括号排除,例如 ZRANGEBYSCORE zset (1 5 表示 1 < score <= 5,ZRANGEBYSCORE zset (5 (10 表示 5 < score < 10。
官方示例:
- redis> ZADD myzset 1 "one"
- (integer) 1
- redis> ZADD myzset 2 "two"
- (integer) 1
- redis> ZADD myzset 3 "three"
- (integer) 1
- redis> ZRANGEBYSCORE myzset -inf +inf
- 1) "one"
- 2) "two"
- 3) "three"
- redis> ZRANGEBYSCORE myzset 1 2
- 1) "one"
- 2) "two"
- redis> ZRANGEBYSCORE myzset (1 2
- 1) "two"
- redis> ZRANGEBYSCORE myzset (1 (2
- (empty list or set)