一、基础数据结构
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深度历险》