目录
- mysql的演进
- NoSQL
- redis概述
- redis安装
- redis基本知识
- redisKey基本命令
- 八种数据结构
- redis基本事务操作
- redis 实现乐观锁
一、MySQL的演进过程
1. 初期:单机架构,简单高效
-
90年代,随着互联网初期发展,单机数据库架构(APP → Middleware → MySQL)完全够用,压力小,易于维护。
2. 中期:垂直拆分与读写分离
-
随着业务量增加,单机无法满足需求,出现了垂直拆分(不同模块用不同数据库)与读写分离(主库写,从库读)策略。
3. 缓存层优化
-
进一步为了减轻MySQL压力,开始在应用层引入文件缓存机制。
-
后续逐渐普及Memcached作为分布式缓存,大大提高了系统性能。
4. 后期:水平扩展与集群
-
业务不断膨胀,最终演变为:
APP → Middleware → 缓存层(Memcached) → 多个MySQL集群(集群1、集群2、集群3)
-
水平拆分(分库分表)+ 多实例集群成为标配。
5. 存储引擎演变
-
早期 MySQL 采用MyISAM引擎(表锁,效率低,事务支持差)。
-
后来转向InnoDB引擎(行级锁,支持事务、崩溃恢复、外键约束)。
6. 新问题:应对更复杂、变化更快的数据需求
-
随着移动互联网、社交应用爆发,MySQL遇到瓶颈。
-
引入NoSQL体系,存储如用户画像、地理位置、社交关系等数据,减轻关系型数据库压力。
二、NoSQL的兴起与应用
1. 什么是NoSQL?
-
NoSQL,全称 Not Only SQL,即“不仅仅是SQL”。
-
特点:
-
格式灵活:基于 Key-Value 或文档,数据类型多样。
-
无需固定表结构:方便迭代开发,支持敏捷开发和极限编程。
-
高扩展性和高性能:适应海量数据场景。
-
【扩展:敏捷开发】强调的是快速迭代、小步快跑、持续反馈、持续优化,而不是像传统开发那样一开始就写一大堆文档、一次性做完。项目分成很多小周期(通常2-4周叫做一个Sprint),每个周期都交付一个可以运行的版本。强调人与人的沟通(团队交流比写文档更重要)。
举个例子:
比如开发一个电商网站:
-
第一个Sprint:只做出首页+商品列表的最小功能;
-
第二个Sprint:增加商品详情页+简单下单功能;
-
第三个Sprint:接入支付;
-
中间每两周就交付一个小版本,客户可以体验,随时调整方向,比如改UI、换支付方式。
这样比起传统一次性做完一整年开发,灵活得多,也风险小得多!
【扩展:极限编程】简称 XP,是敏捷开发的一种具体实践方法。
2. 关系型数据库(RDBMS)与NoSQL的区别
对比点 | 关系型数据库(RDBMS) | NoSQL |
---|---|---|
数据结构 | 结构化(表) | 灵活(键值、文档、列存、图) |
查询语言 | SQL | 多样(API调用、类SQL) |
数据一致性 | 强一致性 | 最终一致性(CAP理论) |
事务支持 | 支持ACID事务 | 弱化事务以换取扩展性 |
典型应用 | 金融、传统企业 | 社交、内容分发、日志存储 |
企业典型组合:MySQL + Redis
3. NoSQL应用示例(以淘宝商品页为例)
-
商品基本信息、评论(结构化文档) → MongoDB
-
商品图片(大文件存储) → FastDFS、OSS
-
搜索关键词、商品检索 → ElasticSearch
-
热门商品、秒杀活动缓存 → Redis、Tair、Memcached
-
交易、支付系统 → 仍以关系型数据库为主(如MySQL)
4. NoSQL四大主流分类
类型 | 代表产品 | 说明 |
---|---|---|
键值(K-V)存储 | Redis、Tair、Memcached | 快速访问,缓存场景最佳 |
文档型数据库 | MongoDB | 类似JSON存储,灵活结构 |
列式数据库 | HBase、Cassandra | 适合大规模写入和分析 |
图数据库 | Neo4j | 适合存储复杂网络关系(社交、推荐系统) |
三、Redis详解
1. 什么是Redis?
-
全称:Remote Dictionary Server(远程字典服务)
-
特点:
-
基于内存存储,极致高效
-
支持持久化
-
丰富的数据结构
-
用作缓存、数据库、消息中间件
-
支持发布订阅、地理位置分析、计时器、计数器等应用
-
2. Redis安装与使用(快速上手)
-
Windows环境:下载 redis-cli.exe、redis-server.exe、redis-benchmark.exe 等。
-
Linux环境:
sudo apt-get install redis-server systemctl start redis redis-cli -p 6379
-
测试性能:
redis-benchmark -h localhost -p 6379 -c 100 -n 10000
(测试100个并发连接,每个连接发送10000次请求)
-
默认端口:6379
-
测试连接:
ping → pong
四、Redis基础知识
1. 数据库管理
-
默认16个逻辑数据库(编号0~15)
-
常用命令:
select 0 # 切换数据库 DBSIZE # 查看当前数据库中Key数量 flushdb # 清空当前数据库 flushall # 清空所有数据库
2. 单线程但高性能
-
Redis采用单线程事件循环处理请求,避免多线程锁竞争,效率极高。
-
性能瓶颈往往在于内存带宽和网络带宽,不是CPU!
3. 存储机制
-
主要存储在内存(RAM),访问速度极快。
-
持久化方式(可选):
-
RDB快照:周期性生成内存数据快照到磁盘。
-
AOF日志:记录每一次写操作,支持按日志重放恢复。
-
-
数据结构组织方式:
RedisDB └── dict哈希表 ├── key1 → value1 ├── key2 → value2 └── ...
4. 内存管理与淘汰策略
-
配置
maxmemory
限制最大内存占用。 -
超出后可按策略淘汰数据:
-
LRU(最近最少使用)
-
LFU(最少访问次数)
-
TTL(按过期时间)
-
5. Redis的常见误区
误区 | 正确理解 |
---|---|
多线程一定比单线程快 | 错!多线程有锁竞争、上下文切换开销 |
Redis单线程性能不足 | 错!Redis单线程可支撑几十万QPS,瓶颈一般是带宽和内存 |
五、Redis五大数据类型及常用命令
1. String(字符串类型)
最基础、最常用的数据类型,类似单纯的Key-Value存储。
-
基本操作
set name "hh" get name
-
过期时间设置
expire name 10 # 设置10秒后过期 ttl name # 查看剩余生存时间
- 类型查询
type name
-
字符串追加
append name "haha" strlen name
———————————————————————————————————————————————————
- 自增/自减
set views 0 # 初始浏览量设为0
incr views # 自增1
decr views # 自减1
INCRBY views 10 # 设置步长为10
- 范围查询
getrange key1 0 3 # 截取0-3下标的字符串
getrange key1 0 -1
setrange key2 1 xx # 将下标为1后面插入xx
—————————————————————————————————————————————————————–
setex key3 30 “hello” # 设置过期时间,30秒过期
setnx mykey “redis” # 当前值不存在再设置(在分布式锁常试用)若存在值则返回0(创建失败);不存在则创建返回1
—————————————————————————————————————————————————————–
- 批量设置/获取值
mset k1 v1 k2 v2 k3 v3
mget k1 k2 k3
msetnx k1 v1 k4 v4 # k1存在,k4成功,但最后还是返回0(是一个原子性操作)
- 对象
set user:1 {name: zhangsan, age :3} # 设置一个user:1对象 值为json字符串来保存对象
mset user:1:name zhangsan user:1:age 2
mget user:1:name user:1:age
getset db redis # 若不存在值,则返回nil
get db # redis
getset db mongodb # 若存在值,获取原来的值,redis
get db # mongodb
2. List数据类型
来源链接:https://www.cnblogs.com/xiaoqian01/p/18850070
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
暂无评论内容