简单的 Redis 学习笔记·初见 Redis | 青训营

78 阅读9分钟

Redis 是一个开源的内存数据结构存储系统,可用作数据库、缓存、消息代理和队列。Redis 以其出色的性能和可靠性闻名,因此被广泛应用于许多领域,如游戏、金融科技、广告科技、社交媒体、医疗保健和互联网等等。本文试图对 Redis 作简单的介绍,以便初学者快速上手 Redis。本文作为我的一篇学习笔记。

基本概念

RedisRemote dictionary server,译为远程字典服务。从名字就可以看出,它是一个基于 Key-Value 模式的数据库。事实上,它正是目前最热门的 NoSQL 数据库之一。早期的互联网公司大多基于 MySQL 这种基于磁盘 IO 的传统数据库。随着互联网的发展,应用系统的访问量越来越大,基于磁盘 IO 数据库的性能瓶颈愈发明显。于是人们想到将数据存储在内存当中,用内存读写代替磁盘 IO 以提升它的性能。Redis 正是基于这种思想诞生的。

Redis 支持多种数据结构,包括五种基本数据类型和五种高级数据类型。五种基本数据类型包括字符串 String、列表 List、集合 Set、有序集合 SortedSet、哈希 Hash。五种高级数据类型包括消息队列 Stream、地理空间 Geospatial、HyperLogLog、位图 Bitmap、位域 Bitfield。

Redis 的使用方式主要包括三种,分别是命令行界面(CLI, Command Line Interface)、应用程序接口(API, Application Programming Interface)、图形用户界面(GUI, Graphical User Interface)。

Redis 的优势包括:性能极高;数据类型丰富,单键值对最大支持 512M 大小的数据;简单易用,支持所有主流编程语言;支持数据持久化、主从复制、哨兵模式等高可用特性。

安装配置

在 Mac 和 Linux 上安装 Redis 是非常简单的。只需要使用 brew 或者 apt 等包管理器来执行一条 install 命令就可以了。Redis 既然这么火爆,相信各种 Linux 发行版都维护着一个相当不错的镜像源。在 Windows 上安装 Redis 就相对比较麻烦,考虑到基本上也不会有人在 Windows 开发数据库服务器,所以在这里就不介绍 Windows 上的安装方法了。还有一种比较特殊的使用 Redis 的方式是通过 Docker 拉取镜像源,这个方法在各个操作系统上都是通用的,在实际开发中一般 Docker 会更加常用一些。

安装完成后,打开终端,输入 redis-server 就可以启动 redis 的 server 了。之后会在终端上打印一个字符画并输出一些提示信息。Redis 启动后会一直在后台运行,默认监听 6379。这时打开另一个终端输入 redis-cli 会启动 redis 的命令行界面服务,在这里可以通过各种命令操作 Redis。就和 MySQL 的 CLI 一样。

常用命令

Redis 的常用命令非常简单,平常使用的不外乎 SET, GET, DEL, EXISTS, KEYS, FLUSHALL, TTL, EXPIRE, SETEX, SETNX, clear。

  • SET 设置一个键值对。 用法:SET key value(设置一个键为 key 值为 value 的键值对,若 key 已存在则更新原 key 的值)
  • GET 获取指定键的值。 用法:GET key(获得键为 key 的 value,如果 key 不存在则返回空值)
  • DEL 删除指定键。 用法:DEL key(删除键为 key 的键值对,即使 key 不存在)
  • EXISTS 判断键是否存在。 用法:EXISTS(判断是否存在名为 key 的键,若存在返回 1,否则返回 0)
  • KEYS 查找键。 用法:KEYS query(查找匹配 query 的键,query 有精确匹配和模糊匹配两种模式,模糊匹配以符号 * 占位)
  • FLUSHALL 删除所有键。 用法:FLUSHALL(删除所有键,是 DEL 的升级版)
  • TTL 查看键的生命时长。 用法:TTL key(查看指定键还有多久过期,单位为秒;返回 -1 表示永不过期,返回 -2 表示已过期)
  • EXPIRE 设置键的生命时长。 用法:EXPIRE key time(将 key 键的生命时长设置为 time,只能对已存在的键操作)
  • SETEX 设置键的生命时长。 用法:SETEX key value time(创建一个键为 key 值为 value 生命周期为 time 的键值对,是 SET 的带生命时长设置的版本)
  • SETNX 当键不存在时设置键。 SETNX:SETNX key value(当 key 不存在时设置一个键为 key 值为 value 的键值对,若 key 已存在则不更新)

基本数据类型

Redis 支持五种基本数据类型,包括字符串 String、列表 List、集合 Set、有序集合 SortedSet、哈希 Hash。

字符串

Redis 没有整型数字或者浮点数的概念,它的所有值全部以字符串的形式存储。这样做的好处是不用考虑正负数、小数的表示方法,也不用担心数字超过了表示范围。大大提高了数据的存储效率。Redis 的所有数据均已二进制存储,这意味着除 ASCII 码以外的字符包括中文、日文等在 Redis 里都将被表示成诸如 \x88 等十六进制。要解决这一问题,需要在与 Redis 进行连接时指定 --raw 表示以原始形式显示。

列表

Redis 支持列表,也即数组。列表依然以键值对的形式存在于 Redis 当中。需要注意的是,Redis 提供的命令仅支持对列表首位进行添加、删除的操作。这意味着 Redis 中的列表更接近于队列的形式。

添加元素 通过使用 LPUSH 和 RPUSH 来向列表的头部(左)和尾部(右)添加元素,用法是 LPUSH/RPUSH key value。比如 LPUSH list a 表示向 list 的头部添加元素 "a"。当 key 所指的键不是 list 时,Redis 会自动将其变为 list。

查看元素 使用 LRANGE 来获取列表内容,用法是 LRANGE key start stop,它会返回列表 key 中从 start 到 stop 的全部元素(包括 start 和 stop 所指向的元素)。Redis 当中的列表索引从 0 开始。Redis 支持以负数表示索引,比如 -2 表示倒数第二个元素。

删除元素 与添加元素相对,使用 LPOP 和 RPOP 来删除列表头部(左)和尾部(右)的元素。LPOP 和 RPOP 还可以指定删除元素的个数,用法是 LPOP/RPOP key num。比如 LPOP list 2。表示删除 list 的头两个元素。此外,还可以使用 LTRIM 来同时删除头部和尾部的元素。用法是 LTRIM key start stop。它表示除了从 start 到 stop 的元素都要删除掉。

查看长度 使用 LLEN 来查看列表的长度。用法是 LLEN key。比如 LLEN list 返回 3 表示 list 有三个元素。

集合

集合是无序的,这意味着其中的元素不可以重复,这是它与列表的本质区别。注意,这里的集合 SET 与平时在 Redis 中使用的命令 SET 是两样事物,这是一个蹩脚的英式双关笑话。但是 Redis 考虑到了这一点,所以所有与集合 SET 有关的命令都以 S 打头。

添加元素 使用 SADD 来添加元素到一个集合中。用法是 SADD key value,它会返回一个 1 或 0 表示是添加成功还是失败。对于已创建好的集合,我们可以使用 SISMEMBER key value 来看 value 是不是集合 key 的成员,若是则返回 1 若否 则返回 0。不难看出在同一时刻,SADD 和 SISMEMBER 的返回值总是相反的。

删除元素 使用 SREM 来删除集合中的元素。用法是 SREM key value,它会返回一个 1 或 0 表示删除是否成功。

集合运算 集合运算包括交、并、补、差。Redis 支持这些基本的集合运算,分别是 SINTER 求交集,SUNION 就并集,SDIFF 求并集与交集的差。

有序集合

有序集合是集合,因为其中不能出现重复的元素。但它是有序的,这是因为其中的每个元素都会有自己的权值,每个根据自身的权值来判断自己在集合中的地位。有序集合的成员必须是唯一的,但成员的权值却是可以重复的。这意味着有序集合中会存在两个元素,他们在集合当中的顺序相同。有序集合的命令都以 Z 打头。

添加元素 使用 ZADD 来向有序集合添加元素。用法是 ZADD key value weight。它表示向集合 key 中添加一个值 value,他的权重为 weight。这行命令会返回添加成功的元素个数,比如 ZADD a 1 b 2 c 3 会返回 3。

查看元素 查看集合中的元素需要使用 ZRANGE 命令,用法是 ZRANGE key start stop。它会将元素首先按照 weight 排序,然后输出从 start 到 stop 的所有元素。如果需要在显示元素的同时显示元素各自的权重,则需要使用 ZRANGE key start stop WITHSCORES。要查看单个成员的权重可以使用 ZSCORE key value,要查看单个成员的排名则可以使用 ZRANK key value 来看排名,它表示从小到大的排名,ZREVRANK 与之相对,表示从大到小的排名。

删除元素 删除元素使用 ZREM key value。与无序集合大同小异。

哈希

哈希是一个字符类型的字段和值的映射表,简单来说就是一个键值对的集合,特别适合用来存储对象。哈希相关的命令都是以 H 开头。

添加元素 使用 HSET key field value。表示向键为 key 的哈希表添加一个键为 field 值为 value 的键值对。是不是有点绕?其实就是一个套娃,键值对的值是一个键值对。淡然一点,后面会遇到比这更加复杂的东西。为什么说哈希特别适合用来存储对象呢?因为一个哈希可以存储多个 field-value 对,就像对象具有多个属性。

查看元素 使用 HGET key field。表示查找键为 key 的哈希表,在这个表里键为 field 的 value 是多少。还可以是直接使用 HGETALL key 来获取键为 key 的哈希表中的所有字段。

删除元素 使用 HDEL key field。表示查找键为 key 的哈希表,删除其中键为 field 的键值对。

查看元素 还可以使用 HEXIST 来判断某个键值对是否存在于指定的哈希表中,用法是 HEXIST key field。还可以使用 HKEYS key 来获取哈希表的所有键或者 HLEN key 来获取哈希表的长度。