Redis 有�集�(sorted set)
Redis 有åº�集å�ˆå’Œé›†å�ˆä¸€æ ·ä¹Ÿæ˜¯ string ç±»åž‹å…ƒç´ çš„é›†å�ˆ,且ä¸�å…�许é‡�å¤�çš„æˆ�员。
ä¸�å�Œçš„æ˜¯æ¯�ä¸ªå…ƒç´ éƒ½ä¼šå…³è�”一个 double 类型的分数。redis æ£æ˜¯é€šè¿‡åˆ†æ•°æ�¥ä¸ºé›†å�ˆä¸çš„æˆ�员进行从å°�到大的排åº�。
有�集�的�员是唯一的,但分数(score)��以��。
集å�ˆæ˜¯é€šè¿‡å“ˆå¸Œè¡¨å®žçŽ°çš„ï¼Œæ‰€ä»¥æ·»åŠ ï¼Œåˆ é™¤ï¼ŒæŸ¥æ‰¾çš„å¤�æ�‚度都是 O(1)。 集å�ˆä¸æœ€å¤§çš„æˆ�员数为 232 - 1 (4294967295, æ¯�个集å�ˆå�¯å˜å‚¨40多亿个æˆ�员)。
实例
redis 127.0.0.1:6379> ZADD runoobkey 1 redis (integer) 1 redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb (integer) 1 redis 127.0.0.1:6379> ZADD runoobkey 3 mysql (integer) 1 redis 127.0.0.1:6379> ZADD runoobkey 3 mysql (integer) 0 redis 127.0.0.1:6379> ZADD runoobkey 4 mysql (integer) 0 redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES 1) "redis" 2) "1" 3) "mongodb" 4) "2" 5) "mysql" 6) "4"
åœ¨ä»¥ä¸Šå®žä¾‹ä¸æˆ‘们通过命令 ZADD å�‘ redis 的有åº�集å�ˆä¸æ·»åŠ äº†ä¸‰ä¸ªå€¼å¹¶å…³è�”上分数。
Redis 有�集�命令
下表列出了 redis 有�集�的基本命令:
| �� | 命令��述 |
|---|---|
| 1 | ZADD key score1 member1 [score2 member2] å�‘有åº�集å�ˆæ·»åŠ ä¸€ä¸ªæˆ–å¤šä¸ªæˆ�员,或者更新已å˜åœ¨æˆ�员的分数 |
| 2 | ZCARD key 获�有�集�的�员数 |
| 3 | ZCOUNT key min max 计算在有åº�集å�ˆä¸æŒ‡å®šåŒºé—´åˆ†æ•°çš„æˆ�员数 |
| 4 | ZINCRBY key increment member 有åº�集å�ˆä¸å¯¹æŒ‡å®šæˆ�å‘˜çš„åˆ†æ•°åŠ ä¸Šå¢žé‡� increment |
| 5 | ZINTERSTORE destination numkeys key [key ...] 计算给定的一个或多个有åº�集的交集并将结果集å˜å‚¨åœ¨æ–°çš„æœ‰åº�集å�ˆ destination ä¸ |
| 6 | ZLEXCOUNT key min max 在有åº�集å�ˆä¸è®¡ç®—指定å—典区间内æˆ�员数é‡� |
| 7 | ZRANGE key start stop [WITHSCORES] 通过索引区间返回有�集�指定区间内的�员 |
| 8 | ZRANGEBYLEX key min max [LIMIT offset count] 通过å—典区间返回有åº�集å�ˆçš„æˆ�员 |
| 9 | ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有�集�指定区间内的�员 |
| 10 | ZRANK key member 返回有åº�集å�ˆä¸æŒ‡å®šæˆ�员的索引 |
| 11 | ZREM key member [member ...] 移除有åº�集å�ˆä¸çš„一个或多个æˆ�员 |
| 12 | ZREMRANGEBYLEX key min max 移除有åº�集å�ˆä¸ç»™å®šçš„å—典区间的所有æˆ�员 |
| 13 | ZREMRANGEBYRANK key start stop 移除有åº�集å�ˆä¸ç»™å®šçš„æŽ’å��区间的所有æˆ�员 |
| 14 | ZREMRANGEBYSCORE key min max 移除有åº�集å�ˆä¸ç»™å®šçš„分数区间的所有æˆ�员 |
| 15 | ZREVRANGE key start stop [WITHSCORES] 返回有åº�集䏿Œ‡å®šåŒºé—´å†…çš„æˆ�员,通过索引,分数从高到低 |
| 16 | ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有åº�集䏿Œ‡å®šåˆ†æ•°åŒºé—´å†…çš„æˆ�员,分数从高到低排åº� |
| 17 | ZREVRANK key member 返回有åº�集å�ˆä¸æŒ‡å®šæˆ�员的排å��,有åº�集æˆ�员按分数值递å‡�(从大到å°�)排åº� |
| 18 | ZSCORE key member 返回有åº�集ä¸ï¼Œæˆ�员的分数值 |
| 19 | ZUNIONSTORE destination numkeys key [key ...] 计算给定的一个或多个有åº�集的并集,并å˜å‚¨åœ¨æ–°çš„ key ä¸ |
| 20 | ZSCAN key cursor [MATCH pattern] [COUNT count] è¿ä»£æœ‰åº�集å�ˆä¸çš„å…ƒç´ ï¼ˆåŒ…æ‹¬å…ƒç´ æˆ�å‘˜å’Œå…ƒç´ åˆ†å€¼ï¼‰ |
麻酱
gwa***hunlei@gmail.com
原文ä¸è¯´ï¼Œé›†å�ˆæ˜¯é€šè¿‡å“ˆå¸Œè¡¨å®žçŽ°çš„ï¼Œæ‰€ä»¥æ·»åŠ ï¼Œåˆ é™¤ï¼ŒæŸ¥æ‰¾çš„å¤�æ�‚度都是O(1)其实ä¸�太准确。
其实在redis sorted sets里�当items内容大于64的时候�时使用了hash和skiplist两�设计实现。这也会为了排�和查找性能�的优化。所以如上�知:
æ·»åŠ å’Œåˆ é™¤éƒ½éœ€è¦�修改skiplist,所以å¤�æ�‚度为O(log(n))。
ä½†æ˜¯å¦‚æžœä»…ä»…æ˜¯æŸ¥æ‰¾å…ƒç´ çš„è¯�å�¯ä»¥ç›´æŽ¥ä½¿ç”¨hash,其å¤�æ�‚度为O(1)
其他的range�作��度一般为O(log(n))
当然如果是å°�于64çš„æ—¶å€™ï¼Œå› ä¸ºæ˜¯é‡‡ç”¨äº†ziplist的设计,其时间å¤�æ�‚度为O(n)
麻酱
gwa***hunlei@gmail.com
å¼ å°�三
576***737@qq.com
补充测试结果:
å¼ å°�三
576***737@qq.com