初识 Redis 数据库

103 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

实际开发中使用频繁的非关系型数据库 Redis。Redis 是完全开源免费的,遵守 BSD(Berkeley Software Distribution) 协议,是一个高性能的 key-value 的非关系型数据库,在实际项目开发中被大量使用。

Redis 简介

Redis 全称是:REmote DIctionary Service,即远程字典服务。Redis 是一个开源的(遵守 BSD 协议),内存中的数据结构存储系统。由于 Redis 的数据存储在内存中,所以读写速度非常快,因为其也被用于缓存方向。除此之外,Redis 提供了多种数据类型来支持不同的业务场景。

Redis 与其他 key-value 产品相比,有以下几个特点:

  • Redis 支持数据持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis 不仅仅支持简单的 key-value 类型的数据库,同时还提供了多种类型的数据结构,比如:list(列表)、set(集合)、zset(有序集合)、hash(散列) 等数据结构存储。
  • Redis 支持数据的备份,即 master-slave 模式的数据备份。

Redis 优势

Redis 相比之下其他 key-value 数据库的优势如下:

  • 性能极高

    因为 Redis 是基于内存的数据存储系统,其读的速度是 110000 次/s,写的速度是 81000 次/s。

  • 丰富的数据类型

    Redis 支持字符串(strings)、散列(hashes)、列表(lists)、 集合(sets)、有序集合(sorted sets) 等操作;也支持一些范围查询,比如 bitmaps、hyperloglogs 和地理空间(geospatial)索引半径查询等操作。

  • 原子性操作

    Redis 的所有操作都是原子性的,即要么成功执行要么失败完全不执行。Redis 中的单个操作是原子性的;而多个操作也支持事务,即原子性,可以通过 MULTI 和 EXEC 指令包起来。

    ✨ 说明:在执行 MULTI 命令之后,此时将进入阻塞状态。当我们继续发送命令时,命令不会立即执行,而是会排队等待。直到输出 EXEC 命令执行,队列中的命令才会一一执行

  • Redis 还支持发布订阅(publish/subscribe) 模式通知key 过期分布式锁等特性。

不同的数据类型

Redis 支持 5 种数据类型,分别是:strings(字符串),hashs(哈希),lists(列表),sets(集合),zsets(sorted set:有序集合)。

下面我们先来简单认识一下这 5 种数据类型:

  • strings(字符串)

    • string 是 Redis 最基本的数据类型,一个 key 对应一个 value。

    • string 是二进制安全的,换句话说 Redis 的 string 可以包含任何数据,比如图片或者序列化对象等。

    • string 类型是 redis 最基本的数据类型,string 类型的值最大能存储 512 MB。

    • 图解下图所示 👇:

      图片描述

      ✨ 其中:set 是用来新增的,get 是用来获取的。

  • lists(列表)

    • Redis 中的列表是简单的字符串列表,按照插入的顺序排序。我们向列表的左边或者右边添加元素。

    • 图解下图所示:

      图片描述

      ✨ 说明:list 就是一个简单的字符串集合,list 内的元素是可以重复的rpush 是用来新增的,lrange 是用来获取的。lrange lq2 0 -1 中 0 表示从第一个元素开始,-1 表示最后一个元素,即将集合 lq2 中所有的元素都查询出来。

  • sets(集合)

    • Redis 中的 set 是字符串类型的无序集合。其是通过哈希表实现的,因此添加、删除、查找的复杂度都是 O(1)。

    • 图解如下图所示 👇:

      图片描述

      ✨ 说明:set 和 list 一样都是字符串类型的集合,但 set 内的元素是不可以重复的,并且是无序的sadd 是用来新增的,smembers 是用来查询的。

  • zsets(sorted set:有序集合)

    • zset 每个元素都会关联一个 double 类型的分数。Redis 通过分数来为集合中的成员进行从小到大的排序。其中 zset 元素是唯一的,但是分数可以重复。

    • 图解如下图所示 👇:

      图片描述

      ✨ 说明:zset 和 set 一样都是字符串类型元素的集合,其集合内元素不能重复,但是每一个元素会关联一个分数(此分数可以重复),其就是按照分数来对元素进行从小到大排序的。zadd 是用来新增的,zrange 是用来查询的。zadd lq4 456 111 中的 456 是分数, 111 是具体的元素;zrange lq4 0 -1 withscores 中的 0 表示第一个元素,-1 表示最后一个元素,withscores 表示将元素关联的分数也查询出来(可选)。

  • hashs(哈希)

    • hash 也是一个键值对集合。其是一个 string 类型的 key 和 value 的映射表,特别适合用于存储对象。可以将 hash 集合看成多个 key-value 键值对。

    • 图解如下图所示 👇:

      图片描述

      ✨ 说明:hash 集合中可以看成是多个键值对。hset 是用来新增的,hgetall 是用来查询所有的键值对的,hget 是用来根据 key 查询 value 的。