Moonshadow2333

V1

2022/04/06阅读:23主题:默认主题

Redis 基础学习

Redis 基础学习

什么是 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 ...]
  1. 通过键获取值
  • 获取完整的值
    • 获取指定键的值
      • GET key
    • 同时获取一个或多个键的值
      • MGET key [key ...]
  • 获取值的字符串的长度
    • STRLEN key
  • 获取值的子字符串
    • GETRANGE key start end
  1. 覆写与追加
    • 从偏移量 offset 开始用 value 覆写给定 key 所储存的字符串值
      • SETRANGE key offset value
    • 将 value 追加到 key 原来的值的末尾
      • APPEND key value
  2. 指定键对应的值的增与减
    • 自增: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 ...]
  1. 获取指定键的字段或值的信息。
    • 获取所有字段和值:
      • HGETALL key
    • 获取给定字段(单个)的值:
      • HGET key field
      • 类似于 field]
    • 获取所有给定字段的值:
      • HMGET key field [field ...]
    • 获取哈希表中所有值:
      • HVALS key
      • 类似于 array_values
    • 获取给定字段的值的字符串长度:
      • HSTRLEN key field
    • 获取哈希表中字段的数量:
      • HLEN key
      • 类似于 count(array $arr)
    • 获取所有哈希表中的字段:
      • HKEYS key
      • 类似于 array_keys
  2. 删除一个或多个哈希表字段
    • HDEL key field [field ...]
  3. 指定键中的字段的值的增
    • 值为整数的增量: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
  1. 返回有序集中,成员的分数值
    • ZSCORE key member

如果想了解某个函数的具体细节,可以前往 redis 官网 查看完整说明。

参考资料:

  1. redis 官网
  2. TRY REDIS

分类:

后端

标签:

数据库

作者介绍

Moonshadow2333
V1

征途漫漫,唯有奋斗。