目录
前言
一、数据库概述
1、关系型数据库(RDBMS)
1.1 产生背景
1.2 概念
1.3 特点
1.4 优缺点
1.5 常见主流关系型数据库
2、非关系型数据库(NoSQL)
2.1 产生背景
2.2 概念
2.3 特点
2.4 优缺点
2.5 常见主流非关系型数据库
3、两者区别
3.1 数据存储方式不同
3.2 扩展方式不同
3.3 对事务性的支持不同
二、Redis数据库概述
1、Redis数据库概念
2、Redis的单线程模式
3、Redis的优缺点
4、Redis的适用场景
5、Redis读取数据为什么那么快
三、Redis数据库安装部署
1、环境部署
2、编译安装Redis-5.0.7
3、 执行软件包提供的 install_server.sh 脚本文件
4、Redis服务控制
5、修改配置 /etc/redis/6379.conf 参数
四、Redis 操作命令工具
1、 redis-cli命令行工具
2、redis-benchmark测试工具
3、Redis 数据库常用命令
3.1 创建与获取键值
3.2 删除指定键
3.3 模糊查询键
3.4 判断指定键是否存在
3.5 查看键值数据类型
3.6 查看当前库中键的总量
3.7 重命名已有键
3.7.1 rename(覆盖数据)
3.7.2 renamenx(不覆盖数据)
3.8 设置redis密码
3.9 多数据库间切换
3.10 多数据库间迁移数据
3.11 清除数据库内数据
五、总结
1、键操作命令
2、数据库操作命令
前言
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 是一个开源的、使用 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-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:清除所有数据库数据