Cassandra用户身份认证场景下用户信息存储的高效数据分区方案咨询
Cassandra身份认证场景用户表分区设计方案
Cassandra的数据建模核心是查询驱动,你需要先明确身份认证流程的高频查询模式,再对应设计分区键,才能保证最高的查询效率。
核心设计依据
身份认证流程的99%以上的请求,都是「用户输入登录凭证(邮箱/手机号),查询对应用户的密码哈希、基础信息」,没有全表扫描、范围查询这类需求,所以分区键的选择完全匹配这个查询路径即可。
具体分区方案
方案1:仅支持单一种类登录凭证
如果你的产品仅支持邮箱登录,或者仅支持手机号登录,直接把登录用的唯一字段设为分区键即可,建表语句参考:
CREATE TABLE user_auth ( -- 如果你用手机号登录,把这里改成phone_number text PRIMARY KEY即可 email text PRIMARY KEY, name text, password text, -- 仅存储加盐哈希值,禁止存储明文密码 phone_number text, city text );
这种设计下,每次认证请求都是单分区查询,Cassandra可以直接通过登录字段的哈希值定位到对应存储节点,不需要跨节点协调,延迟稳定在1-2ms级别,完全满足认证场景的性能要求。
方案2:支持多种类登录凭证
如果你同时支持邮箱、手机号两种登录方式,需要设计双表结构,分区设计如下:
- 主用户表:分区键设为预生成的
user_id(UUID类型),存储全量用户字段 - 登录映射表:分区键设为
login_id,存储所有可用的登录标识(邮箱、手机号各存一行),关联对应用户的user_id
建表示例:
-- 主用户表,存储全量用户信息 CREATE TABLE users ( user_id uuid PRIMARY KEY, name text, email text, password text, phone_number text, city text ); -- 登录映射表,实现多登录凭证的路由 CREATE TABLE user_login_index ( login_id text PRIMARY KEY, -- 存储邮箱或者手机号字符串 user_id uuid );
查询流程:用户输入登录凭证 → 单分区查user_login_index拿到user_id → 单分区查users表获取认证需要的信息,两次都是单分区查询,额外性能损耗可以忽略。
不推荐的设计
- 不要用name、city作为分区键:这类字段重复率极高,会导致单分区数据量过大,同时也完全不匹配认证场景的查询路径,没有任何用户会使用姓名+城市作为登录凭证。
- 不要使用复合分区键:认证场景没有范围查询需求,复合分区键只会增加查询复杂度,反而降低性能。
内容的提问来源于stack exchange,提问作者Julia Anderson
相关产品推荐
相关产品推荐

