Redis(四)
9.Redis 有序集合(sorted set)
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
-
将所有指定成员添加到键为
key
有序集合(sorted set)里面。 添加时可以指定多个分数/成员(score/member)对。 如果指定添加的成员已经是有序集合里面的成员,则会更新改成员的分数(scrore)并更新到正确的排序位置。zadd myzset 1 one 1 uno #添加两个元素到有序集合里面 zadd myzset 2 two 3 three #添加两个元素到有序集合
-
返回key的有序集元素个数。
zcard myzset
-
返回有序集key中,score值在min和max之间(默认包括score值等于min或max)的成员。
zcount myzset 0 -1#返回有序集合[0,1]的所有元素
-
返回存储在有序集合
key
中的指定范围的元素。 返回的元素可以认为是按得分从最低到最高排列。 如果得分相同,将按字典排序。参数start
和stop
都是基于零的索引,即0
是第一个元素,1
是第二个元素,以此类推。 它们也可以是负数,表示从有序集合的末尾的偏移量,其中-1
是有序集合的最后一个元素,-2
是倒数第二个元素,等等。start
和stop
都是全包含的区间,因此例如ZRANGE myzset 0 1
将会返回有序集合的第一个和第二个元素。可以传递WITHSCORES
选项,以便将元素的分数与元素一起返回。zrange myzset 0 -1#返回从低到高的有序集合 zrange myzset 0 -1 withscores#返回有序集合,以key val形式
-
返回key的有序集合中的分数在min和max之间的所有元素(包括分数等于max或者min的元素)。元素被认为是从低分到高分排序的。
zrangebyscore myzset -inf +inf withscores#返回集合中从负无穷到正无穷之间所有的元素
-
返回有序集key中成员member的排名。其中有序集成员按score值递增(从小到大)顺序排列。排名以0为底,也就是说,score值最小的成员排名为0。
zrank myzset one#返回one的排名
-
删除某个元素
zrem myzset one#删除one元素
-
返回有序集key中,指定区间内的成员。其中成员的位置按score值递减(从大到小)来排列。
zrevrange myzset 0 -1#倒序返回所有元素
-
为有序集key的成员member的score值加上增量increment。如果key中不存在member,就在key中添加一个member,score是increment(就好像它之前的score是0.0)。如果key不存在,就创建一个只含有指定member成员的有序集合。
zincrby myzset 2 one#将one的score增加2
-
返回有序集key中,成员member的score值。如果member元素不是有序集key的成员,或key不存在,返回nil。
zscore myzset one#返回one的score值
-
删除并返回有序集合
key
中的最多count
个具有最高得分的成员。zpopmax myzset#删除并返回集合中score
-
删除并返回有序集合
key
中的最多count
个具有最低得分的成员。zpopmin myzset
更多命令参考官方文档:https://redis.io/commands
10.地理空间(geospatial)
将指定的地理空间位置(纬度、经度、名称)添加到指定的key
中。这些数据将会存储到sorted set
这样的目的是为了方便使GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。该命令以采用标准格式的参数x,y,所以经度必须在纬度之前。
- 有效的经度从-180度到180度。
- 有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。
-
将指定的地理空间位置(纬度、经度、名称)添加到指定的
key
中。geoadd china:city 116.46 39.93 beijing#添加北京的经纬度到集合里面 geoadd china:city 121.48 31.22 shanghai#添加上海的经纬度到集合里面
-
从
key
里返回所有给定位置元素的位置(经度和纬度)。geopos china:city beijing#返回北京的经纬度 geopos china:city wuhan#返回武汉的经纬度
-
返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值。
指定单位的参数 unit 必须是以下单位的其中一个:
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺。
如果用户没有显式地指定单位参数, 那么
GEODIST
默认使用米作为单位。geodist china:city beijing wuhan km#返回北京到武汉的直线距离
-
以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
范围可以使用以下其中一个单位:
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺。
georadius china:city 114.31 30.52 500 km withdist#返回距离经纬度114.31,30.52为中心,500KM范围内所有的城市,并返回距离数
-
这个命令和 GEORADIUS) 命令一样, 都可以找出位于指定范围内的元素, 但是
GEORADIUSBYMEMBER
的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点指定成员的位置被用作查询的中心。georadiusbymember china:city wuhan 1000 km#距离武汉有1000km的城市都列出来
-
返回一个或多个位置元素的 Geohash表示。通常使用表示位置的元素使用不同的技术,使用Geohash位置52点整数编码。由于编码和解码过程中所使用的初始最小和最大坐标不同,编码的编码也不同于标准。
geohash china:city wuhan beijing#返回武汉和北京的地理位置哈希值
11. HyperLogLog
HyperLogLog 是一种用于计算唯一事物的概率数据结构(从技术上讲,这称为估计集合的基数)。通常计算唯一项目需要使用与您要计算的项目数量成正比的内存量,因为您需要记住过去已经看过的元素,以避免对它们进行多次计数。然而,有一组算法可以用内存来换取精度:在 Redis 实现的情况下,您最终会得到一个带有标准误差的估计度量,该误差小于 1%。该算法的神奇之处在于,您不再需要使用与计数的项目数量成正比的内存量,而是可以使用恒定量的内存!最坏情况下为 12k 字节。
Redis 中的 HLL 虽然在技术上是一种不同的数据结构,但被编码为 Redis 字符串,因此您可以调用GET
以序列化 HLL,并将SET
其反序列化回服务器。
从概念上讲,HLL API 就像使用 Sets 来完成相同的任务。您将 SADD
每个观察到的元素放入一个集合,并SCARD
用于检查集合内元素的数量,这些元素是唯一的,因为SADD
不会重新添加现有元素。
-
将除了第一个参数以外的参数存储到以第一个参数为变量名的HyperLogLog结构中.
PFADD myset a b c d e f g i j k#将a-k加到结构中统计个数
-
当参数为一个key时,返回存储在HyperLogLog结构体的该变量的近似基数,如果该变量不存在,则返回0.
pfcount myset
-
将多个 HyperLogLog 合并(merge)为一个 HyperLogLog , 合并后的 HyperLogLog 的基数接近于所有输入 HyperLogLog 的可见集合(observed set)的并集.
pfmerge myset3 myset myset1
12.Bitmaps
只有两种状态的统计,比如,记录每周打卡,用户是否在线,是否活跃等等。
-
设置或者清空key的value(字符串)在offset处的bit值。
setbit sign 0 1#周一打卡 setbit sign 1 1#周二打卡 setbit sign 2 0 #周三未打卡
-
返回key对应的string在offset处的bit值
getbit sign 0#获取星期一的打卡情况
-
统计字符串被设置为1的bit数
bitcount sign #统计一周的打卡情况