什么是 Redis?
- Redis is in the family of databases called key-value stores.
- Redis (Remote DIctionary Server) 通常被称为数据结构服务器。
键值存储的实质
The essence of a key-value store is the ability to store some data, called a value, inside a key. This data can later be retrieved only if we know the exact key used to store it.
- 键值存储的实质是在键中存储一些数据(被称为值)的能力。
- 仅当咱们晓得用于存储它的键时,能力在稍后检索此数据。
所以 Redis 的惯例函数都是围绕键和值开展。
Redis 反对的数据类型?
Redis 能够存储键和不同类型的值之间的映射。
键的类型只能为字符串。
值常见有五种数据类型:
- 字符串(string)。
- 列表(list)。
- 汇合(set)。
- 哈希表(hash)。
- 有序汇合。
Redis keys 命令
-
删改查。
-
删:
- DEL key [key …]
-
改:
- RENAME key newkey
-
查:
-
key 所贮存的值的类型
- TYPE key
-
查找所有合乎给定模式的 key:
- KEYS pattern
-
-
-
过期相干:
-
设置过期工夫:
- EXPIRE key seconds
-
获取剩余时间:
- TTL key
-
勾销过期工夫:
- PERSIST key
-
Redis 字符串 (Strings)
-
设置键值对
- 设置一个:SET key value
- 同时设置一个或多个:MSET key value [key value …]
-
通过键获取值
-
获取残缺的值
-
获取指定键的值
- GET key
-
同时获取一个或多个键的值
- MGET key [key …]
-
-
获取值的字符串的长度
- STRLEN key
-
获取值的子字符串
- GETRANGE key start end
-
-
覆写与追加
-
从偏移量 offset 开始用 value 覆写给定 key 所贮存的字符串值
- SETRANGE key offset value
-
将 value 追加到 key 原来的值的开端
- APPEND key value
-
-
指定键对应的值的增与减
-
增
- 自增:INCR key
-
增量:
- 整型:INCRBY key increment
- 浮点型:INCRBYFLOAT key increment
-
减
- 自减:DECR key
- 减量: DECRBY key decrement
-
Redis 哈希 (Hashes)
Hashes are maps between string fields and string values, so they are the perfect data type to represent objects (eg: A User with a number of fields like name, surname, age, and so forth):
hash 是示意对象的完满数据类型。
在学习 php 的过程中如同没怎么听过 hash,然而你肯定用过:哈希表也叫散列表,更多地被称为关联数组。
- 设置键域(字段)值。
-
为指定键设置字段值:
- HSET key field value [field value …]
- 从 Redis 4.0 起,HSET 能够一次设置一个或多个 field/value 对。
-
同时将多个 field-value (域 - 值)对设置到哈希表 key 中:
- HMSET key field value [field value …]
-
获取指定键的字段或值的信息。
-
获取所有字段和值:
- HGETALL key
-
获取给定字段(单个)的值:
- HGET key field
- 相似于 $arr[$field]
-
获取所有给定字段的值:
- HMGET key field [field …]
-
获取哈希表中所有值:
- HVALS key
- 相似于 array_values
-
获取给定字段的值的字符串长度:
- HSTRLEN key field
-
获取哈希表中字段的数量:
- HLEN key
- 相似于 count(array $arr)
-
获取所有哈希表中的字段:
- HKEYS key
- 相似于 array_keys
-
-
删除一个或多个哈希表字段
- HDEL key field [field …]
-
指定键中的字段的值的增
- 值为整数的增量:HINCRBY key field increment
- 值为浮点数的增量:HINCRBYFLOAT key field increment
Redis 列表 (Lists)
A list is a series of ordered values.
-
通过索引设置列表元素的值
- LSET key index element
-
获取指定键的列表的信息:
-
通过索引获取列表中的元素:
- LINDEX key index
- 相似于 $arr[1]
-
获取列表指定范畴内的元素
- LRANGE key start stop
-
获取列表长度:
- LLEN key
- 相似于 count($arr)
-
-
删除指定键的列表的元素:
-
移除列表元素:LREM key count element
- count > 0: 从头到尾删除值为 value 的元素。
- count < 0: 从尾到头删除值为 value 的元素。
- count = 0: 移除所有值为 value 的元素。
-
对一个列表进行修剪(trim)
- LTRIM key start stop
- Redis LTRIM 用于修剪 (trim) 一个已存在的 list,这样 list 就会只蕴含 指定范畴的指定元素。
-
移出并获取列表的第一个元素:
- LPOP key
- 相似于 array_shift($list)
-
移除并获取列表最初一个元素:
- RPOP key
- 相似于 array_pop($list)
-
-
向指定键增加元素:
-
将一个或多个值插入到
列表头部
:- LPUSH key element [element …]
- 相似于 array_unshift(array,value1,value2,value3…)
-
向存存储在 key 中的列表的尾部插入所有指定的值:
- RPUSH key element [element …]
- 相似于 array_push(array,value1,value2…)
-
在列表的某个元素前或者后插入元素(定点增加):
- LINSERT key BEFORE|AFTER pivot element
-
在这些个函数当中,大多数函数通过函数名就能了解其作用,然而 LTRIM
、LINSERT
这两个函数没接触过,还是通过一些例子来了解其性能:
LTRIM 函数的例子:
redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
// 保留索引从 1 到 -1 的元素。// 这里的 -1 能够了解为倒数第一个元素的索引。// 例如:[0=>'one',1=>'two',2=>'three'],那么 -1 就是索引 2。redis> LTRIM mylist 1 -1
"OK"
redis> LRANGE mylist 0 -1
1) "two"
2) "three"
LINSERT 函数的例子:
redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSH mylist "World"
(integer) 2
// 在 world 的后面增加 there
redis> LINSERT mylist BEFORE "World" "There"
(integer) 3
redis> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"
Redis 汇合 (Sets)
A set is similar to a list, except it does not have a specific order and each element may only appear once.
从下面这段话就能够得出 set 的个性:
- 无序性。
- 互同性。
相较于数学中的汇合,还少了 确定性
。
汇合的利用场景:
In a set is very fast to test for membership, that is, to immediately know if a given element was added or not. Moreover in a set a given element can exist only in a single copy.
-
向指定键的汇合中增加一个或多个成员
- SADD key member [member …]
-
获取指定键中汇合的信息:
-
获取汇合的成员数:
- SCARD key
- 相似于 count($arr)
-
获取汇合中的所有成员:
- SMEMBERS key
-
随机获取汇合中的元素:
- SRANDMEMBER key [count]
-
-
删除汇合中的元素:
-
移除汇合中一个或多个成员:
- SREM key member [member …]
-
移除并返回汇合中的一个随机元素
- SPOP key [count]
-
-
汇合的交并补:
-
交加:
- SINTER key [key …]
-
将交加存储到 destination 汇合中:
- SINTERSTORE destination key [key …]
-
并集:
- SUNION key [key …]
-
将并集存储到 destination 汇合中:
- SUNIONSTORE destination key [key …]
-
补集:
- SDIFF key [key …]
-
将补集存储到 destination 汇合中:
- SDIFFSTORE destination key [key …]
-
-
将某个元素从 A 汇合挪动到 B 汇合:
- SMOVE source destination member
-
判断 member 元素是否是汇合 key 的成员:
- SISMEMBER key member
Redis 有序汇合 (Sorted Sets)
Redis 有序汇合和汇合一样也是 string 类型元素的汇合,且 不容许反复的成员。
不同的是每个元素都会关联一个 double 类型的分数。Redis 正是通过分数来为汇合中的成员进行从小到大的排序。
有序汇合的成员是惟一的, 但分数 (score) 却能够反复。
汇合是通过哈希表实现的,所以增加,删除,查找的复杂度都是 O(1)。
感觉有 序汇合
就是 列表
与 汇合
的混合体。
大多数函数在之前都遇到过,看到函数名大略就能猜到其性能,就不一一列举了。还是记录几个典型或者没遇见过的函数吧。
-
向有序汇合增加一个或多个成员,或者更新已存在成员的分数
- ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member …]
-
返回有序汇合中指定成员的索引
-
ZRANK key member
例子:redis> ZRANK myzset 'one' (integer) 0 redis> ZADD myzset 1 "one" (integer) 1 redis> ZADD myzset 2 "two" (integer) 1 redis> ZADD myzset 3 "three" (integer) 1 redis> ZRANK myzset "three" (integer) 2 redis> ZRANK myzset "four" (nil) redis> ZADD myzset 5 'five' (integer) 1 redis> ZRANGE myzset 0 -1 1) "one" 2) "two" 3) "three" 4) "five" redis> ZRANK myzset 'five' (integer) 3
-
-
返回有序集中,成员的分数值
- ZSCORE key member
参考资料:
- redis 官网
- TRY REDIS