什么是 NoSQL
NoSQL 全称是 Not Only SQL,意思是“不仅仅是 SQL”。它并不是要取代传统的关系型数据库,而是一种补充。
传统的关系型数据库(比如 MySQL、Oracle)以表格形式存储数据,数据之间通过外键关联,强调事务和一致性。但在互联网高并发场景下,关系型数据库在一些方面遇到了瓶颈:
- 海量数据的读写性能有限
- 表结构固定,扩展不灵活
- 面对超高并发读写的场景,磁盘 IO 容易成为瓶颈
NoSQL 就是为了解决这类问题而出现的,它通常具有这些特点:
- 不固定表结构,schema 灵活
- 数据一般存放在内存中,读写速度极快
- 天然支持分布式,容易横向扩展
- 一般不严格保证事务(部分产品有折中方案)
NoSQL 的常见分类
NoSQL 产品很多,按数据模型大致可以分为四类:
| 类型 | 代表产品 | 典型应用 |
|---|---|---|
| 键值对存储 | Redis、Memcached | 缓存、热点数据 |
| 文档型 | MongoDB | 内容管理、日志 |
| 列存储 | HBase、Cassandra | 海量数据分析 |
| 图数据库 | Neo4j | 社交关系、推荐 |
对初学者来说,Redis 是最常用、也最值得先学的一个。
初识 Redis
Redis(Remote Dictionary Server)是一个开源的、基于内存的键值对数据库,常用作缓存、消息队列和计数器等场景。它有几个突出特点:
- 数据主要存放在内存中,读写性能极高,官方数据可达每秒十万次以上
- 支持丰富的数据结构,不只是简单的字符串
- 支持数据持久化,可以把内存中的数据保存到磁盘,重启不丢失
- 支持过期时间,可以自动删除不常用的数据
- 操作简单,单线程处理命令,天然避免了并发问题
Redis 的五种基本数据类型
string(字符串)
最基本的类型,一个 key 对应一个 value,可以存字符串、数字甚至序列化后的对象。
set name "zhangsan"
get name
hash(哈希)
类似一个小型的 map,适合存储对象的多个字段。
hset user name "zhangsan" age 20
hget user name
list(列表)
按照插入顺序排列的字符串列表,可以从两端插入或弹出,常用来做简单的消息队列。
lpush tasks "task1"
rpop tasks
set(集合)
无序且不重复的字符串集合,支持交集、并集等操作,常用来做去重和标签功能。
sadd tags "java" "redis"
smembers tags
zset(有序集合)
每个元素带一个分数,按分数自动排序,常用来做排行榜。
zadd rank 100 "player1"
zrange rank 0 -1 withscores
安装与简单上手
以 Linux 下源码安装为例:
wget http://download.redis.io/releases/redis-6.2.6.tar.gz
tar -zxvf redis-6.2.6.tar.gz
cd redis-6.2.6
make && make install
启动服务:
redis-server redis.conf
用客户端连接:
redis-cli
127.0.0.1:6379> ping
PONG
看到 PONG 就说明 Redis 已经正常工作了。
Redis 为什么快
- 数据存放在内存中,避免磁盘 IO
- 单线程模型,没有线程切换和锁的开销
- 使用多路复用 IO(epoll),可以处理大量连接
- 数据结构针对场景专门设计,比如跳表、压缩列表等
什么时候用 Redis
- 系统里查询频繁但更新少的数据,比如首页热门商品、用户会话
- 需要计数的场景,比如文章阅读量、点赞数
- 排行榜、签到等需要排序或去重的功能
- 简单的消息队列
需要注意,Redis 不是用来替代 MySQL 的,通常的架构是 Redis 做缓存挡在前面,MySQL 负责数据的持久化存储。两者配合,才能既快又稳。
小结
这篇笔记梳理了 NoSQL 的概念、分类,以及 Redis 的基本特点、数据类型和上手方式。Redis 入门不难,难点在于后面的持久化机制、主从复制、哨兵与集群等内容,后续会继续整理这些进阶笔记。