← 返回首页
🗄️

NoSQL架构设计

📂 architecture ⏱ 2 min 229 words

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
一致性 强一致 可调 强一致
写性能 极高
适用场景 内容管理 时序数据 大数据分析