Redis 基础学习

Redis/缓存系统
537
0
0
2022-09-27
标签   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