Redis 启蒙

2019-05-07

关键字: Redis 是什么、Redis 入门、Redis 安装


1、前言

 

这篇文章其实是笔者在阅读了 《Redis 入门指南》 以后所作的一个读书总结。

 

不过即使是作为一篇读书总结,这篇文章也并非详细地总结了书中所述知识点,甚至这篇文章仅仅只是总结了书中的前面一小部分内容。

 

之所以在这种情况下仍坚持输出这么一篇文章,是因为于笔者而言,Redis 并非一项工作过程中必不可少的框架,甚至于压根就用不上它。笔者读这本书纯粹是抱着拓展视野的目的去学习的。因此,对于这本书,笔者仅仅是草草翻阅了一些最基础的知识,对 Redis 在自己心里有了一个初步的概念模型而已。笔者有个爱好,对于新学到的,比较系统全面的知识点都爱做个“总结”。于是就有了这篇文章。

 

下面开始 Redis 的学习。

 

2、Redis 是什么

 

首先,Redis 被定位为一个数据库。

 

Redis 是于 2009 年在意大利开发完成的一款基于 C语言的开源内存型数据库。由于它实在是太好用了,于是很快就火了。

 

Redis 是基于内存的数据库软件,因此它的数据读写速度都非常快。并且为了弥补内存掉电时数据会丢失的缺点,Redis 还具备将数据异步写入到磁盘的功能。

 

Redis 以 “字典型结构” 来存储数据。什么是字典型结构呢?简单理解就是 key-value 对。但是 Redis 中的 key-value 对还有些不一样,它并不是严格的一对一关系,它一般有如下图所示的几中类型

redis k-v 对的几种形式

其它应用程序可以通过 TCP 协议来读取 Redis 中的数据。

 

Redis 的语法还非常简单,学习成本比较低。在业界通常将 Redis 用作缓存或者消息队列系统,一般搞网站的用 Redis 比较多。

 

业界还有另一种基于内存的数据库软件: Memcached 。但很不幸,现在 Memcached 已经完全拼不过 Redis 了。

 

3、Redis 环境准备

 

1、版本号的选择

首先是要学会看 Redis 的版本号。与传统软件版本号类似,Redis 的版本号也是采用 x.y 或 x.y.z 的形式来发布的。这里我们需要关心的是它的版本号中的 y 。若 y 为偶数,则代表该版本是稳定版本,为奇数,则是开发版本。因此,对于一般人来说,不管干什么,都选个 y 是偶数的版本下载就好了。

 

2、安装

关于 Redis 的安装,Redis 不直接提供二进制包,需要我们在官网上下载了源码以后自行编译安装。

 

当我们下载并解压好 Redis 的源码以后,可以在源码的根目录下执行以下命令进行编译。

make

一切顺利的话,可以看到如下编译结果

redis 源码编译结果

这个时候您可以选择执行以下命令来测试是否真的编译完全成功了,如它上面的提示所示。

make test

不过可能有些同学的 make test 命令并不能很顺利地被执行。如果您发现您无法正常执行 make test 命令,可以跳过执行这条命令,它并不是很重要,一般而言,都能正常编译的。如果真的很不幸您就是无法编译,检查一下您 Linux 系统上是否正确安装了 C 编译器,毕竟 Redis 是用 C 语言写的。

 

然后我们可以通过执行以下命令来为我们自动安装 Redis 程序

make install

这条指令的作用其实就是将上一步编译出来的程序拷贝到 /usr/local/bin 目录下,执行完成的话可以在该目录下看到有如下几个文件生成

需要注意的是,执行 make install 由于需要操作到 /usr/local 目录,因此它通常需要 root 权限

 

上图所示的几个文件的作用如下

redis-benchmark    Redis 的性能测试工具
redis-check-aof    AOF 文件修复工具
redis-check-rdb       RDB 文件检查工具
redis-cli             Redis 命令行客户端
redis-sentinel        Sentinel 服务器
redis-server          Redis 服务端

其中,常用的就 redis-cli 与 redis-server 而已。

 

3、启动与停止

首先当然是要先启动服务器。直接运行 redis-server 程序即可。服务端默认占用 6379 端口。服务端成功启动的话可以看到如下打印

需要注意的是,redis-server 是一个后台常驻进程。

 

如果需要停止 Redis 的服务端,当然可以通过直接强制杀死 redis-server 进程,或者通过 ctrl+c 来强制终止服务端进程的运行。不过最好不要这么做,因为我们的 Redis 会有一个异步写出数据到磁盘的功能,假如它正在写数据到磁盘时被我们强制终止运行了,那数据肯定就要丢失了。所以正确的停止 Redis 服务端的方式应该是通过以下命令

redis-cli shutdown

 

4、连接到服务端

当 Redis 的服务端正常运行以后,我们可以直接运行 Redis 的命令行客户端程序来与服务端交互。

redis-cli

默认情况下 Redis 命令行会连接本机的 6379 端口。

如果想要连接指定位置的 Redis 服务端,则可以使用如下形式的命令

redis-cli -h 192.168.77.104 -p 6380

 

好了,对于拓展性质的学习,知道了这些,也差不多了。

 

5、配置文件

与传统的开源软件一样,Redis 也有很多配置信息,这些配置信息被保存在一个名为 redis.conf 的文件中。它位于 Redis 源码根目录下。

 

我们可以在启动 Redis 服务端时显式指定一个配置文件,如

redis-server /path/to/redis.conf

 

也可以以指定的配置信息来启动服务端

redis-server --loglevel warning

 

以上两种都是在服务端操作的方式。当然我们也可以在 redis 命令行端来临时修改配置属性。

CONFIG SET loglevel warning

 

而我们如果想查询某条配置属性的信息,则可以使用如下命令

CONFIG GET loglevel

 

6、Redis 的多数据库

我们在 MySQL 中经常会有创建多个 database 来存放不同数据的需求。在 Redis 中也有类似的数据分库存储的功能。只不过 Redis 中的 database 是以数字命名的,且是恒定数量的。它的数量由 redis.conf 中配置决定,默认是 16 个,即 0 ~ 15 。

 

默认情况下 Redis 使用的是 0 号数据库,如果我们想切换到其它号数据库,可以使用如下命令

SELECT 15

这条命令就是切换到第 15 号数据库去。成功执行后可以看到有如下结果

不过,与 MySQL 中的数据分库不同,Redis 中的数据分库并没有做到数据的完全隔离。即,假如我们在 Redis 命令行客户端中执行了一条清除所有数据的命令时,这 16 个数据库中的内容都会被清除掉,不管我当前正在使用哪一个数据库。

 

如果想做到类似于 MySQL 上那样的完全隔离的数据分库,则需要通过启动多们 Redis 服务端,通过进程隔离来实现数据的完全隔离。由于 Redis 是非常轻量级的数据库,因此我们也不必担心启动多个 redis 实例会点用过多的系统资源。

 

4、Redis 中的数据类型

 

接下来,我们再来了解了解 Redis 中的数据类型。

 

Redis 中总共支持 5 种用于日常开发使用的数据类型

1、字符串类型

2、散列类型

3、列表类型

4、集合类型

5、有序集合类型

 

同样的,这几种数据类型笔者在这里仅仅会讲个大概,毕竟我们说好只需要稍微了解一下 Redis 的。

 

1、字符串类型

字符串类型在 Redis 中是最基本的数据类型。它能够存储任何形式的字符串,包括二进制数据。这意味着,我们不仅可以把一篇文章以字符串的形式保存在 Redis 中,还可以将一幅图片的二进制数据以字符串的形式保存起来。

 

字符串类型的数据就是标准的一对一 key-value 对形式。一个字符串形的键最在允许保存 512MB 的值内容。那既然是数据库,就必然离不开 CRUD,关于字符串类型的增删改查,则如下所示。

 

SET key1 value1

成功执行以后,可以看到会返回 OK 字样。

 

DEL key1

 

改动数据值所使用的命令和增加数据是一样的,其原理就是 “覆盖” 操作。

SET key1 value2

 

GET key1

查询结果如下图所示

我们也可以通过如下命令来查询某个 key 是什么类型的

TYPE key1

当我们存储的字符串值是数字值时,可以通过如下命令来实现值的自增需求

INCR key2
INCRBY key2 5
DECR key2

上面第 1 条命令是使 key2 的数字值自增 1 个值。第 2 条则是自增 5 个值。第 3 条命令则是实现自减 1 个值的需求。

 

当然,我们还可以批量操作多个键,通过如下命令来实现

MSET key1 v1 key2 v2
MGET key1 key2

 

2、散列类型

散列类型就是映射,就是 Map 。Redis 中的散列类型是一个 key 下面跟上多个字段,然后各个字段下面再跟上各自的存储内容构成的。并且每个 key 下面的不同字段的内容的存储位置是根据其字段名的哈希值来确定的。散列类型中的值只能是字符串类型。

 

HSET key1 field1 value1
HSET key1 field2 value2

可以注意到上面同一个 key1 下面存储了不同的 field 字段以及不同的值内容。

 

HDEL key1 field1

这条语句将会删除掉 key1 下的 field1 的内容。

 

其实与增的命令是一样的,其原理就是 “覆盖” 操作。

 

HGET key1 field1

我们还可以遍历某个 key 下的所有字段值

HGETALL key1

 

其实散列类型与字符串类型并没有太大的区别,甚至可以认为它们之间就是用于操作数据的关键字不同罢了。所有字符串类型能用的操作命令,将关键字换成 H 开头的以后都可以用于散列类型。

 

3、列表类型

列表类型就是一个有序的字符串集合。它在本质上是一个 “链表” 。

 

Redis 中的列表类型是一个允许向两端插入数据的集合。因此,列表类型中越靠近两端的数据其响应操作的速度就越快。而列表类型的缺点就是通过索引来查找数据的速度会比较慢,毕竟是要根据索引值一个一个去比对数值的。

 

Redis 中的列表类型可以很方便地被当成栈或者队列来使用。

 

LPUSH key1 value1 value2

这条命令是从左边开始插入数据,此时列表中的元素形式为

[ value2 , value1 ]

 

RPUSH key1 value3 value4 value5

这条命令是从右边插入元素,此时列表中的元素形式为

[ value2 , value1 , value3 , value4 , value5 ]

 

LREM key1 count value

删除 key1 的前 count 个 value。count 值还有以下区别。

count > 0
从左边开始 count 个 value 将会被删除。

count < 0
从右边开始 count 个 value 将会被删除。

count == 0
删除列表中所有的 value 元素。

 

LSET key1 index value

这条命令是将 key1 列表中的第 index 个元素的值改为 value 。

 

LPOP key1
RPOP key1

这两条命令分别代表从左边、从右边弹出一个元素。需要注意的是,元素被弹出以后,就在列表中被移除掉了。

 

LLEN key1 

查询 key1 列表的长度。即元素个数。

 

LRANGE key1 0 -1

遍历列表。 0 表示左边第 1 个元素,-1 表示右边第 1 个元素。

 

4、集合类型

Redis 中的集合类型,具有以下几个特点

1、只能存储字符串

2、无序

3、元素不可重复

4、集合中的元素以哈希值决定存储位置

 

其实也可以简单地把 Redis 中的集合理解成就是 Java 中的 Set 。

 

sadd key1 value1 value2

 

srem key1 value

 

暂无。

 

smembers key1

遍历集合元素。

 

sismenber key1 value

查询指定的元素是否存在于指定的 key 集合中。

 

5、有序集合类型

有序集合类型就是在普通集合类型之上增加了一个排序和分数的功能。

 

排序功能好理解。分数功能是什么呢?

 

分数功能说白了就是给某个值再添加多一个数字型的映射值。这个分数值就是排序的根据。

 

zadd key1 score1 value1 score2 value2

给 value1 打 score1 分,给 value2 打 score2 分。一定要注意这里的 score1 , score2 都是数字型的值。

 

zrem key1 member1

 

zincrby key1 increment member1

给 member1 值的分数增加 increment 分。这个 increment 也是数字型的值。

 

zscore key1 value1

查询 value1 的分数值。

 

zrange key1 start stop

查询 key1 有序列表中排名从 start 到 stop 的元素值。排序值从 0 开始。

 

zrank key1 member1

获取 member1 的分数在总体中的排名序号。

 

5、其它

 

Redis 中还有诸如事务、过期时间等常用的功能。但是这些知识就不在这里列举了。对于笔者而言,目前知道这些基础知识就差不多了,如果以后需要用到 Redis ,到时再深入去学习也不迟,而且到时带着需求去学习反而能更深刻一些。

 

总结完毕,下面开始新的知识点学习。

 


 

posted @ 2019-05-07 21:35  大窟窿  阅读(149)  评论(0编辑  收藏  举报