前言
Redis是一个高性能的开源内存数据库,常用于缓存、会话存储和实时数据处理,它是一款非关系型数据库。在生产环境中,Redis通过将数据存储在内存中以及支持多种数据结构,提供了快速的读写能力,并且可通过持久化功能确保数据安全。其作为消息代理系统还能支持发布/订阅模式,使得它成为构建实时通信和事件驱动架构的理想选择。
目录
一、关系数据库与非关系型数据库
1. 关系型数据库
关系型数据库是所有实体之间联系的集合,其存储结构是由二维表及其之间的联系所组成的一个数据组织,一般面向于记录。SQL 语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。常见关系型数据库:Oracle、MySQL、SQLserver等。MySQL 相关介绍请参考:关系型数据库MySQL_Fang_Qianling的博客-CSDN博客
2. 非关系型数据库
NoSQL(NoSQL = Not Only SQL ),意思是“不仅仅是 SQL”,是非关系型数据库的总称。不需要预先建库建表定义数据存储表结构,以 key-values(键值对)存储,结构不固定,可以减少一些时间和空间的开销。常见的非关系型数据库:Redis、Memcached、mongDB等。Memcached 介绍请参考:Memcached非关系型数据库介绍-CSDN博客
3. 区别
区别 | 关系型数据库 | 非关系型数据库 |
数据结构 | 二维表 | 无固定结构 |
查询语句 | SQL通用结构化查询语句,可用于复杂查询 | 针对特定的数据模型特定的查询语句 |
存储位置 | 硬盘 | 内存,后期支持存储在硬盘 |
扩展方式 | 纵向,比如说硬件中添加内存 | 横向,天然分布式 |
二、Redis 简介
1. 概述
Redis 是 nosql 非关系型数据库,是一款基于内存运行并支持持久化的服务程序,采用 key-values(键值对)存储;是单进程模型,即一台机器可同时启动多个 redis 进程(一般一台机器做2-3个进程),可以做分布式集群架构。
2. 优缺点
优点:
- 极高的数据读写:读最高110000次/秒,写最高81000次/秒
- 数据类型丰富:支持 key-value、Strings、Lists、Hashes、Sets 及 Sorted Sets 等数据类型操作
- 支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
- 原子性:Redis 所有操作都是原子性的,保证两个客户端同时访问一个键,其中一个会先执行完自己的操作后再由另一个执行,避免并发问题
- 支持数据备份:即 master-salve 模式的数据备份
缺点:
- 由于 Redis 是基于内存的,所以它的内存消耗比较大。如果你的数据量比较大,可能需要大量的内存
- 由于 Redis 是基于内存的,所以如果服务器宕机,可能会导致数据丢失。虽然 Redis 支持数据的持久化,但是这并不能完全解决数据一致性的问题
3. redis 特点(为什么速度快)
① 纯内存结构
② 命令处理的核心模块是单线程,减少了锁竞争
- 锁竞争:当多个线程或进程试图同时访问某个共享资源,但由于彼此之间的执行顺序不确定,可能会导致彼此之间互相等待对方释放资源的情况,从而造成程序无法继续执行下去的情况。这种情况下,系统可能会出现死锁或活锁等问题,影响程序的正常运行
③ 采用 I/O 多路复用(异步非阻塞)机制,大大提升了并发效率
注:在 Redis 6.0 中新增加的多线程也只是针对处理网络请求过程采用了多线性,而数据的读写命令,仍然是单线程处理的。
三、Redis 部署
企业中一般会使用5版本的 redis,这里选择 redis-5.0.7 源码包进行安装。
1. 环境准备
[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
2. 编译安装
[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
3. 执行脚本文件
[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 # 这里需要手动修改
4. 软链接
[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
5. 登录
格式:
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>
四、服务控制与配置
1. Redis 服务控制
/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 管理
2. 常用配置文件参数
/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行,指定日志文件
3. 命令工具
redis-server:用于启动 Redis 的工具
redis-benchmark:用于检测 Redis 在本机的运行效率
redis-check-aof:修复 AOF 持久化文件
redis-check-rdb:修复 RDB 持久化文件
redis-cli:Redis 命令行工具
3.1 redis-cli 命令行工具
语法:redis-cli -h host -p port -a password
-h :指定远程主机
-p :指定 Redis 服务的端口号
-a :指定密码,未设置数据库密码可以省略-a 选项
# 若不添加任何选项表示,则使用 127.0.0.1:6379 连接本机上的 Redis 数据库,可以简写为 redis-cli
3.2 redis-benchmark 测试工具
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:通过管道传输<numreq>请求
# -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 ……
五、数据库常用命令
1. set 与 get
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"
2. keys
可以取符合规则的键值列表,通常情况可以结合 * ?等选项来使用。
示例:
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"
3. exists
可以判断键值是否存在。
示例:
127.0.0.1:6379> exists class
(integer) 0 # 0代表不存在
127.0.0.1:6379> exists student
(integer) 1 # 1代表存在
4. del
可以删除当前数据库的指定 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)
5. type
可以获取 key 对应的 value 值类型。
示例:
127.0.0.1:6379> type a1
string
5个数据类型:
① String
- String是 redis 最基本的类型,最大能存储 512MB 的数据,String类型是二进制安全的,即可以存储任何数据、比如数字、图片、序列化对象等
② List
- 列表的元素类型为string,按照插入顺序排序,在列表的头部或尾部添加元素
③ Hash (散列类型)
- hash用于存储对象。可以采用这样的命名方式(hash格式):对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值
④ set(无序集合)
- 无序集合,元素类型为string类型,元素具有唯一性, 不允许存在重复的成员。多个集合类型之间可以进行并集、交集和差集运算
⑤ Sorted Set (zset、有序集合)
- 有序集合,元素类型为Sting,元素具有唯一性, 不能重复
- 每个元素都会关联–个double类型的分数score(表示权重),可以通过权重的大小排序,元素的score可以相同
6. rename
命令是对已有 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"
7. renamenx
对已有 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重命名该名字
8. dbsize
查看当前数据库中 key 的数目。
示例:
127.0.0.1:6379> keys *
1) "a22"
2) "b3"
3) "a1"
4) "b22"
127.0.0.1:6379> dbsize
(integer) 4
9. 设置密码
使用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 支持多数据库,Redis 默认情况下包含 16 个数据库,数据库名称是用数字 0-15 来依次命名的。多数据库相互独立,互不干扰。
1. select
多数据库间切换,使用 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
2. move
多数据库间移动数据。
示例:
格式:
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"
3. 清除数据库内数据
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)