sorted set 也是 string 类型元素的集合,不同的是每个元素都会关联一个 double
类型的 score。sorted set 的实现是 skip list 和 hash table 的混合体。当元素被添加到集合中时,一个元素到 score 的映射被添加到 hash table 中,所以给定一个元素获取 score 的开销是 O(1),另一个 score 到元素的映射被添加到 skip list,并按照 score 排序,所以就可以有序的获取集合中的元素。添加,删除操作开销都是 O(log(N))和 skip list 的开销一致,redis 的 skip list 实现用的是双向链表,这样就可以逆序从尾部取元素。sorted set 最经常的使用方式应该是作为索引来使用.我们可以把要排序的字段作为 score 存储,对象的 id
1: zadd 添加, zrem删除, zincrby修改score
redis 127.0.0.1:6378> zadd myset 1 one // 1是score one是元素 (integer) 1 redis 127.0.0.1:6378> zadd myset 4 one (integer) 0 redis 127.0.0.1:6378> zadd myset 2 ljq (integer) 1 redis 127.0.0.1:6378> zadd myset 0 dd (integer) 1 redis 127.0.0.1:6378> zrange myset 0 -1 withscores // 按score排序输出 1) "dd" 2) "0" 3) "ljq" 4) "2" 5) "one" 6) "4" redis 127.0.0.1:6378> zrem myset ljq // 删除一个 (integer) 1 redis 127.0.0.1:6378> zrange myset 0 -1 withscores 1) "dd" 2) "0" 3) "one" 4) "4" redis 127.0.0.1:6378> zincrby myset 2 hello //添加score "2" redis 127.0.0.1:6378> zrange myset 0 -1 withscores 1) "dd" 2) "0" 3) "hello" 4) "2" 5) "one" 6) "4"
2:zrank返回名称为 key 的 zset 中 member 元素的排名(按 score 从小到大排序)即下标
redis 127.0.0.1:6378> zrange myset 0 -1 withscores 1) "dd" 2) "0" 3) "one" 4) "4" 5) "hello" 6) "6" redis 127.0.0.1:6378> zrank myset one // 发挥按score排序的下标 (integer) 1
3:zrevrandk 返回名称为 key 的 zset 中 member 元素的排名(按 score 从大到小排序)即下标
redis 127.0.0.1:6378> zrange myset 0 -1 withscores 1) "dd" 2) "0" 3) "one" 4) "4" 5) "hello" 6) "6" redis 127.0.0.1:6378> zrevrank myset dd (integer) 2
4:zrangebyscore,zscore, zcount
redis 127.0.0.1:6378> zrangebyscore myset 4 6 withscores // 显示score区间 1) "one" 2) "4" 3) "hello" 4) "6" redis 127.0.0.1:6378> zcount myset 4 6 //显示score区间的数量 (integer) 2 redis 127.0.0.1:6378> zcard myset // 显示总数 (integer) 4 redis 127.0.0.1:6378> zscore myset hello // 返回hello的score "6" redis 127.0.0.1:6378> zremrangebyscore myset 4 6 // 按score删除 (integer) 2 redis 127.0.0.1:6378> zrange myset 0 -1 withscores 1) "dd" 2) "0" 3) "ljq1" 4) "10"
5:redis常用命令
redis 127.0.0.1:6378> sadd myset1 a ljq (integer) 2 redis 127.0.0.1:6378> keys * // 所以的key 1) "myset" 2) "myset1" redis 127.0.0.1:6378> keys myset // 匹配key 1) "myset" redis 127.0.0.1:6378> exists myset // 判断key是否存在 (integer) 1 redis 127.0.0.1:6378> del myset1 // 删除key (integer) 1 redis 127.0.0.1:6378> keys * 1) "myset" redis 127.0.0.1:6378> expire myset 10 // 设置key的过期时间10s (integer) 1 redis 127.0.0.1:6378> keys* (error) ERR unknown command 'keys*' redis 127.0.0.1:6378> keys * 1) "myset" redis 127.0.0.1:6378> keys * (empty list or set) redis 127.0.0.1:6378> persist myset // 取消过期时间 (integer) 0 redis 127.0.0.1:6378> keys * (empty list or set) redis 127.0.0.1:6378> zadd myset 1 ljq (integer) 1 redis 127.0.0.1:6378> zrange myset 0 -1 withscores 1) "ljq" 2) "1" redis 127.0.0.1:6378> type myset // key 类型 zset redis 127.0.0.1:6378> ping PONG redis 127.0.0.1:6378> select 1 // 选择数据库 OK redis 127.0.0.1:6378[1]> select 17 (error) ERR invalid DB index redis 127.0.0.1:6378[17]> select 16 (error) ERR invalid DB index redis 127.0.0.1:6378[16]> select 15 OK redis 127.0.0.1:6378[15]> dbsize (integer) 0 redis 127.0.0.1:6378[15]> select 0 OK redis 127.0.0.1:6378> dbsize (integer) 1 redis 127.0.0.1:6378> info # Server redis_version:2.6.16 redis_git_sha1:00000000 redis_git_dirty:0 redis_mode:standalone os:Linux 3.8.0-30-generic i686 arch_bits:32 multiplexing_api:epoll gcc_version:4.7.3 process_id:3194 run_id:f56643d4ef20b9578d23dcfd44873c50e59e2c44 tcp_port:6378 uptime_in_seconds:2021 uptime_in_days:0 hz:10 lru_clock:1558645 # Clients connected_clients:1 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:447576 used_memory_human:437.09K used_memory_rss:1564672 used_memory_peak:446976 used_memory_peak_human:436.50K used_memory_lua:21504 mem_fragmentation_ratio:3.44 mem_allocator:jemalloc-3.2.0 # Persistence loading:0 rdb_changes_since_last_save:15 rdb_bgsave_in_progress:0 rdb_last_save_time:1378733237 rdb_last_bgsave_status:err rdb_last_bgsave_time_sec:0 rdb_current_bgsave_time_sec:-1 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok # Stats total_connections_received:1 total_commands_processed:49 instantaneous_ops_per_sec:0 rejected_connections:0 expired_keys:1 evicted_keys:0 keyspace_hits:18 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:158 # Replication role:master connected_slaves:0 # CPU used_cpu_sys:1.39 used_cpu_user:0.27 used_cpu_sys_children:0.00 used_cpu_user_children:0.00 # Keyspace db0:keys=1,expires=0,avg_ttl=0