安装
本内容将介绍在 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 版本:
shgcc --version
下载 redis-6.2.1.tar.gz 放 /opt 目录
在 /opt 目录下解压,命令如下:
shtar -zxvf redis-6.2.1.tar.gz
进入目录
shcd redis-6.2.1
执行
make
命令进行编译shmake
可能报错
Jemalloc/jemalloc.h:没有那个文件或目录
,解决方法:make distclean
然后再次执行
make
即可。确保 make 编译通过,然后执行安装命令
shmake install
默认安装目录在 usr/local/bin
路径下
Redis启动
前台启动(不推荐)
/usr/local/bin/redis-server
后台启动(推荐)
redis 默认不是后台启动,我们需要修改配置文件,一般我们在 /usr/local/bin 目录下,创建 myredis 目录,存放我们的配置文件
cd /usr/local/bin
mkdir myredis # 创建目录
# 拷贝配置文件
cp /opt/redis-6.2.1/redis.conf /usr/local/bin
# 修改配置保证可以后台应用
vim redis.conf
找到 daemonize,大概在 128 行左右,我们可以利用搜索功能
/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 启动使用的配置文件:
cd /usr/local/bin
redis-server myredis/redis.conf
此时 Redis 服务已经启动成功,那么现在我们需要连接服务:
redis-cli -p 6379 # 多个端口多个 -p
观察地址的变化,如果连接成功,是直接连上的,redis 默认端口号 6379
127.0.0.1:6379> ping
PONG # 返回这个代表连接成功
关闭连接
内部关闭连接
sh127.0.0.1:6379> shutdown not connected> exit
外部关闭连接
shredis-cli shutdown
多实例关闭,指定端口关闭:
shredis-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 | -k | 1=keep alive 0=reconnect | 1 |
8 | -r | SET/GET/INCR 使用随机 key,SADD 使用随机值 | |
9 | -P | 通过管道传输 numreq 请求 | 1 |
10 | -q | 强制退出 redis。仅显示 query/sec 值 | |
11 | --csv | 以 CSV 格式输出 | |
12 | -l | 生成循环,永久执行测试 | |
13 | -t | 仅运行以逗号分隔的测试命令列表。 | |
14 | -I | Idle 模式。仅打开 N 个 idle 连接并等待。 |
# 测试: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 ,里面有默认的配置
# 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
命令切换数据库
127.0.0.1:6379> select 7
OK
127.0.0.1:6379[7]>
# 不同的库可以存不同的数据
dbsize 查看当前数据库的 key 的数量
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 清空全部的库,慎用。
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 了。