头图

什么是 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

在这些个函数当中,大多数函数通过函数名就能理解其作用,但是 LTRIMLINSERT 这两个函数没接触过,还是通过一些例子来理解其功能:

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

参考资料:

  1. redis 官网
  2. TRY REDIS

Moonshadow2333
28 声望0 粉丝

征途漫漫