什么是 Redis?
1. Redis is in the family of databases called key-value stores.
2. 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.
1. 键值存储的本质是在键中存储一些数据(被称为值)的能力。
2. 仅当我们知道用于存储它的键时,才能在稍后检索此数据。
所以 Redis 的常规函数都是围绕键和值展开。
Redis支持的数据类型?
Redis 可以存储键和不同类型的值之间的映射。
键的类型只能为字符串。
值常见有五种数据类型:
- 字符串(string)。
- 列表(list)。
- 集合(set)。
- 哈希表(hash)。
- 有序集合。
Redis keys 命令
1. 删改查。
- 删:
- DEL key [key …]
- 改:
- RENAME key newkey
- 查:
- key 所储存的值的类型
- TYPE key
- 查找所有符合给定模式的 key:
- KEYS pattern
2. 过期相关:
- 设置过期时间:
- EXPIRE key seconds
- 获取剩余时间:
- TTL key
- 取消过期时间:
- PERSIST key
Redis 字符串 ( Strings )
1. 设置键值对
- 设置一个:SET key value
- 同时设置一个或多个:MSET key value [key value …]
2. 通过键获取值
- 获取完整的值
- 获取指定键的值
- GET key
- 同时获取一个或多个键的值
- MGET key [key …]
- 获取值的字符串的长度
- STRLEN key
- 获取值的子字符串
- GETRANGE key start end
3. 覆写与追加
- 从偏移量 offset 开始用 value 覆写给定 key 所储存的字符串值
- SETRANGE key offset value
- 将 value 追加到 key 原来的值的末尾
- APPEND key value
4. 指定键对应的值的增与减
- 增
- 自增: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 ,但是你一定用过:哈希表也叫散列表,更多地被称为关联数组。
1. 设置键域(字段)值。
- 为指定键设置字段值:
- HSET key field value [field value …]
- 从 Redis 4.0 起,HSET 可以一次设置一个或多个 field/value 对。
- 同时将多个 field-value (域-值)对设置到哈希表 key 中:
- HMSET key field value [field value …]
2. 获取指定键的字段或值的信息。
- 获取所有字段和值:
- 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
3. 删除一个或多个哈希表字段
- HDEL key field [field …]
4. 指定键中的字段的值的增
- 值为整数的增量:HINCRBY key field increment
- 值为浮点数的增量:HINCRBYFLOAT key field increment
Redis 列表 ( Lists )
A list is a series of ordered values.
1. 通过索引设置列表元素的值
- LSET key index element
2. 获取指定键的列表的信息:
- 通过索引获取列表中的元素:
- LINDEX key index
- 类似于 $arr[1]
- 获取列表指定范围内的元素
- LRANGE key start stop
- 获取列表长度:
- LLEN key
- 类似于 count($arr)
3. 删除指定键的列表的元素:
- 移除列表元素: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)
4. 向指定键添加元素:
- 将一个或多个值插入到
列表头部
: - 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.
1. 向指定键的集合中添加一个或多个成员
- SADD key member [member …]
2. 获取指定键中集合的信息:
- 获取集合的成员数:
- SCARD key
- 类似于 count($arr)
- 获取集合中的所有成员:
- SMEMBERS key
- 随机获取集合中的元素:
- SRANDMEMBER key [count]
3. 删除集合中的元素:
- 移除集合中一个或多个成员:
- SREM key member [member …]
- 移除并返回集合中的一个随机元素
- SPOP key [count]
4. 集合的交并补:
- 交集:
- SINTER key [key …]
- 将交集存储到 destination 集合中:
- SINTERSTORE destination key [key …]
- 并集:
- SUNION key [key …]
- 将并集存储到 destination 集合中:
- SUNIONSTORE destination key [key …]
- 补集:
- SDIFF key [key …]
- 将补集存储到 destination 集合中:
- SDIFFSTORE destination key [key …]
5. 将某个元素从 A 集合移动到 B 集合:
- SMOVE source destination member
6. 判断 member 元素是否是集合 key 的成员:
- SISMEMBER key member
Redis 有序集合 ( Sorted Sets )
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。Redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数 ( score ) 却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
感觉有 序集合
就是 列表
与 集合
的混合体。
大多数函数在之前都遇到过,看到函数名大概就能猜到其功能,就不一一列举了。还是记录几个典型或者没遇见过的函数吧。
1. 向有序集合添加一个或多个成员,或者更新已存在成员的分数
- ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member …]
2. 返回有序集合中指定成员的索引
- 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
3. 返回有序集中,成员的分数值
- ZSCORE key member
如果想了解某个函数的具体细节,可以前往 redis 官网 查看完整说明。
参考资料:
1. redis 官网
2. TRY REDIS