初识Redis

  • 2019 年 10 月 7 日
  • 筆記

今天我们学习一种新的NoSQL数据库,叫做Redis。Redis是一种基于键值对(key-value)的NoSQL数据库。Redis与其它数据库相比,不同的是Redis的值可以存储多种数据类型。它们具体包括:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、GEO(地理信息定位)等。除此之外Redis还会将数据保存到内存中,所以Redis数据库地读写性能非常高。这时可能有人会说,那Redis岂不是很不安全,因为保存在内存中的数据是不安全的,如果碰到突然断电或者系统故障的话,那保存到Redis中的数据岂不是就要丢失了。在这一点上,我们恰恰不用担心,因为Redis为我们提供了快照和日志等方式,来允许我们将内存中的数据保存到硬盘上,这样当遇到上述故障重Redis时,Redis就会重新从硬盘加载已经保存好的数据,重新加载到内存中。除了上述功能外,Redis还提供了很多附加的高级的功能。如键过期、发布订阅、事物、流水线、Lua脚本等功能。下面我们看一下Redis中的特性。

  • Redis特性
  1. 前面我们提到过Redis的执行速度非常快,下面我们从几个方面来介绍一下为什么Redis的速度这么快。首先Redis中的所有数据都是存储到内存中的,我们知道直接操作内存和直接操作磁盘是有很大的区别的,因为操作磁盘为会很大的IO开销,所以,这也是Redis将数据保存到内存中,提高性能的原因之一。其二Redis是用C语言写的,在这一点上,我们知道C语言是最接近汇编的语言,也就是最接近操作系统的语言了,所以,在执行速度上,也会比间接提高Redis的执行效率。还有一个原因,那就是Redis是采用单线程架构,这么做的好处就是可以预防多线程可以产生的竞争问题。
  2. Redis虽然是键值对的数据库,但Redis中的值不仅可以保存字符串,还可以保存多种数据类型。也就是前面提到过的字符串、哈希、列表、集合、有序集合等。
  3. 在Redis中除了提供了上述的5种数据结构外,还提供了多种额外的功能。如键过期(可以实现缓存功能)、发布订阅(可以实现消息系统)、流水线(可以通过此功能一次性执行一批命令,减少网络开销)、Lua脚本(可以通过Lua语言创造新的Redis命令)等。
  4. Redis提供了简单的TCP通信协议,支持很多种语言,可以很方便的接入到Redis中。
  5. 持久化。就向前面提到的。在Redis中,可以通过快照和日志功能,来将内存中的数据,持久化到硬盘中。
  6. 主从复制。Redis中提供了复制的功能。可以实现多个相同的数据的Redis副本,依次来实现Redis的分布式存储。
  7. 分布式。Redis中提供了Redis Sentinel功能,通过它可以保证Redis节点在发生故障时,自动转移。依次来保证Redis的安全性。除此之外,Redis还提供了Redis Cluster功能。正是通过此功能,才保证了Redis真正的分布式实现。
  • Redis可以做些什么
  1. 缓存。通过Redis中的键过期功能,我们可以为键设置一个过期时间,这样当这个键超过了过期时间时,当前保存的键的信息,也就是失效了。这也就是用Redis实现缓存功能的使用方式。
  2. 排行榜系统。在Redis中提供了列表和有序列表,通过此功能,我们可以很方便的实现排行榜功能,
  3. 计数器。我们平时在购物时,会发现购物网站上有很多类似于浏览量之类的数据。当我们每访问一次时,数据就会执行加1操作。如果我们采用传统的数据库方式实现,那么就会因为并发量很大,而对数据库性能产生相应影响。而如果采用Redis的方式计算,则会容易多了,因为Redis中会在内存中计算,这样计数器的性能就会非常高了。当然除此之外还可以用Redis实现社交网络中的赞、踩、粉丝、共同好友、等功能。
  4. 消息队列。Redis中提供了发布订阅和阻塞队列功能,虽然我们可以使用专业的消息队列,但对于一般的队列功能,Redis都可以支持。
  • Redis的注意事项
  1. 我们知道Redis是将数据存储到内存中的,虽然存储到内存中的会提到数据访问的性能,但如果我们将所有的数据都保存到内存中,那么就可能会造成相应的内存泄漏了,从而导致系统的瘫痪。
  2. 我们知道,将数据存储到内存中的目的是为了提高数据访问的性能。那么我们怎么在设计系统时,怎么判断哪些数据要保存到Redis中,而哪些数据而不需要保存到Redis中呢?通常来说数据分为热数据(频繁操作的数据)和冷数据(非频繁操作的数据)。我们知道,提高数据访问性能的主要原因是因为大量并发的操作,正是因为这样,所以,如果我们不将大部分用户都访问的公用数据放到内存中,那么势必会造成程序的不稳定。所以我们应该将公用的数据,应该存储到Redis中。那么反之,不是公用的数据,也就不会产生大量的并发,所以,这一部分数据,我们是不需要存储到Redis中的。
  • Redis的安装
  1. 通过了上述的介绍使我们知道Redis在系统架构中有者不可替代的作用,而大部分企业的系统架构都采用了Linux系统部署,所以,在介绍安装时我们将重点介绍Linux系统的安装。因为本文将采用源码的方式安装,又因为Linux系统和Mac OS系统源码安装的方式相同,所以,本文将采用Mac OS系统的方式来演示安装过程。
  2. 首先我们访问Redis官网。来选择Redis的源码包。具体操作如图示:

当我们下载完成后,我们只需执行下面的命令就可以采用源码的方式,安装Redis。

tar xzvf redis.tar.gz // 解压当前压缩包
ln -s redis redis // 创建一个redis目录软链接
cd redis // 进入redis目录
make // 编译
make install // 安装

当我们安装完成后可以直接执行下面命令查看redis的版本,如果没有显示版本则表示可能redis安装失败,或者,当前目录不至此此命令

redis-cli -v

在Redis安装成功后的bin目录下会有很多以redis开头的可执行文件。掌握这些文件的使用,可以帮助我们更好的理解redis的使用。下在我们来简单介绍一下bin目录下的相关redis命令。

可执行文件

作用

redis-server

启动Redis

redis-cli

Redis命令行客户端

redis-benchmark

Redis基准测试工具

redis-check-aof

Redis AOF持久化文件检测和修复工具

redis-check-dump

Redis RDB持久化文件检测和修复工具

redis-sentinel

启动Redis Sentinel

下面我们用上面提到的命令来启动Redis,也就是redis-server命令。

通过上面的启动信息,可以使我们知道当前Redis的版本是4.0.9,端口是6379(Redis的默认端口)。那如果我们要修改Redis的端口,应该怎么做呢?在Redis中我们可以很方便的实现,也就是在redis-server命令后直接添加端口即可。具体命令如下:

redis-server –port 6380

在Redis中我们除了上述的方式外,还可以通过修改配置文件的方式来修改端口(不只是端口,还有其它的相关配置),并且这种方式,是Redis官方推荐的方式。Redis中的配置文件在redis.conf文件中,下面我们看一下redis.conf文件中相关参数的说明。

配置名

配置说明

port

端口

logfile

日志文件

dir

Redis工作目录(存放持久化文件和日志文件)

daemonize

是否以守护进程的方式启动Redis下面我们修改redis.conf文件中的port属性,然后启动Redis服务,看一下Redis端口是否成功被修改。

下面我们用配置文件中的方式来启动Redis服务。

redis-server /redis.conf
  • Redis命令行客户端
  1. 既然我们已经成功的启动了Redis服务,下面我们用下面的命令来访问我们的Redis服务。

redis-cli – h {host} -p {port}

我们看上面的信息,已经成功将hello world信息存储到了Redis中的。除了上述的操作外,我们还可以直接获取Redis中的值。具体操作如下:

如果我们没有修改Redis默认的端口,并且访问的是本地Redis服务的话,那么我们在用redis-cli命令连接Redis服务时,就可以不用指定 -h参数和-p参数了。

  • 停止Redis服务

在我们不需要连接Redis服务时,我们可以使用下面的命令来优雅的方式停止Redis服务,既然有优雅的方式,当然也有相对暴力的方式停止服务,也就是直接杀掉进程的方式。但Redis不推荐使用这个方式停止Redis服务,因为这种方式可能会导致Redis相关数据的丢失。下面我们看优雅的停止Redis服务的命令。

redis-cli shutdown

采用这种方式停止Redis服务时,Redis会自动的生成持久化文件,从而保证Redis中的数据的不会丢失。当然我们也可以添加相关参数则让Redis服务在执行上述命令时不生成持久化文件。具体的命令如下:

redis-cli shutdown nosave|save