NoSQL架构设计
NoSQL架构设计
MongoDB文档数据库
MongoDB以BSON文档存储数据,支持灵活的Schema和丰富的查询能力。
@Service
public class MongoUserRepository {
@Autowired
private MongoTemplate mongoTemplate;
public void saveUser(User user) {
mongoTemplate.save(user, "users");
}
public List<User> findByAgeRange(int min, int max) {
Query query = new Query(Criteria.where("age").gte(min).lte(max));
return mongoTemplate.find(query, User.class, "users");
}
public void updateProfile(String userId, Map<String, Object> fields) {
Query query = Query.query(Criteria.where("_id").is(userId));
Update update = new Update();
fields.forEach(update::set);
mongoTemplate.updateFirst(query, update, User.class);
}
}
# MongoDB副本集配置
spring:
data:
mongodb:
uri: mongodb://user:pass@mongo1:27017,mongo2:27017,mongo3:27017/mydb?replicaSet=rs0
Cassandra宽列存储
Cassandra采用环形架构和一致性哈希,提供线性扩展能力。
@Table(name = "user_events")
public class UserEvent {
@PrimaryKey
private UserEventKey key;
@Column("event_type")
private String eventType;
@Column("payload")
private String payload;
}
@PrimaryKeyClass
public class UserEventKey implements Serializable {
@PrimaryKeyColumn(name = "user_id", ordinal = 0)
private String userId;
@PrimaryKeyColumn(name = "event_time", ordinal = 1, type = PrimaryKeyType.CLUSTERED)
private Instant eventTime;
}
@Repository
public interface UserEventRepository extends CassandraRepository<UserEvent, UserEventKey> {
@Query("SELECT * FROM user_events WHERE user_id = ?0 AND event_time > ?1")
List<UserEvent> findByUserAfterTime(String userId, Instant time);
}
HBase列族存储
HBase适合海量数据的随机读写,RowKey设计是核心。
@Service
public class HBaseUserRepository {
@Autowired
private HbaseTemplate hbaseTemplate;
public User getUser(String userId) {
return hbaseTemplate.get("users", userId, (result, rowNum) -> {
User user = new User();
user.setId(Bytes.toString(result.getRow()));
user.setName(Bytes.toString(result.getValue(Bytes.toBytes("info"), Bytes.toBytes("name"))));
return user;
});
}
public void saveUser(User user) {
hbaseTemplate.execute("users", user.getId(), (table, mutator) -> {
Put put = new Put(Bytes.toBytes(user.getId()));
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes(user.getName()));
mutator.mutate(put);
return null;
});
}
}
选型对比
| 特性 | MongoDB | Cassandra | HBase |
|---|---|---|---|
| 数据模型 | 文档 | 宽列 | 列族 |
| 查询语言 | MQL | CQL | Scan/Get |
| 一致性 | 强一致 | 可调 | 强一致 |
| 写性能 | 高 | 极高 | 高 |
| 适用场景 | 内容管理 | 时序数据 | 大数据分析 |