
🌈 个人主页: Hygge_Code
🔥 热门专栏:从0开始学习Java | Linux学习| 计算机网络
💫 个人格言: "既然选择了远方,便不顾风雨兼程"

文章目录
- Nosql数据库引入
- NoSql数据库基本概述
-
- [常见 NoSQL 数据库类型](#常见 NoSQL 数据库类型)
- Redis的核心特性
Nosql数据库引入
-
Web1.0时代
在Web1.0的时代,由于数据访问量很有限,用一夫当关的高性能的单点服务器可以解决大部分问题。

-
Web2.0时代
随着Web2.0的时代的到来,用户访问量大幅度提升,同时产生了大量的用户数据。加上后来的智能移动设备的普及,所有的互联网平台都面临了巨大的性能挑战。

我们需要解决两个问题,第一个是CPU及内存的压力,第二个是IO压力。
-
CPU及内存的压力
由于一台web服务器不能应对海量用户的访问。我们可以考虑对web服务器进行冗余部署,可以根据用户的访问量部署多台。再通过Nginx对用户的访问进行负载均衡操作,将用户的访问压力分摊在不同的web服务器上

这样操作又会遇到一个问题,就是session问题,而解决session的方案也有很多:
- 方案1:比如我们可以把session里面的数据存放在cookie端,以后用户每次发送请求,都可以携带cookie里面的数据到服务器。但由于cookie存放在浏览器端,如果数据是敏感数据,存放在cookie会不安全。
- 方案2:session复制。将某台服务器里面的session复制一份到其他服务器里面去。这种方案也有缺点,就是把相同的session数据存放在不同的web服务器中,容易造成数据冗余,服务器空间的浪费。
- 方案3:设置缓存数据库,将session信息存放在缓存数据库里面,缓存数据库里面的数据被所有web服务器共享。并且缓存数据库中的数据存放在内存中,读写速度也非常快。

-
IO压力
随着项目数据的日积月累,数据库里面的数据也越来越庞大。加上用户访问量的增大,我们直接访问数据库获取数据会对数据库造成非常大的IO压力。如何解决?
- 方案1:考虑对数据库进行读写分离,水平拆分、垂直拆分。但是这种方式会破坏一定的业务规则。
- 方案2:将频繁查询的数据,放在缓存,以后我们只需要从缓存里获取数据即可,减少对数据库的访问压力。

NoSql数据库基本概述
NoSQL (NoSQL = Not Only SQL ),意即"不仅仅是SQL",泛指非关系型的数据库。 NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。
nosql数据库的特点
- 不遵循SQL标准。
- 不支持ACID。
- 远超于SQL的性能。
适用场景
- 对数据高并发的读写
- 海量数据的读写
- 对数据高可扩展性的
不适用的场景
- 需要事务支持
- 基于sql的结构化查询存储,处理复杂的关系,需要sql查询。
常见 NoSQL 数据库类型
- Memcache :早期经典的 key-value 缓存数据库,数据仅存于内存,不支持持久化,存储类型单一
- Redis :兼容 Memcache 核心功能,支持数据持久化与多种数据结构,是当前主流缓存数据库
- MongoDB :文档型数据库,以 JSON 格式存储数据,支持复杂查询,适合存储非结构化 / 半结构化数据
Redis的核心特性
- 多数据结构支持:除基础string类型外,还支持list(链表)、set(集合)、hash(哈希)、zset(有序集合)等,满足复杂业务需求;
- 原子性操作:所有命令执行均为原子性,避免并发场景下的数据不一致;
- 持久化机制:支持RDB快照与AOF日志两种持久化方式,兼顾性能与数据安全性;
- 主从同步:支持master-slave主从复制,实现读写分离与容灾备份;
- 高性能:基于单线程+多路IO复用模型,内存操作延迟低,单机并发量可达10万+。
经典应用场景
| 业务场景 | 实现方案 |
|---|---|
| 最新数据展示(如新闻列表、商品推荐) | 利用list的自然排序特性,通过lpush/rpush维护数据顺序 |
| 排行榜(如积分排名、销量榜单) | 借助zset的有序集合特性,按score字段排序 |
| 时效性数据(如手机验证码、Token) | 使用expire命令设置过期时间,自动淘汰过期数据 |
| 计数器与秒杀 | 基于incr/decr原子操作,实现高并发下的计数与库存控制 |
| 数据去重(如用户去重、抽奖防刷) | 利用set的自动去重特性,快速判断元素是否存在 |
| 消息队列 | 通过list的lpush/rpop操作,模拟简单消息队列 |
| 发布订阅系统 | 基于pub/sub模式,实现消息的广播与订阅 |
相关知识
- redis默认的数据库实例
默认16个数据库,类似数组下标从0开始,初始默认使用0号库。使用命令 select 来切换数据库。如:select 8。dbsize查看当前数据库的key的数量。flushdb清空当前库。

- Redis采用 单线程+多路IO复用技术
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)

如果我的内容对你有帮助,请 点赞 , 评论 , 收藏 。创作不易,大家的支持就是我坚持下去的动力!
