目录
概述
Redis 是什么
Redis
:
RE
mote
DI
ctionary
S
erver
(远程字典服务器)
是完全开源免费的,用
C
语言编写的,遵守
BSD
协议,是一个高性能的(
Key/Value
)分布式内存数据库,基于内存运行,并支持持久化的
NoSQL
数据库,是当前最热门的
NoSQL
数据库之一,也被人们称为
数据结构服务器
Redis与其他key-value缓存产品有以下三个特点
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的 key-value 类型的数据,同时还提供list、set、zset、hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
Redis 能干嘛
内存存储和持久化:
redis
支持异步将内存中的数据写到硬盘上,同时不影响继续服务
取最新
N
个数据的操作,如:可以将最新的
10
条评论的
ID
放在
Redis
的
List
集合里面
发布、订阅消息系统
地图信息分析
定时器、计数器
......
特性
数据类型、基本操作和配置
持久化和复制,
RDB
、
AOF
事务的控制
.....
常用网站
https://redis.io/
官网
http://www.redis.cn
中文网
Windows安装
下载地址:
https://github.com/dmajkic/redis/downloads
(
素材提供
)
解压到自己电脑的环境目录即可

双击 redis-server.exe 启动即可

通过客户端去访问
redis
-
cli
- # 基本的set设值
- 127.0.0.1:6379> set key zhoujielun
- OK
- # 取出存储的值
- 127.0.0.1:6379> get key
- "zhoujielun"
redis
-
cli
重要提示
由于企业里面做
Redis
开发,
99%
都是
Linux
版的运用和安装,几乎不会涉及到
Windows
版,上一步的讲解只是为了知识的完整性,
Windows版不作为重点,大家可以自己玩,企业实战就认一个版:Linux
版
http://www.redis.cn/topics/introduction
Linux安装
下载地址 http://download.redis.io/releases/redis-5.0.7.tar.gz
安装步骤
1
、下载获得
redis
-
5.0.7.tar.gz
后将它放到我们
Linux
的目录下
/opt
2
、
/opt
目录下,解压命令 :
tar
-
zxvf redis
-
5.0.7.tar.gz
3
、解压完成后出现文件夹:
redis-5.0.7
4
、进入目录:
cd redis-5.0.7
5
、在
redis-5.0.7
目录下执行
make
命令
运行 make 命令时故意出现的错误解析:1. 安装 gcc (gcc 是 linux 下的一个编译程序,是 c 程序的编译工具 )能上网 : yum install gcc-c++版本测试 : gcc-v2. 二次 make3. Jemalloc/jemalloc.h: 没有那个文件或目录运行 make distclean 之后再 make4. Redis Test (可以不用执行)
6
、如果
make
完成后继续执行
make install
7
、查看默认安装目录:
usr/local/bin
/usr 这是一个非常重要的目录,类似于 windows 下的 Program Files, 存放用户的程序
8
、拷贝配置文件(备用)
cd /usr/local/binls -l# 在 redis 的解压目录下备份 redis.confmkdir myrediscp redis.conf myredis # 拷一个备份,养成良好的习惯,我们就修改这个文件# 修改配置保证可以后台应用vim redis.conf
- A、redis.conf配置文件中daemonize守护线程,默认是NO。
- B、daemonize是用来指定redis是否要用守护线程的方式启动。
daemonize
设置
yes
或者
no
区别
- daemonize:yes
- redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启 守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项 pidfifile设置的文件中,此时redis将一直运行,除非手动kill该进程。
- daemonize:no
- 当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭 连接工具(putty,xshell等)都会导致redis进程退出。
9
、启动测试一下!
# 【 shell 】启动 redis 服务[root@192 bin] # cd /usr/local/bin[root@192 bin] # redis-server /opt/redis-5.0.7/redis.conf# redis 客户端连接 ===> 观察地址的变化,如果连接 ok, 是直接连上的, redis 默认端口号 6379[root@192 bin] # redis-cli -p 6379127 .0.0.1:6379> pingPONG127 .0.0.1:6379> set k1 helloworldOK127 .0.0.1:6379> get k1"helloworld"# 【 shell 】 ps 显示系统当前进程信息[root@192 myredis] # ps -ef|grep redisroot 16005 1 0 04 :45 ? 00 :00:00 redis-server127 .0.0.1:6379root 16031 15692 0 04 :47 pts/0 00 :00:00 redis-cli -p 6379root 16107 16076 0 04 :51 pts/2 00 :00:00 grep --color = auto redis# 【 redis 】关闭连接127 .0.0.1:6379> shutdownnot connected> exit# 【 shell 】 ps 显示系统当前进程信息[root@192 myredis] # ps -ef|grep redisroot 16140 16076 0 04 :53 pts/2 00 :00:00 grep --color = auto redis
基础知识说明
准备工作:开启
redis
服务,客户端连接
redis 压力测试工具 -----Redis-benchmark
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
|
通过管道传输 请求
| 1 |
10 |
-q
|
强制退出
redis
。仅显示
query/sec
值
| |
11 |
--csv
|
以
CSV
格式输出
| |
12 |
-l
|
生成循环,永久执行测试
| |
13 |
-t
|
仅运行以逗号分隔的测试命令列表。
| |
14 |
-I
|
Idle
模式。仅打开
N
个
idle
连接并等待。
|
# 测试一: 100 个并发连接, 100000 个请求,检测 host 为 localhost 端口为 6379 的 redis 服务器性能redis-benchmark -h localhost -p 6379 -c 100 -n 100000# 测试出来的所有命令只举例一个!====== SET ======100000 requests completed in 1 .88 seconds # 对集合写入测试100 parallel clients # 每次请求有 100 个并发客户端3 bytes payload # 每次写入 3 个字节的数据,有效载荷keep alive: 1 # 保持一个连接,一台服务器来处理这些请求17 .05% < = 1 milliseconds97 .35% < = 2 milliseconds99 .97% < = 3 milliseconds100 .00% < = 3 milliseconds # 所有请求在 3 毫秒内完成53248 .14 requests per second # 每秒处理 53248.14 次请求
基本数据库常识
默认
16
个数据库,类似数组下标从零开始,初始默认使用零号库
查看 redis.conf ,里面有默认的配置databases 16# 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'-1databases 16
Select
命令切换数据库
127 .0.0.1:6379> select 7OK127 .0.0.1:6379[7]># 不同的库可以存不同的数据
Dbsize
查看当前数据库的
key
的数量
127 .0.0.1:6379> select 7OK127 .0.0.1:6379[7]> DBSIZE(integer) 0127 .0.0.1:6379[7]> select 0OK127 .0.0.1:6379> DBSIZE(integer) 5127 .0.0.1:6379> keys * # 查看具体的 key1 ) "counter:__rand_int__"2 ) "mylist"3 ) "k1"4 ) "myset:__rand_int__"5 ) "key:__rand_int__"
Flushdb
:清空当前库
Flushall
:清空全部的库
127 .0.0.1:6379> DBSIZE(integer) 5127 .0.0.1:6379> FLUSHDBOK127 .0.0.1:6379> DBSIZE(integer) 0
为什么默认端口是
6379
?粉丝效应!
为什么 redis 是单线程
我们首先要明白,
Redis
很快!官方表示,因为
Redis
是基于内存的操作,
CPU
不是
Redis
的瓶颈,
Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且
CPU
不会成为瓶颈,那就
顺理成章地采用单线程的方案了!
Redis
采用的是基于内存的采用的是单进程单线程模型的
KV
数据库,由
C
语言编写,官方提供的数据是
可以达到
100000+
的
QPS
(每秒内查询次数)。这个数据不比采用单进程多线程的同样基于内存的
KV
数据库
Memcached
差!
Redis为什么这么快?
1
)以前一直有个误区,以为:高性能服务器 一定是多线程来实现的
原因很简单因为误区二导致的:多线程 一定比 单线程 效率高,其实不然!
在说这个事前希望大家都能对
CPU
、 内存 、 硬盘的速度都有了解了!
2
)
redis
核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为多线程的本质就是
CPU
模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切
换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。
redis
用 单个
CPU
绑定一块内存
的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个
CPU
上完成的,所以它是单线程处
理这个事。在内存的情况下,这个方案就是最佳方案。
因为一次
CPU
上下文的切换大概在
1500ns
左右。从内存中读取
1MB
的连续数据,耗时大约为
250us
假设
1MB
的数据由多个线程读取了
1000
次,那么就有
1000
次时间上下文的切换,那么就有
1500ns *
1000 = 1500us
,我单线程的读完
1MB
数据才
250us ,
你光时间上下文的切换就用了
1500us
了,我还不
算你每次读一点数据的时间。