一、概述
Redis是什么?
Redis(Remote Dictionary Server),即远程字典服务
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis能干什么?
- 内存存储、持久化,内存中是断电即失、所以说持久化很重要( rdb、aof )
- 效率高,可用于高速缓存
- 发布订阅系统
- 地图信息分析
- 计时器、计数器(浏览量)
特性
- 多样的数据类型
- 持久化
- 集群
- 事务
准备
- Redis中文官网-CRUG网站 (redis.cn)
- Redis官网
- 最新版下载-Download | Redis
注意:Windows在Github上面下载(停更很久了)
根据官方文档所说,Redis推荐在Linux服务器上搭建,本教程也是基于Linux学习
Redis is written in ANSI C and works on most POSIX systems like Linux, *BSD, and Mac OS X, without external dependencies. Linux and OS X are the two operating systems where Redis is developed and tested the most, and we recommend using Linux for deployment.
二、Windows下安装
-
下载安装包Releases · microsoftarchive/redis (github.com),并
-
解压
-
开启redis,双击运行redis-server.exe即可
-
使用redis-cli.exe客户端,连接redis,并输入Ping命令,出现Pong表示连接成功
三、Linux下安装
-
下载安装包Redis 7.2.1-github.com
-
上传至云服务器并解压
-
安装gcc
-
进入redis解压的文件夹下,然后使用make命令进行编译,编译成功后进入/usr/local/bin
-
创建一个自己的目录,然后将redis配置文件复制到当前目录下(以后的配置文件就使用复制的这个)
mkdir selfconfig cp /opt/redis-7.2.1/redis.conf selfconfig
-
redis默认不是后台启动,需要修改配置文件
修改配置文件中的daemonize为Yes
-
启动redis服务,并使用客户端进行测试
-
关闭redis服务,在客户端中输入shutdown,断开连接后,输入exit退出客户端
四、Redis-benchmark性能测试
Redis-benchmark是一个压力测试工具,官方自带的性能测试工具
序号 | 选项 | 描述 | 默认值 |
---|---|---|---|
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 | 通过管道传输 请求 | 1 |
10 | -q | 强制退出 redis。仅显示 query/sec 值 | |
11 | --csv | 以 CSV 格式输出 | |
12 | *-l*(L 的小写字母) | 生成循环,永久执行测试 | |
13 | -t | 仅运行以逗号分隔的测试命令列表。 | |
14 | *-I*(i 的大写字母) | Idle 模式。仅打开 N 个 idle 连接并等待。 |
测试
#测试100个并发连接 10000个请求
redis-benchmark -h localhost -p 6379 -c 100 -n 1000
keep live:1的意思是,只有一台服务器来处理这些请求
五、基础知识
redis默认有16个数据库
默认使用第0个数据库,可以使用select进行切换
127.0.0.1:6379> select 3 #切换数据库
OK
127.0.0.1:6379[3]> dbsize #查看数据库大小
(integer) 0
127.0.0.1:6379[3]> set test 321 #设置键值对
OK
127.0.0.1:6379[3]> dbsize
(integer) 1
127.0.0.1:6379[3]> keys * #查看当前数据库所有的key
1) "test"
清空当前的数据库的key:flushdb
清空全部数据库的key:flushall
127.0.0.1:6379[3]> flushdb
OK
127.0.0.1:6379[3]> flushall
OK
127.0.0.1:6379[3]> select 0
OK
127.0.0.1:6379> keys *
(empty array)
为什么Redis以6379作为默认端口号?
Redis的线程问题
Redis 确实是单线程的。通常说的单线程,主要是指 Redis 对外提供的键值存储服务的主要流程是单线程,也就是网络IO和数据读写是由单个线程来完成的。除此外 Redis 的其他功能,比如持久化、 异步删除、集群数据同步等,是由额外的线程来执行的。因此,严格地说 Redis 并不是全面单线程。
-
官方原文:
Redis is single threaded. How can I exploit multiple CPU / cores? Its not very frequent that CPU becomes your bottleneck with Redis, as usually Redis is either memory or network bound. For instance, using pipelining Redis running on an average Linux system can deliver even 1 million requests per second, so if your application mainly uses O(N) or O(log(N)) commands, it is hardly going to use too much CPU.However, to maximize CPU usage you can start multiple instances of Redis in the same box and treat them as different servers. At some point a single box may not be enough anyway, so if you want to use multiple CPUs you can start thinking of some way to shard earlier.You can find more information about using multiple Redis instances in the Partitioning page.However with Redis 4.0 we started to make Redis more threaded. For now this is limited to deleting objects in the background, and to blocking commands implemented via Redis modules. For future releases, the plan is to make Redis more and more threaded.
大致意思:
由于Redis是基于内存的操作,查找和操作的时间复杂度都是O(1),因此CPU并不是Redis的瓶颈。 Redis的瓶颈很可能是机器内存或网络带宽的大小。 既然单线程易于实现并且CPU不会成为瓶颈,那采用单线程解决方案是合乎逻辑的了。
-
Redis7中的多线程机制需要手动修改配置文件开启:
-
设置io-threads-do-redis配置项为yes,表示启动多线程
-
设置线程个数,io-threads 个数,关于个数的设置,官方的建议是如果为4核的CPU,建议线程数设置为2或3,如果为8核CPU建议线程数设置为6(线程数一定要小于机器核数,并非越大越好)