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 …]

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

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

参考资料:

1. redis 官网

2. TRY REDIS

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!