如何基于对象属性对Redis列表中的JSON对象进行排序
Redis中JSON数据按指定属性排序的存储方案
方案一:利用有序集合(Sorted Set)直接存储
有序集合会自动基于score排序,你可以把需要排序的属性值作为score,序列化后的JSON字符串作为member存入:
按数值属性(如age)排序
- 存入数据:
zadd person_by_age 30 '{"name": "john", "age": 30, "role": "developer"}' zadd person_by_age 45 '{"name": "smith", "age": 45, "role": "manager"}' zadd person_by_age 35 '{"name": "ram", "age": 35, "role": "tester"}' - 升序获取排序结果:
zrange person_by_age 0 -1 - 降序获取排序结果:
zrevrange person_by_age 0 -1
按字符串属性(如name)排序
由于有序集合的score默认是数值,要按字符串字典序排序,可以将所有元素的score设为0,再使用字典序排序命令:
- 存入数据(把name作为member前缀,提升排序准确性):
zadd person_by_name 0 'john|{"name": "john", "age": 30, "role": "developer"}' zadd person_by_name 0 'smith|{"name": "smith", "age": 45, "role": "manager"}' zadd person_by_name 0 'ram|{"name": "ram", "age": 35, "role": "tester"}' - 按name字典序升序获取:
zrangebylex person_by_name [a [z
取出结果后,只需拆分掉|前缀即可得到完整JSON。
方案二:使用RedisJSON模块(需提前安装)
如果你的Redis环境安装了RedisJSON模块,可以直接存储原生JSON对象,并支持按属性排序查询:
- 存入每个JSON对象:
JSON.SET person:john $ '{"name": "john", "age": 30, "role": "developer"}' JSON.SET person:smith $ '{"name": "smith", "age": 45, "role": "manager"}' JSON.SET person:ram $ '{"name": "ram", "age": 35, "role": "tester"}' - 按age升序查询:
JSON.SORT person:* BY $.age GET $ - 按name字典序升序查询:
JSON.SORT person:* BY $.name GET $ ALPHA
方案三:哈希表+有序集合组合存储
用哈希表存储完整数据,有序集合存储排序属性与哈希键的映射,兼顾存储效率和排序灵活性:
- 存入哈希表:
hset person:john name john age 30 role developer hset person:smith name smith age 45 role manager hset person:ram name ram age 35 role tester - 创建有序集合关联排序属性(以age为例):
zadd person_age_map 30 person:john zadd person_age_map 45 person:smith zadd person_age_map 35 person:ram - 获取排序后的完整数据:
# 先按升序获取哈希键,再批量查询哈希表 zrange person_age_map 0 -1 | xargs hgetall
内容的提问来源于stack exchange,提问作者Gowthamss
相关产品推荐
相关产品推荐

