【Redis】Redis基础教程(1)
前言:
推荐免费Redis基础讲解视频:【狂神说Java】Redis最新超详细版教程通俗易懂_哔哩哔哩_bilibili
NoSQL概述
单机MySQL的演进
单机MySQL年代
Memcached(缓存)+MySQL+垂直拆分
发展过程:优化数据结构和索引->文件缓存(IO)->Memcached
分库分表+水平拆分+MySQ集群
本质:数据库(读和写)
MyISAM:表锁,影响效率,高并发下出现严重锁问题;
Innodb:行锁
如今的数据库结构
什么是NoSQL
NoSQL(Not Only SQL)
泛指非关系型数据库;随着互联网的告诉发展,传统关系型数据库也很难解决一些问题;NoSQL来解决这一问题。
用户的个人信息,社交网络,地理位置等这些数据类型的存储不需要一个固定的格式!
NoSQL的特点
解耦:
-
方便扩展
-
大数据量高性能(Redis一秒写8万次,读取11万次;NoSQL是一种细粒度的缓存,性能高)
-
数据类型多样性
-
传统RDBMS和NoSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 传统RDBMS
- 结构化组织
- SQL
- 数据和关系都存在单独表中
- 操作系统,数据定义语言
- 严格的一致性
- 基础的事务
# NoSQL
- 不仅仅是数据
- 没有固定的查询语言
- 键值对存储,列存储,文档存储,图形数据库
- 最终一致性
- CAP定理和BASE
- 高性能,高可用,高扩展
了解3V和3高:
大数据时代的3V:
-
海量Voulme(用户多)
-
多样Varierty(每种数据都不一样)
-
实时Velocity(实时性)
大数据时代的3高:
-
高并发
-
高可扩(扩展性)
-
高性能(保证用户体验和性能)
公司的实践:NoSQL+RDBMS
NoSQL的四大分类
-
KV键值存储
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据
-
列存储
这部分数据库通常是用来应对分布式存储的海量数据
-
文档存储
Bson格式,该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,类似Json;
-
图形数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上
Redis概述
Redis(Remote Dictionary Server) 远程字典服务;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
开源项目,是当下最热门的NoSQL技术之一,也常被称为结构化数据库;
Redis的作用
- 内存存储,持久化(RDB/AOF);
- 效率高,可用于高速缓存;
- 发布订阅系统;
- 地图信息分析;
- 计时(数)器;
Redis特性:数据类型多样化,数据持久化,集群,事务…
Redis安装
官网:Redis
Linux安装(推荐)
-
下载Redis
下载地址:Download | Redis
如果你下载无法下载,可以复制下载地址到GitHub Proxy 代理加速进行下载;
-
把下载好的压缩包上传到远程服务器
-
解压上传的Redis压缩包
1
tar -zsvf redis-7.0.4.tar.gz
-
进入解压好的目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17[root@jokerdig opt]# ls
apache-tomcat-8.5.82 redis-7.0.4
containerd redis-7.0.4.tar.gz
[root@jokerdig opt]# cd redis-7.0.4/
[root@jokerdig redis-7.0.4]# ls
00-RELEASENOTES runtest
BUGS runtest-cluster
CODE_OF_CONDUCT.md runtest-moduleapi
CONTRIBUTING.md runtest-sentinel
COPYING SECURITY.md
deps sentinel.conf
INSTALL src
Makefile tests
MANIFESTO TLS.md
README.md utils
redis.conf
[root@jokerdig redis-7.0.4]# -
安装基本环境
1
2
3
4
5yum install gcc-c++ # 安装基本环境
gcc -v # 查看版本
make # 等待make执行完毕
make install # 查看安装 -
安装好的启动文件默认在
/usr
下1
2
3
4
5
6
7
8
9
10
11
12
13
14[root@jokerdig src]# clear
[root@jokerdig src]# cd /usr
[root@jokerdig usr]# ls
bin include lib libexec sbin src
games java lib64 local share tmp
[root@jokerdig usr]# cd local
[root@jokerdig local]# ls
aegis etc include lib64 sbin src
bin games lib libexec share
[root@jokerdig local]# cd bin
[root@jokerdig bin]# ls
redis-benchmark redis-check-rdb redis-sentinel
redis-check-aof redis-cli redis-server
[root@jokerdig bin]# -
将刚才的配置文件拷贝到当前目录下
1
2
3
4
5[root@jokerdig bin]# mkdir myconfig # 新建目录为myconfig
[root@jokerdig bin]# cp /opt/redis-7.0.4/redis.conf myconfig # 复制配置文件到myconfig下
[root@jokerdig bin]# cd myconfig
[root@jokerdig myconfig]# ls
redis.conf -
redis默认不是后台启动,需要我们修改配置文件
1
2
3
4[root@jokerdig myconfig]# ls
redis.conf
[root@jokerdig myconfig]# vim redis.conf
daemonize yes # 找到daemonize,默认为no改为yes -
启动redis服务
1
[root@jokerdig bin]# redis-server myconfig/redis.conf # 通过指定的配置文件启动服务
-
连接redis,并简单测试
1
2
3
4
5
6
7
8
9
10
11
12[root@jokerdig bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
127.0.0.1:6379> set name jokerdig.com
OK
127.0.0.1:6379> get name
"jokerdig.com"
127.0.0.1:6379>
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> -
开启新的服务,查看redis进程
1
2
3
4
5[root@jokerdig bin]# ps -ef|grep redis
root 47996 1 0 15:13 ? 00:00:00 redis-server 127.0.0.1:6379
root 48002 43286 0 15:14 pts/0 00:00:00 redis-cli -p 6379
root 48029 48007 0 15:17 pts/1 00:00:00 grep --color=auto redis
[root@jokerdig bin]# -
如何关闭redis
1
2
3127.0.0.1:6379> shutdown
not connected> exit
[root@jokerdig bin]#
Windows安装(不推荐)
-
下载Redis
下载地址:Releases · microsoftarchive/redis (github.com)
可以看到已经停更好久了!
-
下载好压缩包,解压到指定目录
-
双击
redis-server.exe
即可启动Redis默认端口:6379
-
双击
redis-cli.exe
启动客户端,进行连接,输入ping
,输出PONG
表示连接成功 -
设置
key/value
并获取
这篇教程主要以Linux使用Redis为准(Redis官方也推荐在Linux使用Redis),Windows仅作安装演示。
Redis基本知识说明
Redis性能测试
redis-benchmark
是一个压力测试工具
语法:
1 | redis-benchmark [option] [option value] # 在服务器目录下执行,而非redis客户端 |
可选参数:
描述 | 默认值 | 默认值 |
---|---|---|
-h |
指定服务器主机名 | 127.0.0.1 |
-p |
指定服务器端口 | 6379 |
-s |
指定服务器 socket | |
-c |
指定并发连接数 | 50 |
-n |
指定请求数 | 10000 |
-d |
以字节的形式指定 SET/GET 值的数据大小 | 3 |
-k |
1=keep alive 0=reconnect | 1 |
-r |
SET/GET/INCR 使用随机 key, SADD 使用随机值 | |
-P |
通过管道传输 <numreq> 请求 |
1 |
-q |
强制退出 redis。仅显示 query/sec 值 | |
--csv |
以 CSV 格式输出 | |
-l |
生成循环,永久执行测试 | |
-t |
仅运行以逗号分隔的测试命令列表。 | |
-I |
Idle 模式。仅打开 N 个 idle 连接并等待。 |
简单测试:
1 | 90个并发连接 50000请求 |
Redis基本知识
数据库
redis默认有16个数据库,默认使用第0个数据库;
可以使用select
进行切换
1 | 127.0.0.1:6379> select 2 # 切换数据库 |
查看所有的key
1 | 127.0.0.1:6379> keys * |
清空数据库内容
1 | 127.0.0.1:6379> flushdb # 清空当前数据库 |
Redis是单线程吗
Redis 单线程指的是:
接收客户端请求->解析请求 ->进行数据读写等操作->发生数据给客户端
这个过程是由一个线程(主线程)来完成的,这也是我们常说 Redis 是单线程的原因。
但是,Redis 程序并不是单线程的,Redis 在启动的时候,是会启动后台线程(BIO)。
Redis 单线程为什么速度还快
- 高性能的服务器并不一定就是多线程;
- 多线程不一定比单线程效率高;
核心原因:
- Redis 的大部分操作都在内存中完成,并且采用了高效的数据结构,因此决定Redis瓶颈的是网络带宽或内存,并非CPU;
- 采用单线程避免多线程之间竞争的问题,也不会导致死锁;
- Redis 采用了 I/O 多路复用机制处理大量的客户端 Socket 请求,即一个线程处理多个 IO 流。
Redis6.0后引入多线程问题
Redis 的主要工作(网络 I/O 和执行命令)一直是单线程模型,但在 Redis 6.0 版本之后,也采用了多个 I/O 线程来处理网络请求,这是因为随着网络硬件的性能提升,网络 I/O 的处理成为Redis处理数据的瓶颈,因此引入的多线程 I/O 特性对性能提升。
但是对于读写命令,Redis 仍然使用单线程来处理
关于RedisKey的基本命令
Redis官方命令文档:Commands | Redis
Redis 键命令用于管理 redis 的键
语法:
1 | COMMAND key_name |
例子:
1 | 127.0.0.1:6379> set name jokerdig.com |
常用命令
命令 | 描述 |
---|---|
DEL key |
该命令用于在 key 存在时删除 key |
DUMP key |
序列化给定 key ,并返回被序列化的值。 |
EXISTS key |
检查给定 key 是否存在。 |
EXPIRE key seconds |
给定 key 设置过期时间,以秒计。 |
EXPIREAT key timestamp |
EXPIREAT 的作用和 EXPIRE 类似不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳。 |
PEXPIRE key milliseconds |
设置 key 的过期时间以毫秒计。 |
PEXPIREAT key milliseconds-timestamp |
设置 key 过期时间的时间戳以毫秒计 |
KEYS pattern |
查找所有符合给定模式的 key,key * 查看所有 。 |
MOVE key db |
将当前数据库的 key 移动到给定的数据库 db 当中。 |
PERSIST key |
移除 key 的过期时间,key 将持久保持。 |
PTTL key |
以毫秒为单位返回 key 的剩余的过期时间。 |
TTL key |
以秒为单位,返回给定 key 的剩余生存时间。 |
RANDOMKEY |
从当前数据库中随机返回一个 key 。 |
RENAME key newkey |
修改 key 的名称 |
RENAMENX key newkey |
当 newkey 不存在时,将 key 改名为 newkey 。 |
SCAN cursor [MATCH pattern\] [COUNT count] |
迭代数据库中的数据库键。 |
TYPE key |
返回 key 所储存的值的类型。 |