日期:2014-05-16  浏览次数:20372 次

6:sorted set类型

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_versi