redis多级存储及查询
描述
如何设计redis的数据结构,使用redis存储多级关系并快速查询
假设:市是最后一级单位(如果是区县也同理)
1).查询全国的数据?
2).查询四川省的数据?
3).查询成都市的数据?
方案
方案1:
将“context_prefix_国家_省_市”作为key,value保存我们要查询的数据,这样便于保存
example:
key value
gdp_中国_四川省_成都市 avg=97&sum=1800
gdp_中国_四川省_绵阳市 avg=30&sum=60
gdp_中国_广东省_广州市 avg=150&sum=3600
gdp_中国_河北省_保定市 avg=90&sum=2000
点评:但是查询的话只能模糊查询,效率很差,不推荐(key/value实现)
方案2:
1).将所有国家存到hash,hash中的国家名是key,value是这个国家对应的hash的key
2).将这个国家的所有省存到hash,省名字是key,value是这个省所对应的hash的key
3).将省下所有市存到hash,市的名字是key,value是这个省下所有市的key
4).通过市区可以取到所要市的值
example:
国家级hash表(hash):
hash key key value
gdp_国家:
中国 gdp_中国
英国 gdp_英国
美国 gdp_美国
省级hash表(hash):
hash key key value
gdp_中国:
四川省 gdp_中国_四川省
贵州省 gdp_中国_贵州省
云南省 gdp_中国_云南省
广东省 gdp_中国_广东省
市级hash表(hash):
hash key key value
gdp_中国_四川省:
成都市 gdp_中国_四川省_成都市
绵阳市 gdp_中国_四川省_绵阳市
德阳市 gdp_中国_四川省_德阳市
市区的key/value数据(键值对):
key value
gdp_中国_四川省_成都市 avg=97&sum=1800
gdp_中国_四川省_绵阳市 avg=30&sum=60
gdp_中国_四川省_德阳市 avg=24&sum=54
点评:该方式要查询市区的话,需要4次访问redis,相对模糊查询效率会高一些,但是4次网络io开销也不小(hash+key/value实现)
改进:额外增加所有市(前提是市名没有重复的)的一个hash,市名字就是key,value就是那个市所存储值得key,这样如果要查询某个市的数据,只需要2次网络io即可,如果要查询省的话,我们遍历省下面所有市的数据即可
方案3
所有市级hash表(hash):
hash key key value
gdp_all_city:
成都市 gdp_中国_四川省_成都市
绵阳市 gdp_中国_四川省_绵阳市
德阳市 gdp_中国_四川省_德阳市
北京市 gdp_中国_北京_北京市
上海市 gdp_中国_上海_上海市
广州市 gdp_中国_广东省_广州市
市区的key/value数据(键值对):
key value
gdp_中国_四川省_成都市 avg=97&sum=1800
gdp_中国_四川省_绵阳市 avg=30&sum=60
gdp_中国_四川省_德阳市 avg=24&sum=54
gdp_中国_广东省_广州市 avg=120&sum=2304