Skip to content

安装

本内容将介绍在 Linux 环境下安装 Redis。

Redis概述

  • Redis 是一个开源的 key-value 存储系统

  • 和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string(字符串)、list(链表)、set(集合)、zset(sorted set 有序集合)和 hash(哈希类型)

    这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是 原子性 的。

  • 在此基础上,Redis 支持各种不同方式的 排序

  • 与 memcached 一样,为了保证效率,数据都是 缓存在内存中

  • 区别的是 Redis 会 周期性 的把更新的数据写入磁盘或者把修改操作写入追加的记录文件

  • 并且在此基础上实现了 master-slave(主从) 同步

应用场景

配合关系型数据库做高速缓存

  • 高频次,热门访问的数据,降低数据库 IO
  • 分布式架构,做 session 共享

多样的数据结构存储持久化数据

Redis安装

Redis 官方网站:http://redis.io/

官网下载网站:https://redis.io/download

下载 Linux 版本 6.2.1,具体版本根据你的需求。

安装步骤:

  • 安装 C 语言的编译环境:

    sh
    # 安装环境
    yum install -y centos-release-scl scl-utils-build devtoolset-8-toolchain gcc-c++
    # 开启 devtoolset-8
    scl enable devtoolset-8 bash

    测试 gcc 版本:

    sh
    gcc --version
  • 下载 redis-6.2.1.tar.gz 放 /opt 目录

  • 在 /opt 目录下解压,命令如下:

    sh
    tar -zxvf redis-6.2.1.tar.gz
  • 进入目录

    sh
    cd redis-6.2.1
  • 执行 make 命令进行编译

    sh
    make

    可能报错 Jemalloc/jemalloc.h:没有那个文件或目录,解决方法:

    make distclean

    然后再次执行 make 即可。

  • 确保 make 编译通过,然后执行安装命令

    sh
    make install

默认安装目录在 usr/local/bin 路径下

Redis启动

前台启动(不推荐)

sh
/usr/local/bin/redis-server

后台启动(推荐)

redis 默认不是后台启动,我们需要修改配置文件,一般我们在 /usr/local/bin 目录下,创建 myredis 目录,存放我们的配置文件

sh
cd /usr/local/bin
mkdir myredis   # 创建目录

# 拷贝配置文件
cp /opt/redis-6.2.1/redis.conf /usr/local/bin 

# 修改配置保证可以后台应用
vim redis.conf

找到 daemonize,大概在 128 行左右,我们可以利用搜索功能

sh
/daemonize   # 搜索功能

daemonize 是守护线程,默认是 no,无法进行守护,也就是无法后台启动,所有我们需要改为 yes。

daemonize 设置 yes 或者 no 区别

  • Redis 采用的是单进程多线程的模式。当 redis.conf 中选项 daemonize 设置成 yes 时,代表开启守护进程模式。在该模式下,Redis 会在后台运行,并将进程 pid 号写入至 redis.conf 选项 pidfile 设置的文件中,此时 Redis 将一直运行,除非手动 kill 该进程
  • 当 daemonize 选项设置成 no 时,当前界面将进入 Redis 的命令行界面,exit 强制退出或者关闭连接工具(putty,xshell 等)都会导致 Redis 进程退出

启动连接

启动时,我们告诉 Redis 启动使用的配置文件:

sh
cd /usr/local/bin

redis-server myredis/redis.conf

此时 Redis 服务已经启动成功,那么现在我们需要连接服务:

sh
redis-cli -p 6379   # 多个端口多个 -p

观察地址的变化,如果连接成功,是直接连上的,redis 默认端口号 6379

sh
127.0.0.1:6379> ping
PONG   # 返回这个代表连接成功

关闭连接

  • 内部关闭连接

    sh
    127.0.0.1:6379> shutdown
    not connected> exit
  • 外部关闭连接

    sh
    redis-cli shutdown
  • 多实例关闭,指定端口关闭:

    sh
    redis-cli -p 6379 shutdown -p 6380 shutdown # ......

redis压力测试

Redis-benchmark 是官方自带的 Redis 性能测试工具,可以有效的测试 Redis 服务的性能。

Redis 性能测试工具可选参数如下所示:

序号选项描述默认值
1-h指定服务器主机名127.0.0.1
2-p指定服务器端口6379
3-s指定服务器 socket
4-c指定并发连接数50
5-n指定请求数10000
6-d以字节的形式指定 SET/GET 值的数据大小2
7-k1=keep alive 0=reconnect1
8-rSET/GET/INCR 使用随机 key,SADD 使用随机值
9-P通过管道传输 numreq 请求1
10-q强制退出 redis。仅显示 query/sec 值
11--csv以 CSV 格式输出
12-l生成循环,永久执行测试
13-t仅运行以逗号分隔的测试命令列表。
14-IIdle 模式。仅打开 N 个 idle 连接并等待。
bash
# 测试:100 个并发连接,100000 个请求,检测 host 为 localhost 端口为 6379 的 Redis 服务器性能
cd  /usr/local/bin
redis-benchmark -h localhost -p 6379 -c 100 -n 100000

参考资料:https://www.runoob.com/redis/redis-benchmarks.html

Redis基础知识

Redis 默认有 16 个数据库,类似数组下标从零开始,初始默认使用 0 号库。每个数据库的数据不会互相影响,名字相同也不会影响。

查看 redis.conf ,里面有默认的配置

sh
# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16

select 命令切换数据库

sh
127.0.0.1:6379> select 7
OK
127.0.0.1:6379[7]>
# 不同的库可以存不同的数据

dbsize 查看当前数据库的 key 的数量

bash
127.0.0.1:6379> select 7
OK
127.0.0.1:6379[7]> DBSIZE
(integer) 0
127.0.0.1:6379[7]> select 0
OK
127.0.0.1:6379> DBSIZE
(integer) 5
127.0.0.1:6379> keys * # 查看具体的 key
1) "counter:__rand_int__"
2) "mylist"
3) "k1"
4) "myset:__rand_int__"
5) "key:__rand_int__"

flushdb 清空当前库,慎用。

flushall 清空全部的库,慎用。

bash
127.0.0.1:6379> DBSIZE
(integer) 5
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> DBSIZE
(integer) 0

关于Redis的单线程

Redis 是单线程 + 多路 IO 复用技术,多路指的是多个网络连接客户端,复用指的是复用同一个线程(单进程),多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态(监听多个客户端),比如调用 select 和 epoll 函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作,可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)。

多路 IO 复用技术也就是一个线程监听多个客户端,哪个客户端准备好了读写操作,就先与那个客户端进行连接。解决了单线程按顺序排队问题:排在第一个客户端卡住了,导致后面无法执行。

注:6.x 版本有多线程,一般用不到,单线程足够应对。

我们首先要明白,Redis 很快,官方表示,因为 Redis 是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了。

Redis 采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由 C 语言编写,官方提供的数据是可以达到 100000+ 的 QPS(每秒内查询次数)。这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 Memcached 差。

Redis 为什么这么快?

Redis 核心就是如果我的数据全都在内存里,我单线程的去操作就是效率最高的,为什么呢,因为多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。Redis 用单个 CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个 CPU 上完成的,所以它是单线程处理这个事。在内存的情况下,这个方案就是最佳方案。

因为一次 CPU 上下文的切换大概在 1500ns 左右。从内存中读取 1MB 的连续数据,耗时大约为 250us,假设 1MB 的数据由多个线程读取了 1000 次,那么就有 1000 次时间上下文的切换,那么就有 1500ns * 1000 = 1500us,单线程的读完 1MB 数据才 250us,而光时间上下文的切换就用了 1500us 了。