Redis本身不支持传统索引,但可以巧妙实现
很多人在用Redis时会问:Redis怎么创建索引?其实Redis和MySQL不一样,它没有像关系型数据库那样的CREATE INDEX语法。但并不意味着不能做索引,只是方式更灵活,得靠我们自己设计数据结构来实现。
比如你是个电商网站开发者,想根据商品价格快速查出某区间内的商品,这时候就可以通过Redis的有序集合(ZSET)来“创建索引”。
用ZSET为数值字段建立索引
假设你要对商品价格做范围查询,可以把商品ID作为成员,价格作为分值存入ZSET:
ZADD price_index 99.5 item:1001
ZADD price_index 199.9 item:1002
ZADD price_index 59.8 item:1003这样就相当于给价格建了个索引。查价格在60到200之间的商品,直接用ZRANGEBYSCORE:
ZRANGEBYSCORE price_index 60 200返回的就是符合条件的商品ID列表。
用哈希+集合实现多条件索引
如果要按品牌查商品,可以用集合(SET)来维护品牌到商品ID的映射:
SADD brand:nike item:1001
SADD brand:nike item:1003
SADD brand:adidas item:1002查Nike的所有商品,执行:
SMEMBERS brand:nike再配合HGET获取每个商品详情,就能完成一次带“索引”的查询。
复合查询怎么办?拼接键名也是一种索引
比如要查“北京地区的VIP用户”,可以直接构造一个键名:
SADD region:beijing:vip user:1001
SADD region:beijing:vip user:1008这种命名方式本质上就是一种静态索引,读起来清晰,查起来也快。
Redis没有现成的索引功能,但正因如此,给了我们更大的自由度去按业务需求设计访问路径。关键不是照搬SQL思维,而是理解数据怎么用,然后用合适的结构让它跑得更快。