List
Redis List 的有序指插入顺序有序,是双向链表保存元素位置,不会根据元素值自动排序;ZSet 才是根据 score 自动排序。
LPUSH mylist A
LPUSH mylist B
RPUSH mylist C
LPUSH A → [A]
LPUSH B → [B, A]
RPUSH C → [B, A, C]
ZSet
不管插入先后,永远按 score 排序
# 先插入 score=100 的 zhangsan
ZADD rank 100 zhangsan
# 后插入 score=80 的 lisi
ZADD rank 80 lisi
# 再插入 score=90 wangwu
ZADD rank 90 wangwu
执行 ZRANGE rank 0 -1(从小到大查询)
1) "lisi"
2) "wangwu"
3) "zhangsan"
Hash 哈希
一个 key,包含多个 field:value,适合存对象,类似一张小表一行。
user:100 -> {
name: "zhangsan",
age: "20",
email: "a@test.com"
}
可以单独更新某一个字段,不用序列化整个对象。
GEO
Redis GEO 底层本质就是 ZSet,key 为 GEO 的键名,member 存储地点名称,score 存放经纬度编码后的 geohash 52 位整数。使用 GEOADD 添加坐标时,参数顺序是经度在前、纬度在后,这点很容易踩坑;GEO 没有单独的删除指令,删除元素直接使用 ZREM 操作这个 ZSet 的 member。
# 1. GEOADD 添加坐标(经度 纬度 member)
GEOADD geo:cities 116.403874 39.914885 "北京" 121.473701 31.230416 "上海" 113.264385 23.129110 "广州"
geo:cities(ZSet)
member:"北京" score=geohash(116.403874,39.914885)
member:"上海" score=geohash(121.473701,31.230416)
member:"广州" score=geohash(113.264385,23.129110)
查询城市经纬度
GEOPOS geo:cities 北京 上海
计算两点距离(单位 m /km)
# 北京到上海,单位km
GEODIST geo:cities 北京 上海 km