# Redis简介

Redis全称为Remote Dictionary Server,即远程的字典服务,是一个使用ANSI C语言编写的一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此,Redis可以满足很多的应用场景,而且因为Redis会将所有数据都存放在内存中,所以它的读写性能非常惊人。

不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据不会“丢失”。除了上述功能以外,Redis还提供了键过期、发布订阅、事务、流水线、Lua脚本等附加功能。

# 适合使用Redis的场景

对于Redis来说,Redis的应用场景广泛,总的来说,大致可以总结为下面5个场景。

  • 缓存:缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力。Redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。
  • 排行榜系统:排行榜系统几乎存在于所有的网站,例如按照热度排名的排行榜,按照发布时间的排行榜,按照各种复杂维度计算出的排行榜,Redis提供了列表和有序集合数据结构,合理地使用这些数据结构可以很方便地构建各种排行榜系统。
  • 计数器应用:计数器在网站中的作用至关重要,例如视频网站有播放数、电商网站有浏览数,为了保证数据的实时性,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择。
  • 社交网络:社交网络赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适合保存这种类型的数据,Redis提供的数据结构可以相对比较容易地实现这些功能。
  • 消息队列系统:消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦、非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够足够强大,但是对于一般的消息队列功能基本可以满足。

# 在Linux上安装Redis数据库

在使用Redis数据库之前,我们需要先安装Redis数据库,在这里,我们是在Centos 7.x环境下安装的。在Linux中,通常有两种安装软件的方式,第一种是通过Linux软件包管理系统来安装,另外一种是通过下载源码,编译安装。一般情况下,我们使用源码编译安装的方式。

  1. 首先,我们先从Redis官网下载Redis源码

    wget http://download.redis.io/releases/redis-5.0.5.tar.gz
    
  2. 然后,我们解缩redis-5.0.5.tar.gz压缩包

    tar -zxvf redis-5.0.5.tar.gz
    
  3. 接着,我们切换目录到已经解压的redis-5.0.5目录中。

    cd redis-5.0.5
    
  4. 编译源代码,生成可执行程序

    make
    
  5. 安装可执行程序

    make install
    

当上述步骤都执行完毕,我们就完成了Redis的安装。此时,我们可以使用以下命令在任何目录下查看Redis的版本。

redis-cli -v

若安装没有问题,输出redis的版本号redis-cli 5.0.5。当安装完Redis后,我们可以在目录/usr/local及其子目录中找到Redis的相关文件。

最后,我们将源代码中的redis.conf配置文件复制到安装目录中。

cp ./redis.conf /usr/local/bin

# 在Windows上安装Redis

Redis的官方并不支持微软的Windows操作系统,但是Redis作为一款优秀的开源技术吸引到了微软公司的注意,微软公司的开源技术组在GitHub上维护一个Redis的分支:https://github.com/MSOpenTech/redis

在Windows下安装Redis比较简单,直接下载Redis压缩包,并解压到自定义的目录下就可以使用了。

# Redis的配置、启动、操作、关闭

Redis安装之后,src和/usr/local/bin目录下多了几个以redis开头可执行文件,我们称之为Redis Shell,这些可执行文件可以做很多事情,例如可以启动和停止Redis、可以检测和修复Redis的持久化文件,还可以检测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来说,有三种方法可以启动Redis,分别是默认配置、运行配置、配置文件启动。我们切换到

  1. 默认配置方式启动

    这种方式会使用Redis的默认配置启动Redis

    ./redis-server
    

    下面就是redis-server执行后输出的相关日志

    8339:C 08 Aug 2019 17:04:23.972 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    8339:C 08 Aug 2019 17:04:23.972 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=8339, just started
    8339:C 08 Aug 2019 17:04:23.972 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf
    8339:M 08 Aug 2019 17:04:23.976 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                    _._
               _.-``__ ''-._
          _.-``    `.  `_.  ''-._           Redis 5.0.5 (00000000/0) 64 bit
      .-`` .-```.  ```\/    _.,_ ''-._
     (    '      ,       .-`  | `,    )     Running in standalone mode
     |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
     |    `-._   `._    /     _.-'    |     PID: 8339
      `-._    `-._  `-./  _.-'    _.-'
     |`-._`-._    `-.__.-'    _.-'_.-'|
     |    `-._`-._        _.-'_.-'    |           http://redis.io
      `-._    `-._`-.__.-'_.-'    _.-'
     |`-._`-._    `-.__.-'    _.-'_.-'|
     |    `-._`-._        _.-'_.-'    |
      `-._    `-._`-.__.-'_.-'    _.-'
          `-._    `-.__.-'    _.-'
              `-._        _.-'
                  `-.__.-'
    
    8339:M 08 Aug 2019 17:04:23.989 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    8339:M 08 Aug 2019 17:04:23.990 # Server initialized
    8339:M 08 Aug 2019 17:04:23.991 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
    8339:M 08 Aug 2019 17:04:23.993 * Ready to accept connection
    

    可以看到直接使用redis-server启动Redis后,会打印出一些日志,通过日志我们可以看到一些信息。

    • 当前Redis的版本是5.0.5
    • Redis的默认端口是6379

    Redis建议要使用配置文件来启动。因为直接启动无法自定义配置,所以这种方式是不会在生产环境中使用 的。

  2. 运行启动

    redis-server加上要修改配置名和值(可以是多对),没有设置的配置将使用默认配置。

    # redis-server --configKey1 configValue1 --configKey2 configValue2
    

    例如,如果要用6380作为端口启动Redis,那么可以执行

    redis-server --port 6380
    

    虽然运行配置可以自定义配置,但是如果需要修改的配置较多或者希望将配置保存到文件中,不建议使用这种方式。

  3. 配置文件启动

    将配置写到指定文件里,例如我们将配置写到了/opt/redis/redis.conf中,那么只需要执行如下命令即可启动Redis

    # redis-server /opt/redis/redis.conf
    

    TIP

    Redis目录下都会有一个redis.conf配置文件,里面就是Redis的默认配置,通常来讲我们会在一台机器上启动多个Redis,并且将配置集中管理在指定目录下,而且配置不是完全手写的,而是将redis.conf作为模板进行修 改。

总而言之,通过配置文件启动的方式提供了更大的灵活性,所以大部分生产环境会使用这种方式启动Redis。

# Redis命令行客户端

现在我们已经启动了Redis服务,下面将介绍如何使用redis-cli连接、操作Redis服务。redis-cli可以使用两种方式连接Redis服务器。

  • 交互式方式连接服务器:通过redis-cli -h {host} -p {port}的方式连接到Redis服务,之后所有的操作都是通过交互的方式实现。不再需要redis-cli前缀了

    redis-cli -h 127.0.0.1 -p 6379
    
  • 命令式方式连接服务器:用redis-cli-h ip {host} -p {port} {command}就可以直接得到命令的返回结果。

    redis-cli -h 127.0.0.1 -p 6379 get xxx
    

需要注意的是,若没有-h参数,则默认是127.0.0.1,若没有-p参数,则默认是6379端口。

# 停止Redis服务的两种方式

Redis提供了shutdown命令来停止Redis服务,例如要停掉127.0.0.1上6379端口上的Redis服务,可以执行如下操作。

shutdown

可以看到,但我们执行完这个命令,服务端将输出以下日志

8343:M 08 Aug 2019 17:38:14.716 # User requested shutdown...
8343:M 08 Aug 2019 17:38:14.716 * Saving the final RDB snapshot before exiting.
8343:M 08 Aug 2019 17:38:14.731 * DB saved on disk
8343:M 08 Aug 2019 17:38:14.732 # Redis is now ready to exit, bye bye...

需要注意的是,

  • Redis关闭的过程:断开与客户端的连接、生成持久化文件,是一种相对优雅的关闭方式。

  • 除了可以通过shutdown命令关闭Redis服务以外,还可以通过kill进程号的方式关闭掉Redis,但是不要粗暴地使用kill -9强制杀死Redis服务,不但不会做持久化操作,还会造成缓冲区等资源不能被优雅关闭,极端情况会造成AOF和复制丢失数据的情况。

  • shutdown还有一个参数,代表是否在关闭Redis前,生成持久化文件。

    shutdown nosave | save
    

# Redis的版本规则

Redis借鉴了Linux操作系统对于版本号的命名规则:版本号第二位如果是奇数,则为非稳定版本(例如2.7、2.9、3.1),如果是偶数,则为稳定版本(例如2.6、2.8、3.0、3.2)。

当前奇数版本就是下一个稳定版本的开发版本,例如2.9版本是3.0版本的开发版本。所以我们在生产环境通常选取偶数版本的Redis,如果对于某些新的特性想提前了解和使用,可以选择最新的奇数版本。

LastUpdated: 1/9/2020, 9:38:02 AM