前言
Redis是一个高性能的开源内存数据库,常用于缓存、会话存储和实时数据处理,它是一款非关系型数据库。在生产环境中,Redis通过将数据存储在内存中以及支持多种数据结构,提供了快速的读写能力,并且可通过持久化功能确保数据安全。其作为消息代理系统还能支持发布/订阅模式,使得它成为构建实时通信和事件驱动架构的理想选择。
目录
一、关系数据库与非关系型数据库
1. 关系型数据库
2. 非关系型数据库
3. 区别
二、Redis 简介
1. 概述
2. 优缺点
3. redis 特点(为什么速度快)
三、Redis 部署
1. 环境准备
2. 编译安装
3. 执行脚本文件
4. 软链接
5. 登录
四、服务控制与配置
1. Redis 服务控制
2. 常用配置文件参数
3. 命令工具
3.1 redis-cli 命令行工具
3.2 redis-benchmark 测试工具
五、数据库常用命令
1. set 与 get
2. keys
3. exists
4. del
5. type
6. rename
7. renamenx
8. dbsize
9. 设置密码
六、Redis 多数据库常用命令
1. select
2. move
3. 清除数据库内数据
关系型数据库是所有实体之间联系的集合,其存储结构是由二维表及其之间的联系所组成的一个数据组织,一般面向于记录。SQL 语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。常见关系型数据库:Oracle、MySQL、SQLserver等。MySQL 相关介绍请参考:关系型数据库MySQL_Fang_Qianling的博客-CSDN博客
NoSQL(NoSQL = Not Only SQL ),意思是“不仅仅是 SQL”,是非关系型数据库的总称。不需要预先建库建表定义数据存储表结构,以 key-values(键值对)存储,结构不固定,可以减少一些时间和空间的开销。常见的非关系型数据库:Redis、Memcached、mongDB等。Memcached 介绍请参考:Memcached非关系型数据库介绍-CSDN博客
区别 | 关系型数据库 | 非关系型数据库 |
数据结构 | 二维表 | 无固定结构 |
查询语句 | SQL通用结构化查询语句,可用于复杂查询 | 针对特定的数据模型特定的查询语句 |
存储位置 | 硬盘 | 内存,后期支持存储在硬盘 |
扩展方式 | 纵向,比如说硬件中添加内存 | 横向,天然分布式 |
Redis 是 nosql 非关系型数据库,是一款基于内存运行并支持持久化的服务程序,采用 key-values(键值对)存储;是单进程模型,即一台机器可同时启动多个 redis 进程(一般一台机器做2-3个进程),可以做分布式集群架构。
优点:
缺点:
① 纯内存结构
② 命令处理的核心模块是单线程,减少了锁竞争
③ 采用 I/O 多路复用(异步非阻塞)机制,大大提升了并发效率
注:在 Redis 6.0 中新增加的多线程也只是针对处理网络请求过程采用了多线性,而数据的读写命令,仍然是单线程处理的。
企业中一般会使用5版本的 redis,这里选择 redis-5.0.7 源码包进行安装。
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y gcc gcc-c++ make
[root@localhost ~]# cd /opt
[root@localhost opt]# tar zxvf redis-5.0.7.tar.gz
[root@localhost opt]# cd /opt/redis-5.0.7/
[root@localhost opt]# cd /opt/redis-5.0.7/
由于Redis源码包中直接提供了 Makefile 文件,所以在解压完软件包后,不用先执行 ./configure 进行配置,可直接执行 make 与 make install 命令进行安装。
[root@localhost redis-5.0.7]# make -j 2
[root@localhost redis-5.0.7]# make PREFIX=/usr/local/redis install
[root@localhost redis-5.0.7]# cd /opt/redis-5.0.7/utils
[root@localhost utils]# ./install_server.sh
# 执行软件包提供的 install_server.sh 脚本文件设置 Redis 服务所需要的相关配置文件
一直回车
Please select the redis executable path /usr/local/redis/bin/redis-server # 这里需要手动修改
[root@localhost utils]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@localhost utils]# netstat -natp | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 8027/redis-server 1
# 当 install_server.sh 脚本运行完毕,Redis 服务就已经启动,默认监听端口为 6379
格式:
redis-cli -h host -p port -a password
# -h:指定远程主机
# -p:指定redis服务的端口号
# -a:指定密码
[root@localhost ~]# redis-cli # 这里是本地127.0.0.1默认端口号可以省略
127.0.0.1:6379>
/etc/init.d/redis_6379 stop #停止
/etc/init.d/redis_6379 start #启动
/etc/init.d/redis_6379 restart #重启
/etc/init.d/redis_6379 status #状态
# 也可以使用 systemctl 管理
/etc/redis/6379.conf
bind 127.0.0.1 192.168.190.100 #70行,添加 监听的主机地址
port 6379 #93行,Redis默认的监听端口
daemonize yes #137行,启用守护进程
pidfile /var/run/redis_6379.pid #159行,指定 PID 文件
loglevel notice #167行,日志级别
logfile /var/log/redis_6379.log #172行,指定日志文件
redis-server:用于启动 Redis 的工具
redis-benchmark:用于检测 Redis 在本机的运行效率
redis-check-aof:修复 AOF 持久化文件
redis-check-rdb:修复 RDB 持久化文件
redis-cli:Redis 命令行工具
语法:redis-cli -h host -p port -a password
-h :指定远程主机
-p :指定 Redis 服务的端口号
-a :指定密码,未设置数据库密码可以省略-a 选项
# 若不添加任何选项表示,则使用 127.0.0.1:6379 连接本机上的 Redis 数据库,可以简写为 redis-cli
redis-benchmark 是官方自带的 Redis 性能测试工具,可以有效的测试 Redis 服务的性能。
语法格式:redis-benchmark [选项] [选项值]
# -h:指定服务器主机名
# -p:指定服务器端口
# -s:指定服务器 socket
# -c:指定并发连接数
# -n:指定请求数
# -d:以字节的形式指定 SET/GET 值的数据大小
# -k:1=keep alive 0=reconnect
# -r:SET/GET/INCR 使用随机 key, SADD 使用随机值
# -P:通过管道传输请求
# -q:强制退出 redis。仅显示 query/sec 值
# --csv:以 CSV 格式输出
# -l:生成循环,永久执行测试
# -t:仅运行以逗号分隔的测试命令列表
# -I:Idle 模式。仅打开 N 个 idle 连接并等待
示例:
向 IP 地址为 192.168.190.23、端口为 6379 的 Redis 服务器发送 10 个并发连接与 1000 个请求测试性能
[root@localhost ~]# redis-benchmark -h 192.168.190.100 -p 6379 -c 10 -n 1000
……
====== MSET (10 keys) ======
1000 requests completed in 0.02 seconds
10 parallel clients
3 bytes payload
keep alive: 1
100.00% <= 0 milliseconds
52631.58 requests per second
测试存取大小为 100 字节的数据包的性能
[root@localhost ~]# redis-benchmark -h 192.168.190.100 -p 6379 -q -d 100
PING_INLINE: 60716.46 requests per second
PING_BULK: 63694.27 requests per second
SET: 64308.68 requests per second
GET: 64977.26 requests per second
……
测试本机上 Redis 服务在进行 set 与 lpush 操作时的性能
[root@localhost ~]# redis-benchmark -t set,lpush -n 100000 -q
SET: 65316.79 requests per second
^C ……
set:存放数据,命令格式为 set key value # set 键 值
get:获取数据,命令格式为 get key
示例:
127.0.0.1:6379> set student lisi
OK
127.0.0.1:6379> get student
"lisi"
可以取符合规则的键值列表,通常情况可以结合 * ?等选项来使用。
示例:
127.0.0.1:6379> set a1 1
127.0.0.1:6379> set a2 2
127.0.0.1:6379> set a11 11
127.0.0.1:6379> set b1 3
127.0.0.1:6379> set b22 123
# 存放一些数据
127.0.0.1:6379> keys * # 查看所有数据
1) "a11"
2) "student"
3) "a1"
4) "b22"
5) "a2"
6) "b1"
127.0.0.1:6379> keys a* # 查看你以a开头的所有数据
1) "a11"
2) "a1"
3) "a2"
127.0.0.1:6379> keys a? # 以a开头第一个数值
1) "a1"
2) "a2"
127.0.0.1:6379> keys b?? # 以b开头两个任意数据
1) "b22"
可以判断键值是否存在。
示例:
127.0.0.1:6379> exists class
(integer) 0 # 0代表不存在
127.0.0.1:6379> exists student
(integer) 1 # 1代表存在
可以删除当前数据库的指定 key。
示例:
127.0.0.1:6379> keys * # 查看所有键数据
1) "a11"
2) "student"
3) "a1"
4) "b22"
5) "a2"
6) "b1"
127.0.0.1:6379> del student # 删除键
(integer) 1
127.0.0.1:6379> get student # 获取数据
(nil)
可以获取 key 对应的 value 值类型。
示例:
127.0.0.1:6379> type a1
string
5个数据类型:
① String
② List
③ Hash (散列类型)
④ set(无序集合)
⑤ Sorted Set (zset、有序集合)
命令是对已有 key 进行重命名(覆盖),使用 rename 命令进行重命名时,无论目标 key 是否存在都进行重命名,且源 key 的值会覆盖目标 key 的值。
示例:
格式:
> rename 源key 目标key
127.0.0.1:6379> keys a*
1) "a11"
2) "a1"
3) "a2"
127.0.0.1:6379> rename a2 a2
127.0.0.1:6379> keys a*
1) "a22"
2) "a11"
3) "a1"
127.0.0.1:6379> rename a11 a22
OK
127.0.0.1:6379> keys a*
1) "a22"
2) "a1"
127.0.0.1:6379> get a11
(nil)
127.0.0.1:6379> get a22 # 值覆盖
"11"
对已有 key 进行重命名,并检测新名是否存在,如果目标 key 存在则不进行重命名(不覆盖)。
示例:
格式:
> renamenx 源key 目标key
127.0.0.1:6379> keys b*
1) "b22"
2) "b1"
127.0.0.1:6379> renamenx b3 b1 # b3源key不存在
(error) ERR no such key
127.0.0.1:6379> renamenx b1 b3
(integer) 1
127.0.0.1:6379> keys b*
1) "b3"
2) "b22"
127.0.0.1:6379> renamenx b3 b22
(integer) 0 # 目标key的名字已存在,不支持将源key重命名该名字
查看当前数据库中 key 的数目。
示例:
127.0.0.1:6379> keys *
1) "a22"
2) "b3"
3) "a1"
4) "b22"
127.0.0.1:6379> dbsize
(integer) 4
使用config set requirepass yourpassword 命令设置密码。
示例:
127.0.0.1:6379> config set requirepass 123456
OK
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required. # 一旦设置密码,必须先验证通过密码,否则所有操作不可用
127.0.0.1:6379> auth 123456
127.0.0.1:6379> keys *
1) "a22"
2) "b3"
3) "a1"
4) "b22"
Redis 支持多数据库,Redis 默认情况下包含 16 个数据库,数据库名称是用数字 0-15 来依次命名的。多数据库相互独立,互不干扰。
多数据库间切换,使用 redis-cli 连接 Redis 数据库后,默认使用的是序号为 0 的数据库。
示例:切换数据库
格式:
select 序号
127.0.0.1:6379> select 2
127.0.0.1:6379[2]> select 16
(error) ERR DB index is out of range # 16个数据库,0-15
127.0.0.1:6379[2]> select 15
127.0.0.1:6379[15]> select 0
多数据库间移动数据。
示例:
格式:
move 键值 序号
127.0.0.1:6379> get a1
"1"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get a1 # 此时1库目标数据不存在
(nil)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> move a1 1 # 移动键值
(integer) 1
127.0.0.1:6379> get a1 # 此时0库目标数据不存在
(nil)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get a1 # 此时1库目标数据存在
"1"
flushdb:清空当前数据库数据
flushall :清空所有数据库(0-15)的数据,慎用!
示例:
127.0.0.1:6379> keys *
1) "a22"
2) "b3"
3) "b22"
127.0.0.1:6379> flushdb # 清空当前数据库0库数据
127.0.0.1:6379> keys *
(empty list or set)