Redis的使用
Redis key 值是二进制安全的, 可以用任何二进制序列作为key值, 无论是简单字符串还是JPEG文件的内容皆可。空字符串也是有效key值。
切换数据库
select databaseid 选中数据库 (redis 默认有16个实例库, 0~15, 登录时默认库0)
Key操作
KEYS pattern
- 查找所有符合给定模式 pattern 的 key
EXISTS key
- 检查给定 key 是否存在
EXPIRE key seconds
- 给key设置生命周期, 当key过期时会被自动删除
MOVE key db
- 将当前数据库的 key 移动到给定的数据库 db 中
- 如果源数据库和目标数据库有相同的key, 或 key 不存在于当前数据库, 那么 MOVE 无效
TTL key
- 以秒为单位, 返回给定key的剩余存活时间(保留时间)
TYPE key
- 返回 key 所存储的值的类型
DEL key [key ...]
- 删除给定的一个或多个key。 不存在的 key 会被 忽略
练习:
# exercise
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> exists ronnie
(integer) 0
127.0.0.1:6379[1]> set ronnie yuan
OK
127.0.0.1:6379[1]> exists ronnie
(integer) 1
127.0.0.1:6379[1]> move ronnie 2
(integer) 1
127.0.0.1:6379[1]> exists ronnie
(integer) 0
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]> exists ronnie
(integer) 1
127.0.0.1:6379[2]> type ronnie
string
127.0.0.1:6379[2]> del ronnie
(integer) 1
127.0.0.1:6379[2]> exists ronnie
(integer) 0
# ex
127.0.0.1:6379[2]> SETEX test 20 fun
OK
127.0.0.1:6379[2]> ttl test
(integer) 16
127.0.0.1:6379[2]> ttl test
(integer) 12
127.0.0.1:6379[2]> ttl test
(integer) 5
127.0.0.1:6379[2]> ttl test
(integer) -2
String操作
字符串是Redis最基本的一种值类型。Redis 字符串是二进制安全的, 这意味着一个Redis字符串能包含任意类型的数据
SET key value [EX seconds][PX milliseconds] [NX|XX]
# EX: 设置过期时间, 秒, 等同于SETEX key seconds value
# PX: 设置过期时间, 毫秒, 等同于PSETEX key milliseconds value
# NX: NX键不存在, 才能设置, 等同于SETNX key value
# XX: XX键存在时, 才能设置
## 将字符串值 value 关联到key
## 如果该 key 已经持有其他值, SET就覆写旧值, 无视类型
## 对于某个原本带有生存时间(TTL)的键来说, 当 SET 命令成功在这个键上执行时, 这个键原有的 TTL 将被清除。
GET key
- 返回 key 所关联的字符串值
- 如果key不存在, 返回特殊值nil
- 假如 key 储存的值不是字符串类型, 则返回一个错误, 因为 GET 只能用于处理字符串值
APPEND key value
- 如果 key 已经存在并且是一个字符串, APPEND命令将 value 追加到 key 原来的值的末尾。
- 如果 key 不存在, APPEND 就简单地将给定 key 设为 value, 就像执行 SET key value 一样。
STRLEN key (String Length of key)
- 返回 key 所储存的字符串值的长度。
- 当 key 储存的不是字符串值时, 返回一个错误。
INCR key (INCR --> Increase)
- 将 key 中储存的数字值增一
- 如果 key 不存在, 那么 key 的值会先被初始化为0, 然后再执行INCR 操作
- 如果值包含错误的类型, 或字符串类型的值不能表示为数字, 那么返回一个错误
INCRBY key increment (INCRBY --> Increase by)
- 将 key 所储存的值加上增量 increment
- 如果 key 不存在, 那么 key 的值会先被初始化为 0, 然后再执行INCRBY命令
- 如果值包含错误的类型, 或字符串类型的值不能表示为数字, 那么返回一个错误。
DECR key (DECR --> decrease)
- 将 key 中储存的数字值减一
DECRBY key decrement (DECRBY --> Decrease by)
- 将 key 所存储的值减去减量 decrement
GETRANGE key start end
- 返回 key 中字符串值的子字符串, 字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end)
- 附属偏移量表示从字符串最后开始计数, -1 表示最后一个字符, -2 表示倒数第二个 ...
SETRANGE key offset value
- 用 value 参数覆写(overwrite) 给定 key 所储存的字符串值, 从偏移量 offset 开始。
SETEX key seconds value
- 将值 value 关联到 key, 并将 key 的生存时间设为 seconds
- 如果key已经存在, SETEX 命令将覆写旧值
- 类似于 SET key value 和 EXPIRE key seconds, 不同之处是:
- SETEX 是一个原子性(atomic) 操作, 关联值和设置生存时间这两个action会在同一时间内完成, 该命令在Redis用作缓存时, 非常实用。
SETNX key value
- 将 key 的值设置为 value, 当且仅当 key 不存在。
- 若给定的 key 已将存在, 则SETNX不做任何动作。
- SETNX <=> SET if Not exists
MGET key [key ... ] (M --> Multiply)
- 返回所有(一个或多个)给定 key 的值。
- 如果给定的 key 里面, 有某个 key 不存在, 那么该 key 返回特殊值nil(该命令永不失败)。
MSET key value [key value ... ]
- 同时设置一个或多个 key-value 对
- 如果某个给定 key 已经存在, 那么 MEST 会用新值覆盖原来的旧值
- 如果这不是你所希望的效果,请考虑使用 MSETNX 命令:它只会在所有给定 key 都不存在的情况下进行设置操作。
MSETNX key value [key value ... ]
- 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
- 即使只有一个给定 key 已存在, MSETNX 也会拒绝执行所有给定 key 的设置操作。
- MSETNX 是原子性的,因此它可以用作设置多个不同 key 表示不同字段(field)的唯一性逻辑对象(unique logic object),所有字段要么全被设置,要么全不被设置。
# e1
127.0.0.1:6379[2]> set heros slark
OK
127.0.0.1:6379[2]> append heros luna
(integer) 9
127.0.0.1:6379[2]> strlen heros
(integer) 9
127.0.0.1:6379[2]> get heros
"slarkluna"
127.0.0.1:6379[2]> getrange heros 4 -1
"kluna"
127.0.0.1:6379[2]> setrange heros 5 sf
(integer) 9
127.0.0.1:6379[2]> get heros
"slarksfna"
127.0.0.1:6379[2]> setex heros 10 storm
OK
127.0.0.1:6379[2]> ttl heros
(integer) 1
127.0.0.1:6379[2]> ttl heros
(integer) -2
# e2
127.0.0.1:6379[2]> SETNX balance 300
(integer) 1
127.0.0.1:6379[2]> get balance
"300"
127.0.0.1:6379[2]> SETNX balance 200
(integer) 0
127.0.0.1:6379[2]> get balance
"300"
# e3
127.0.0.1:6379[2]> MSETNX name ronnie hometown shanghai university massey age 24 major chemistry
(integer) 1
127.0.0.1:6379[2]> MGET name hometown university age major
1) "ronnie"
2) "shanghai"
3) "massey"
4) "24"
5) "chemistry"
127.0.0.1:6379[2]> MSETNX name john hometown auckalnd university massey age 57 occupation professor
(integer) 0
127.0.0.1:6379[2]> MGET name hometown university age occupation
1) "ronnie"
2) "shanghai"
3) "massey"
4) "24"
5) (nil)
List 操作
LPUSH key value [value ... ] (L --> Left)
- 将一个或多个值 value 插入到列表 key 的表头
- 如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令"
RPUSH key value [value ... ] (R --> Right)
- 将一个或多个值 value 插入到列表 key 的表尾(最右边)。
- 如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。
LRANGE key start stop (L --> List)
- 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
- 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
LPOP key
- 移除并返回列表 key 的头元素
RPOP key
- 移除并返回列表 key 的尾元素
LINDEX key index (L --> List)
- 返回列表key中, 下标为 index 的元素
- 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素...
- 可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素...
LLEN key (L --> Left LEN --> Length)
- 返回列表 key 的长度。
- 如果 key 不存在,则 key 被解释为一个空列表,返回 0 .
LREM key count value (L --> Left REM --> remove)
- 根据参数 count 的值,移除列表中与参数 value 相等的元素。count 的值可以是以下几种:
- count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。(left --> right)
- count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。(right -> left)
- count = 0 : 移除表中所有与 value 相等的值。
LTRIM key start stop (L --> Left)
- 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
- 举个例子,执行命令 LTRIM list 0 2 ,表示只保留列表 list 的前三个元素,其余元素全部删除。
RPOPLPUSH source destination (Right Pop Push)
命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:
将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。
LSET key index value
- 将列表 key 下标为 index 的元素的值设置为 value 。
- 当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。
LINSERT key BEFORE|AFTER pivot value (Left Insert)
- 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
- 当 pivot 不存在于列表 key 时,不执行任何操作。
- 当 key 不存在时, key 被视为空列表,不执行任何操作。
127.0.0.1:6379[2]> LPUSH heros slark luna spectre storm ember broodmother
(integer) 6
127.0.0.1:6379[2]> LRANGE heros 0 4
1) "broodmother"
2) "ember"
3) "storm"
4) "spectre"
5) "luna"
127.0.0.1:6379[2]> LRANGE heros 0 -1
1) "broodmother"
2) "ember"
3) "storm"
4) "spectre"
5) "luna"
6) "slark"
127.0.0.1:6379[2]> RPUSH heros2 viper anti_mage zeus meepo huskar
(integer) 5
127.0.0.1:6379[2]> LLEN heros
(integer) 6
127.0.0.1:6379[2]> RPOPLPUSH heros heros2
"slark"
127.0.0.1:6379[2]> LRANGE heros 0 -1
1) "broodmother"
2) "ember"
3) "storm"
4) "spectre"
5) "luna"
127.0.0.1:6379[2]> LRANGE heros2 0 -1
1) "slark"
2) "viper"
3) "anti_mage"
4) "zeus"
5) "meepo"
6) "huskar"
127.0.0.1:6379[2]> LSET heros 0 wtf
OK
127.0.0.1:6379[2]> LRANGE heros 0 -1
1) "wtf"
2) "ember"
3) "storm"
4) "spectre"
5) "luna"
127.0.0.1:6379[2]> LINSERT heros BEFORE wtf omg
(integer) 6
127.0.0.1:6379[2]> LRANGE heros 0 -1
1) "omg"
2) "wtf"
3) "ember"
4) "storm"
5) "spectre"
6) "luna"
Set 操作
SADD key member [member ... ]
- 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
- 假如 key 不存在,则创建一个只包含 member 元素作成员的集合。
SMEMBERS key
- 返回集合 key 中的所有成员。
- 不存在的 key 被视为空集合。
SISMEMEBER key member
- 判断 member 元素是否集合 key 的成员。
SCARD key
- 返回集合 key 的基数(集合中元素的数量)。
SREM key member [member ... ]
- 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。
SPOP key (随机抽奖)
- 移除并返回集合中的一个随机元素。
- 如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。
SMOVE source destination member
- 将 member 元素从 source 集合移动到 destination 集合。SMOVE 是原子性操作。
- 如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
- 当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
- 当 source 或 destination 不是集合类型时,返回一个错误。
SDIFF key [key ... ]
- 求差集:从第一个key的集合中去除其他集合和自己的交集部分。
SINTER key [key ... ] (求交集)
- 返回一个集合的全部成员,该集合是所有给定集合的交集。
SUNTION key [key ... ]
- 返回一个集合的全部成员,该集合是所有给定集合的并集。
- 不存在的 key 被视为空集。
Sorted set 操作
类似Sets,但是每个字符串元素都关联到一个叫score浮动数值。里面的元素总是通过score进行着排序, 有所不同的是, 它是可以检索一系列元素。Zset 是 key score1 value1 score2 value2。
ZADD key score member [[score member] ... ]
- 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
ZRANGE key start stop [WITHSCORES]
返回有序集 key 中,指定区间内的成员。
其中成员的位置按 score 值递增(从小到大)来排序。
具有相同 score 值的成员按字典序(lexicographical order )来排列。
如果你需要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE 命令。
ZREVRANGE key start stop [WITHSCORES] (REV --> reverse)
- 返回有序集 key 中,指定区间内的成员。
- 其中成员的位置按 score 值递减(从大到小)来排列。
ZREM key member [member ... ]
- 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
ZREMRANGEBYSCORE key min max
- 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
ZSCORE key member
- 返回有序集 key 中,成员 member 的 score 值。
ZCARD key
- 返回有序集 key 的基数。
ZCOUNT key min max
- 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
ZRANK key member
- 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
Hash 操作(散列)
- KV 模式不变, 但是 V 是一个键值对
HSET key field value
- 将哈希表 key 中的域 field 的值设为 value 。
HGET key field
- 返回哈希表 key 中给定域 field 的值。
HMSET key field value [field value ... ]
- 同时将多个 field-value (域-值)对设置到哈希表 key 中。
- 此命令会覆盖哈希表中已存在的域。
HMGET key field [field ...]
- 返回哈希表 key 中, 一个或多个给定域的值。
HGETALL key
- 返回哈希表 key 中, 所有的域和值。
HKEYS key
- 返回哈希表 key 中 的所有域
HVALS key
- 返回哈希表 key 中所有域的值。
HSETNX key field value
- 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。
- 若域 field 已经存在,该操作无效。
HEXISTS key field
- 查看哈希表 key 中, 给定域 field是否存在。
HDEL key field [field ... ]
- 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
HINCRBY key field increment
- 为哈希表 key 中的域 field 的值加上增量 increment 。
- 增量也可以为负数,相当于对给定域进行减法操作。
HINCRBTFLOAT key field increment
- 增加浮点数