一、为什么需要NoSQL?
在传统SQL数据库中,数据必须严格遵循预定义的表结构,就像把所有物品整齐摆放在固定尺寸的货架上。而NoSQL(Not Only SQL)数据库则像一个灵活的储物间,允许存储各种类型的数据,无需提前规划结构。
NoSQL的核心特点:
- 非关系型:无需预定义表结构
- 分布式:天然支持水平扩展
- 高性能:适合处理海量数据
- 灵活存储:支持键值、文档、列族等多种格式
二、Redis:内存中的超级储物柜
1. 核心特性
- 数据类型丰富:支持字符串、哈希、列表、集合、有序集合等
- 内存存储:读写速度极快(10万+操作/秒)
- 持久化:支持RDB快照和AOF日志
2. Java操作示例
添加依赖(Maven)
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version>
</dependency>
基本操作代码
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;public class RedisExample {public static void main(String[] args) {try (Jedis jedis = new Jedis("localhost", 6379)) {// 存储用户信息jedis.set("user:1001", "{\"name\":\"张三\",\"age\":25}");// 存储哈希数据jedis.hset("user:1001:profile", "email", "zhangsan@example.com");jedis.hset("user:1001:profile", "phone", "13812345678");// 自增计数器jedis.incr("post:view:100"); // 阅读量+1// 有序集合存储排行榜jedis.zadd("rank:score", 95, "李四");jedis.zadd("rank:score", 88, "王五");// 事务操作Transaction transaction = jedis.multi();transaction.incr("counter");transaction.exec();}}
}
3. 典型应用场景
- 缓存系统:存储高频访问数据
- 会话管理:存储用户会话信息
- 计数器:统计文章阅读量、点赞数
- 实时消息:使用Pub/Sub功能实现消息队列
三、MongoDB:灵活的文档数据库
1. 核心特性
- 文档存储:使用BSON格式存储半结构化数据
- 动态模式:无需预定义字段
- 水平扩展:支持分片集群
- 强大查询:支持复杂的聚合操作
2. Java操作示例
添加依赖(Maven)
<dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-sync</artifactId><version>4.6.0</version>
</dependency>
基本操作代码
import com.mongodb.MongoClientSettings;
import com.mongodb.client.*;
import org.bson.Document;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.codecs.pojo.PojoCodecProvider;import java.util.Arrays;import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
import static org.bson.codecs.configuration.CodecRegistries.fromRegistries;public class MongoDBExample {public static void main(String[] args) {// 配置POJO映射CodecRegistry pojoCodecRegistry = fromProviders(PojoCodecProvider.builder().automatic(true).build());CodecRegistry codecRegistry = fromRegistries(MongoClientSettings.getDefaultCodecRegistry(), pojoCodecRegistry);// 连接MongoDBtry (MongoClient mongoClient = MongoClients.create(MongoClientSettings.builder().codecRegistry(codecRegistry).applyToClusterSettings(builder ->builder.hosts(Arrays.asList(new ServerAddress("localhost", 27017)))).build())) {MongoDatabase database = mongoClient.getDatabase("mydatabase");MongoCollection<User> collection = database.getCollection("users", User.class);// 插入文档User user = new User("张三", 25, "zhangsan@example.com", new Address("长安街1号", "北京"));collection.insertOne(user);// 查询文档FindIterable<User> results = collection.find(Filters.eq("name", "张三"));for (User u : results) {System.out.println(u);}// 更新文档collection.updateOne(Filters.eq("name", "张三"),Updates.set("age", 26));// 聚合查询AggregateIterable<Document> aggregate = collection.aggregate(Arrays.asList(Aggregates.match(Filters.gte("age", 18)),Aggregates.group("$address.city", Accumulators.sum("count", 1))));for (Document doc : aggregate) {System.out.println(doc);}}}
}// 定义实体类
class User {private String name;private int age;private String email;private Address address;// 构造方法、getter/setter省略
}class Address {private String street;private String city;// 构造方法、getter/setter省略
}
3. 典型应用场景
- 日志记录:存储非结构化日志数据
- 内容管理:存储文章、评论等
- 电商订单:存储包含复杂属性的订单
- 实时分析:使用聚合框架处理海量数据
四、Redis vs MongoDB:如何选择?
特性 | Redis | MongoDB |
---|---|---|
数据模型 | 键值对(支持丰富数据结构) | 文档型(BSON格式) |
存储位置 | 内存优先 | 磁盘存储 |
查询能力 | 简单查询 | 复杂查询+聚合 |
扩展性 | 主从复制+哨兵 | 分片集群 |
适用场景 | 缓存、计数器、实时消息 | 日志、内容管理、实时分析 |
五、总结
NoSQL数据库为现代应用提供了更灵活的数据存储方式:
- Redis适合需要高性能读写的场景
- MongoDB适合处理半结构化数据和复杂查询
- 传统SQL适合需要事务支持的场景
建议根据具体业务需求选择合适的工具,必要时可以混合使用多种数据库。
六、推荐学习资源
- Redis Java客户端文档
- MongoDB Java驱动文档
- 《Redis实战》
- 《MongoDB权威指南》
现在就动手用Java操作Redis和MongoDB,体验NoSQL的灵活性吧!🚀