redis——zset的跳跃列表

一、基础数据结构

1、string

字符串string是Redis最简单的数据结构,内部是一个字符数组。常用于缓存用户信息(JSON序列化),但

①Redis的string是一个动态字符串,内部结构实现类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,

内部为当前字符串分配的实际空间capacity,一般是大于实际长度length的,当字符串长度小于1MB时,扩容就是加倍现有空间;当字符串长度超过1MB,扩容时一次只会多扩容1MB

②注意字符串最大长度为512MB

指令:

//redis-cli 
//help @string
APPEND key value
BITCOUNT key [start end]
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset inc     rement] [OVERFLOW WRAP|SAT|FAIL]
BITOP operation destkey key [key ...]
BITPOS key bit [start] [end]
DECR key
DECRBY key decrement
GET key
GETBIT key offset
GETRANGE key start end
GETSET key value
INCR key
INCRBY key increment
INCRBYFLOAT key increment
MGET key [key ...]
MSET key value [key value ...]
MSETNX key value [key value ...]
PSETEX key milliseconds value
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
SETBIT key offset value
SETEX key seconds value
SETNX key value
SETRANGE key offset value
STRLEN key

2、list

Redis的列表采用双向链表实现,所以

①插入删除操作非常快O(1),查询速度很慢O(n),

②底层存储的不是一个简单的LinkedList而是一个quicklist,当list中元素较少时,ziplist存储,元素存储与数组一样是彼此相邻的;当元素比较多时,改为quicklist实现,Redis将链表和ziplist

组合起来组成quicklist

③Redis的列表常用做队列使用

指令:由于Redis是单线程、应该注意三个查询(O(n))相关的指令的使用:lindex、lrange、ltrim

//redis-cli
//help @list
BLPOP key [key ...] timeout
BRPOP key [key ...] timeout
BRPOPLPUSH source destination timeout
LINDEX key index    //查询相关指令慎用,O(n)
LINSERT key BEFORE|AFTER pivot value
LLEN key
LPOP key
LPUSH key value [value ...]
LPUSHX key value
LRANGE key start stop  //查询相关指令慎用,O(n)
LREM key count value
LSET key index value
LTRIM key start stop   //查询相关指令慎用,O(n)
RPOP key
RPOPLPUSH source destination
RPUSH key value [value ...]
RPUSHX key value

3、hash

Redis的hash存储实现,类似于jdk1.7的HashMap存储实现:“数组+链表”。但

①Redis的hash存储的值只能是字符串类型

②Redis的hash的扩容过程与HashMap不同,HashMap采用一次性全部rehash,然后丢弃原数组;Redis的hash采用渐进式rehash,会同时使用原数组和新数组,知道全部rehash完成,才丢弃原数组。

指令:

//redis-cli
//help @hash
HDEL key field [field ...]
HEXISTS key field
HGET key field
HGETALL key
HINCRBY key field increment
HINCRBYFLOAT key field increment
HKEYS key
HLEN key
HMGET key field [field ...]
HMSET key field value [field value ...]
HSCAN key cursor [MATCH pattern] [COUNT count]
HSET key field value
HSETNX key field value
HSTRLEN key field
HVALS key

4、set

Redis的无序集合相当于Java中HashSet,底层是一个HashMap,Entry的值为NULL;

①set有去重功能,可以保证一些去重业务。

指令:

//redis-cl
//help @set
SADD key member [member ...]
SCARD key
SDIFF key [key ...]
SDIFFSTORE destination key [key ...]
SINTER key [key ...]
SINTERSTORE destination key [key ...]
SISMEMBER key member
SMEMBERS key
SMOVE source destination member
SPOP key [count]
SRANDMEMBER key [count]
SREM key member [member ...]
SSCAN key cursor [MATCH pattern] [COUNT count]
SUNION key [key ...]
SUNIONSTORE destination key [key ...]

5、sorted_set

sorted_set有序集合是Redis最有特色的数据结构,也称zset。存储结构跟Set一致,但多了一个排序逻辑,给每个Entry赋予一个score属性,用于排序。

①排序需要随机的插入和删除,所以不宜用数组实现,数组插入元素时,需要调整其他元素的位置,zset是链表实现

②zset内部的排序功能时通过“跳跃链表”数据结构来实现的。

③zset可实现延时队列

指令:

//redis-cli
//help sorted_set
BZPOPMAX key [key ...] timeout
BZPOPMIN key [key ...] timeout
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
ZCARD key
ZCOUNT key min max
ZINCRBY key increment member
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
ZLEXCOUNT key min max
ZPOPMAX key [count]
ZPOPMIN key [count]
ZRANGE key start stop [WITHSCORES]
ZRANGEBYLEX key min max [LIMIT offset count]
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZRANK key member
ZREM key member [member ...]
ZREMRANGEBYLEX key min max
ZREMRANGEBYRANK key start stop
ZREMRANGEBYSCORE key min max
ZREVRANGE key start stop [WITHSCORES]
ZREVRANGEBYLEX key max min [LIMIT offset count]
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
ZREVRANK key member
ZSCAN key cursor [MATCH pattern] [COUNT count]
ZSCORE key member
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

二、跳跃链表

1

《redis深度历险》

猜你喜欢

转载自www.cnblogs.com/wqff-biubiu/p/12305836.html