目录
3、 执行软件包提供的 install_server.sh 脚本文件
5、修改配置 /etc/redis/6379.conf 参数
前言
Redis(Remote Dictionary Server 远程字典服务器)是一个开源的内存数据库,也可以持久化到磁盘。它支持多种数据结构,如字符串(String)、哈希表(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等,使其具有丰富的数据操作能力
Redis以其高性能、灵活性和丰富的功能而闻名,被广泛应用于缓存、消息队列、会话存储等各种场景
一、数据库概述
1、关系型数据库(RDBMS)
1.1 产生背景
关系型数据库产生的背景可以追溯到上世纪70年代初期。在那个时候,主要的数据存储方式是层次结构和网络模型数据库,它们存在着一些限制和缺陷,比如数据之间的复杂关系难以表示和处理,以及缺乏统一的数据访问标准
这些问题促使了关系型数据库的出现。1970年,IBM的研究员Codd提出了关系模型的概念,提出了一种全新的数据组织和操作方式,即关系型数据库
1.2 概念
实体:也称为实例,对应现实世界中可区别于其他对象的 “事件” 或 “事物” 。如银行客户、银行账户等
属性:实体所具有的某一特性,一个实体可以有多个属性。如 “银行客户” 实体集中的每个实体均具有姓名、住址、电话等属性。
联系:实体集之间的对应关系称为联系,也称为关系。如银行客户和银行账户之间存在 “储蓄” 的关系
所有实体及实体之间联系的集合构成一个关系数据库
关系数据库的存储结构是二维表格
在每个二维表中,每一行称为一条记录,用来描述一个对象的信息,每一列称为一个字段,用来描述对象的一个属性
关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录
1.3 特点
具有严格的数据结构,使用结构化查询语言(SQL)进行数据操作和查询,支持事务处理和复杂的数据关联
1.4 优缺点
- 优点
①结构化数据存储: 关系型数据库使用表格形式存储数据,适合存储结构化数据,如行和列的数据
②ACID事务支持: 关系型数据库支持ACID(原子性、一致性、隔离性、持久性)事务,确保数据的完整性和一致性
③SQL查询语言: 使用标准化的SQL查询语言进行数据操作,易于学习和使用
④复杂查询: 支持复杂的查询操作,如连接(JOIN)、子查询等,适合处理复杂的数据关系
- 缺点
①扩展性限制: 在大规模数据存储和高并发访问时,关系型数据库的扩展性受到限制
②固定模式: 需要预先定义表结构,难以适应数据结构频繁变化的情况
③性能瓶颈: 在某些情况下,复杂查询和连接操作可能导致性能下降
④成本高昂: 商业关系型数据库的许可证和维护成本通常较高
⑤读写性能差:尤其是海量数据的高效率读写
1.5 常见主流关系型数据库
Oracle、MySQL、Microsoft SQL Server、PostgreSQL、DB2等
2、非关系型数据库(NoSQL)
2.1 产生背景
可用于应对 Web2.0 纯动态网站类型的三高问题
(1)High performance——对数据库高并发读写需求
(2)Huge Storage——对海量数据高效存储与访问需求
(3)High Scalability && High Availability——对数据库高可扩展性与高可用性需求
关系型数据库和非关系型数据库都有各自的特点与应用场景,两者的紧密结合将会给Web2.0的数据库发展带来新的思路。让关系数据库关注在关系上,非关系型数据库关注在存储上。例如,在读写分离的MySQL数据库环境中,可以把经常访问的数据存储在非关系型数据库中,提升访问速度
2.2 概念
非关系型数据库是一种灵活的数据存储系统,不要求遵循固定的表格结构,可以以文档、键值对、列族或图等形式存储数据
2.3 特点
通常具有高度的可扩展性、灵活性和高性能,适合存储大规模、动态结构或分布式数据
2.4 优缺点
- 优点
①高可扩展性: 非关系型数据库采用分布式架构,支持水平扩展,适合处理大规模数据和高并发访问
②灵活的数据模型: 可以存储半结构化和非结构化数据,适应数据结构变化较大的情况
③高性能: 部分非关系型数据库采用键值对存储,读写性能较高
④低成本: 开源的非关系型数据库通常免费,部署和维护成本相对较低
- 缺点
①缺乏事务支持: 大部分非关系型数据库不支持完整的ACID事务,可能出现数据一致性问题
②学习成本较高: 不同类型的非关系型数据库有不同的数据模型和查询语言,学习曲线较陡
③功能限制: 部分非关系型数据库功能较为简单,不支持复杂的查询操作
④数据一致性: 部分非关系型数据库为了追求高性能,可能牺牲一定的数据一致性
2.5 常见主流非关系型数据库
除了主流的关系型数据库外的数据库,都认为是非关系型
常见的有:文档型数据库(如MongoDB)、键值对数据库(如Redis)、列族数据库(如HBase)、图数据库(如Neo4j)等
3、两者区别
3.1 数据存储方式不同
关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据
与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素
3.2 扩展方式不同
SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展
要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来客服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限
而NoSQL数据库是横向扩展的。因为非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载
3.3 对事务性的支持不同
如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的SQL数据库从性能和稳定性方面考虑是你的最佳选择。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务
虽然NoSQL数据库也可以使用事务操作,但稳定性方面没法和关系型数据库比较,所以它们真正闪亮的价值是在操作的扩展性和大数据量处理方面
二、Redis数据库概述
1、Redis数据库概念
Redis官方网站:https://redis.io/
Redis 是一个开源的、使用 C 语言编写的 NoSQL 数据库。
Redis 基于内存运行并支持持久化,采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环,以下是一些Redis数据库的关键概念:
-
键值存储:Redis是一种键值存储系统,每个键都与一个值相关联。这种简单的数据结构使得存储和检索数据非常高效
-
数据类型:Redis支持多种数据类型,包括字符串、哈希、列表、集合和有序集合。这些数据类型提供了丰富的操作,例如对字符串进行追加、对列表进行推入/弹出元素等
-
持久化:Redis提供了持久化功能,可以将内存中的数据保存到磁盘上,以防止数据丢失。它支持两种持久化方式:快照(Snapshot)和日志(Append-only file)
-
主从复制:Redis支持主从复制,即一个Redis服务器(主节点)可以将数据复制到多个其他Redis服务器(从节点),从而实现数据的备份和读取负载均衡
-
发布与订阅:Redis支持发布与订阅模式,允许客户端订阅多个频道,以便在消息发布到该频道时接收通知
-
事务:Redis支持事务操作,可以将一系列命令打包成一个原子操作,保证这些命令要么全部执行成功,要么全部失败
-
Lua脚本:Redis允许使用Lua脚本进行复杂的数据操作,这些脚本可以在服务器端执行,减少了网络通信的开销
-
LRU过期策略:Redis使用LRU(Least Recently Used)算法来管理内存,当内存不足时,会优先删除最近最少使用的数据
2、Redis的单线程模式
Redis服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率。
若在服务器上只运行一个Redis进程,当多个客户端同时访问时,服务器的处理能力是会有一定程度的下降
若在同一台服务器上开启多个Redis进程,Redis在提高并发处理能力的同时会给服务器的CPU造成很大压力。
在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程。若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程。若 CPU 资源比较紧张,采用单进程即可
3、Redis的优缺点
- 优点
①高性能: Redis是基于内存的数据存储系统,因此读写速度非常快
②持久化支持: Redis支持多种持久化方式,包括快照和日志追加,确保数据在断电或重启后不会丢失
③丰富的数据结构: Redis支持多种数据结构,如字符串、哈希、列表、集合等,使得它适用于各种不同的应用场景
④原子性操作: Redis的许多操作都是原子性的,可以确保多个操作的一致性
⑤分布式: Redis支持分布式部署,可以实现数据的分片存储和集群部署。
- 缺点
①数据量受限: 由于Redis的数据通常存储在内存中,所以受到可用内存大小的限制
②单点故障: 在未经过良好设计的情况下,单个Redis节点发生故障可能导致整个服务不可用
③持久化效率: 持久化会对性能产生一定影响,尤其是在使用AOF(Append Only File)持久化方式时
④缺乏复杂查询支持: 相较于传统的关系型数据库,Redis的查询能力相对较弱,不支持复杂的查询操作
⑤内存成本高昂: 由于数据通常存储在内存中,使用大量内存可能导致较高的成本
4、Redis的适用场景
- 缓存系统: Redis作为缓存存储,能够快速读取数据并降低后端数据库的压力
- 会话管理: 用于存储用户会话信息,实现快速的用户登录状态管理
- 消息队列系统: Redis的发布订阅功能和列表结构可用于构建简单的消息队列系统
- 计数器应用: 适合用于实时计数统计,比如网站访问量、点赞数等
- 实时排行榜: 通过有序集合数据结构,可以方便地实现实时排行榜功能
- 分布式锁: 可以利用Redis的特性实现分布式锁,保证多个进程或服务器之间的互斥操作
- 地理位置应用: 利用Redis的地理位置功能,可以实现附近的人、地点查询等功能
- 在线游戏应用: 用于存储玩家状态、实时数据更新等
- 实时数据分析: 适合用于实时数据处理和分析,比如日志处理、实时监控等
5、Redis读取数据为什么那么快
- Redis是一款纯内存结构,避免了磁盘I/o等耗时操作
- Redis命令处理的核心模块为单线程,减少了锁竞争,以及频繁创建线程和销毁线程的代价,减少了线程上下文切换的消耗
- 采用了 I/O 多路复用机制,大大提升了并发效率
注:在 Redis 6.0 中新增加的多线程也只是针对处理网络请求过程采用了多线性,而数据的读写命令,仍然是单线程处理的
三、Redis数据库安装部署
1、环境部署
关闭防火墙和核心防护
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
下载依赖包
[root@localhost ~]#yum install -y gcc gcc-c++ make
2、编译安装Redis-5.0.7
redis安装包官网下载:http://download.redis.io/releases/
#事先准备好安装包:redis-5.0.7.tar.gz
[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 redis-5.0.7]#make
[root@localhost redis-5.0.7]#make PREFIX=/usr/local/redis install
#由于Redis源码包中直接提供了 Makefile 文件,所以在解压完软件包后,不用先执行 ./configure 进行配置,可直接执行 make 与 make install 命令进行安装
3、 执行软件包提供的 install_server.sh 脚本文件
#执行软件包提供的 install_server.sh 脚本文件,设置 Redis 服务所需要的相关配置文件
[root@localhost redis-5.0.7]#cd /opt/redis-5.0.7/utils
[root@localhost utils]#./install_server.sh
…… 一直回车
直到出现:Please select the redis executable path []
然后在这句话后面手动输入
/usr/local/redis/bin/redis-server #注意要一次性正确输入
#没有一次性输入正确,那么要保证后面一定作软链接
#把redis的可执行程序文件放入路径环境变量的目录中便于系统识别
[root@localhost utils]#ln -s /usr/local/redis/bin/* /usr/local/bin/
#详细解释
Selected config:
Port : 6379 #默认侦听端口为6379
Config file : /etc/redis/6379.conf #配置文件路径
Log file : /var/log/redis_6379.log #日志文件路径
Data dir : /var/lib/redis/6379 #数据文件路径
Executable : /usr/local/redis/bin/redis-server #可执行文件路径
Cli Executable : /usr/local/bin/redis-cli #客户端命令工具
4、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 #状态
5、修改配置 /etc/redis/6379.conf 参数
#修改配置 /etc/redis/6379.conf 参数
[root@localhost utils]#vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.10.23 #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行,指定日志文件
[root@localhost utils]#/etc/init.d/redis_6379 restart
#如果在redis开启状态,修改配置文件,需重启服务
四、Redis 操作命令工具
redis-server #用于启动 Redis 的工具
redis-benchmark #用于检测 Redis 在本机的运行效率
redis-check-aof #修复 AOF 持久化文件
redis-check-rdb #修复 RDB 持久化文件
redis-cli #Redis命令行工具
1、 redis-cli命令行工具
格式:redis-cli -h host -p port -a password
选项 | 说明 |
---|---|
-h | 指定远程主机 |
-p | 指定 Redis 服务的端口号 |
-a | 指定密码,未设置数据库密码可以省略-a 选项 |
在redis服务器本机上可直接使用redis-cli登录,使用的是127.0.0.1:6379
从客户端登录,需指定redis服务器的ip地址和端口号来连接
redis-cli -h 172.16.12.10 -p 6379
2、redis-benchmark测试工具
redis-benchmark
是一个性能测试工具,用于评估Redis服务器的性能。通过redis-benchmark
工具,用户可以模拟多个并发客户端向Redis服务器发送命令,并测量服务器在不同负载下的性能表现
格式:redis-benchmark 选项 选项值
-h | 指定连接的Redis服务器主机名,默认为127.0.0.1 |
-p | 指定连接的Redis服务器端口号,默认为6379 |
-s | 指定服务器 socket |
-c | 指定并发客户端数,即同时向服务器发送请求的客户端数量 |
-n | 指定总共发送的请求次数 |
-d | 以字节的形式指定 SET/GET 值的数据大小 |
-k | 是否使用keepalive参数,默认为不使用,1=keep alive 0=reconnect |
-r | SET/GET/INCR 使用随机 key,SADD 使用随机值。指定key的数量,用于进行随机请求 |
-P | 通过管道传输请求 |
-q | 静默模式,只输出每秒完成的请求数 |
-csv | 以 CSV 格式输出 |
-l | 生成循环,永久执行测试 |
-t | 仅运行以逗号分隔的测试命令列表,指定测试类型,可以是PING、SET、GET等 |
-I | Idle 模式。仅打开 N 个 idle 连接并等待 |
redis-benchmark -h 172.16.12.10 -p 6379 -c 100 -n 100000
#向 IP 地址为 172.16.12.10 端口为 6379 的 Redis 服务器发送 100 个并发连接与 100000 个请求测试性能
redis-benchmark -h 172.16.12.10 -p 6379 -q -d 100
#测试存取大小为 100 字节的数据包的性能
#-h 172.16.12.10: 指定Redis服务器的IP地址为172.16.12.10
#-p 6379: 指定Redis服务器监听的端口号为6379,这是Redis默认的端口
#-q: 这是Quiet模式,表示在输出结果时不打印任何额外信息,只显示基准测试的结果数据,使输出更简洁。
#-d 100: 设置数据集大小为100字节。这意味着在执行写操作(如SET)时,键值对的value部分大小为100字节
#所以这个命令是用来针对IP地址为172.16.12.10,端口为6379的Redis服务器进行基准测试,其中每次写操作的数据大小为100字节。基准测试会模拟多个客户端同时对Redis进行读写操作,以此来评估Redis在高并发情况下的性能
redis-benchmark -t set,lpush -n 100000 -q
#测试本机上 Redis 服务在进行 set 与 lpush 操作时的性能
#-t set,lpush: 指定要测试的操作类型,这里包含了set和lpush两种操作。set用于测试设置键值对的性能,而lpush则是测试将元素推入列表头部的性能
#-n 100000: 指定每个测试命令执行的总次数为100000次。这意味着对于set和lpush这两种操作,都会各自执行100000次
#-q: 启用Quiet模式,这会让基准测试工具只输出最终的性能统计结果,不展示中间过程的详细信息,使得输出更为简洁
#综上所述,该命令行主要用于测量Redis服务器在执行100000次set和lpush操作时的性能表现,这对于评估和优化Redis在大规模数据操作中的性能具有重要意义
3、Redis 数据库常用命令
3.1 创建与获取键值
set:存放数据,格式为 set key value
get:获取数据,格式为 get key
incr key:将指定键的值递增1
decr key:将指定键的值递减1
3.2 删除指定键
del key:删除当前数据库的指定key键
3.3 模糊查询键
keys 命令可以取符合规则的键值列表,通常情况可以结合*、?等选项来使用
*:代表零个、一个或多个字符
?:代表单个字符
keys * #查看当前数据库中所有键
keys y* #查看当前数据库中以 y 开头的数据
keys y? #查看当前数据库中以 y 开头后面包含任意一位的数据
keys y?? #查看当前数据库中以 y 开头 y 开头后面包含任意两位的数据
keys * #查看当前数据库中所有键
keys *1 #查看当前数据库中以 “1” 结尾的数据
keys ?1 #查看当前数据库中以 “1” 结尾前包含任意一位的数据
keys ??1 #查看当前数据库中以 “1” 结尾且“1”前包含任意两位的数据
#*、?可结合使用
keys ?1* #查询”1“前有任意一个字符,"1”后有任意长度的字符(包含0个及以上)
keys *1? #查询”1“前有任意长度的字符(包含0个及以上),"1”后有任意一个字符
3.4 判断指定键是否存在
exists 命令可以判断键值是否存在
格式:exists key
3.5 查看键值数据类型
Redis数据库有五种主要的数据类型,它们分别是字符串(String)、哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)
-
字符串(String)
- 最基本的数据类型,可以存储文本、整数或者浮点数
- 可以设置过期时间,支持丰富的操作如设置、获取、追加、递增、递减等
- 常用命令:set、get、del、incr、decr等
-
哈希表(Hash)
- 类似于Python中的字典,存储键值对的集合
- 适合存储对象的多个字段,每个字段都有自己的键值对
- 可以对单个字段进行操作,也可以对整个哈希表进行操作
- 常用命令:hset、hget、hdel、hgetall等
-
列表(List)
- 有序的字符串元素集合,可以在列表的两端进行插入和删除操作
- 可以用作栈(先进后出)或队列(先进先出)
- 支持按索引获取元素、修剪列表、获取子列表等操作
- 常用命令:lpush、rpush、lpop、rpop、lrange等
-
集合(Set)
- 无序的字符串元素集合,每个元素都是唯一的
- 支持集合间的交集、并集、差集等操作
- 可以添加、删除、判断元素是否存在等操作
- 常用命令:sadd、srem、smembers、sinter等
-
有序集合(Sorted Set)
- 类似于集合,但每个元素都关联一个分数,可以按照分数进行排序
- 支持根据分数范围获取元素、按分数增减获取排名等操作
- 可以用于排行榜、优先级队列等场景
- 常用命令:zadd、zrange、zrem、zincrby等
这些数据类型的灵活性和功能性使得Redis能够适用于各种不同的应用场景,提供高效的数据存储和操作功能
type 命令可以获取 key 对应的 value 值类型
格式:type key
3.6 查看当前库中键的总量
dbsize #查询当前数据库中键的总量
3.7 重命名已有键
3.7.1 rename(覆盖数据)
rename 命令是对已有 key 进行重命名(覆盖)
使用rename命令进行重命名时,无论目标key是否存在都进行重命名,且源key的值会覆盖目标key的值
格式:rename 源key 目标key
注:
在实际使用过程中,建议先用 exists 命令查看目标 key 是否存在,然后再决定是否执行 rename 命令,以避免覆盖重要数据
3.7.2 renamenx(不覆盖数据)
格式:renamenx 源key 目标key
renamenx 命令的作用是对已有 key 进行重命名,并检测新名是否存在,如果目标 key 存在则不进行重命名。(不覆盖)
3.8 设置redis密码
使用 config set requirepass password 命令设置密码
使用 auth password 命令认证登录
可使用 config get requirepass 命令查看密码
注:一旦设置密码,必须先验证通过密码,否则所有操作不可用
config set requirepass 123456 #设置密码为123456
auth 123456 #通过密码认证,才能对redis数据库进行操作
config get requirepass #可查看设定的密码
config set requirepass "" #将 requirepass 设置为空字符串即可删除密码认证
3.9 多数据库间切换
Redis 支持多数据库,Redis 默认情况下包含 16 个数据库,数据库名称是用数字 0~15 来依次命名的
多数据库相互独立,互不干扰
多数据库间切换
格式:select 序号
#注:使用 redis-cli 连接 Redis 数据库后,默认使用的是序号为 0 的数据库
select 1 #切换至序号为 1 的数据库
select 10 #切换至序号为 10 的数据库
select 15 #切换至序号为 15 的数据库
3.10 多数据库间迁移数据
MOVE
命令用于将指定的键从当前数据库移动到另一个数据库。这在需要在不同数据库之间重新组织数据或者清理数据时非常有用
格式:move key 序号
返回值:
- 如果键成功移动到目标数据库,
MOVE
命令返回1 - 如果键在目标数据库已经存在,或者键不存在于当前数据库,
MOVE
命令返回0
注:
- 移动操作是原子的,即要么成功移动,要么失败不移动,不会出现部分移动的情况。
- 移动键可能会导致一些性能开销,特别是当键包含大量数据时
3.11 清除数据库内数据
flushdb: 清空当前数据库数据
flushall:清空所有数据库的数据,慎用!
五、总结
1、键操作命令
set key value
:设置键的值get key
:获取键的值del key
:删除指定的键keys pattern
:查找符合指定模式的键exists key
:检查键是否存在- tpye key:查询键值数据类型
- dbsize:获取当前数据库键的总量
- rename(覆盖)/renamenx(不覆盖) 源key 目的key:重命名已有键
- config set requirepass password:设置密码 auth password:密码认证
2、数据库操作命令
select 序号
:切换到指定序号的数据库move key 序号
:将键从当前数据库移动到另一个指定序号的数据库- flushdb:清除当前数据库数据
- flushall:清除所有数据库数据