Redis基本数据结构
String字符串
Redis的字符串是动态字符串可修改,结构类似于ArrayList预先分配内存,当字符串长度小于1M,扩容是加倍现有空间,大于1M,一次扩容1M,字符串长度最大512M
-
操作:
- (单个增加)set key value 或 (单个获取)get key value
- (批量增加)mset key1 value1 key2 value2....或(单个获取) mget key1 key2...
-
计数:value为整数,可进行自增incr操作,最大值为signed long
-
字符串内部结构实现 todo 32节
list列表
Redis的list是链表结构,类似于LinkedList,所以其插入和删除的速度很快,时间复杂度为o(1),但查询的时间复杂度为o(n),当list中最后一个元素被删除,整个数据结构删除,内存回收。
但实际上列表在元素较少时会使用一块连续的内存存储,这时结构是ziplist压缩列表
当元素较多时结构改为快速列表quicklist,即ziplist+linkedlist实现快速插入/删除,因此减少了碎片空间和前后指针空间
-
操作:
- 队列(右进左出):(添加)rpush keyList value1 value2 value3 或 (长度)llen keyList 或 (弹出)lpop keyList
- 栈(右进右出):(添加)rpush keyList value1 value2 value3 或 (长度)llen keyList 或 (弹出)rpop keyList
- lindex:获取某索引位置的值,需要遍历列表
- lrange:获取所有元素
- lretain:获取start_index到end_index之间的值,其他值被清除,如lretain keyList 1 0为真~清空列表
-
异步队列:将任务结构序列化为字符串存入Redis列表
hash字典
Redis的hash结构类似于HashMap,即数组+链表,是一个无序字典,但它的key只能是字符串类型。最后一个元素被删除时,整个数据结构删除,内存回收。
-
rehash:为了提高性能,与HashMap的rehash需要全部重新hash不同,Redis的hash在rehash时采用渐进式策略:rehash时保留新旧两个hash结构,查询时同时查询两个hash结构,在后续的定时任务和hash指令中,渐渐迁移老的hash内容到新的hash内容,这样可以减少全部元素hash时带来的服务堵塞。
-
操作
- 单独存储某个key下的子内容:(为hash结构的keyHash存储子key和value)hset keyHash key1 value1 ,hset keyHash key2 value2
- 获取hash的entries内容:hgetall keyHash
- 长度:hlen keyHash
- 单独获取hash的某个key:hget keyHash key1
- 批量增加hash内容:hmset keyHash key1 value1 key2 value2
- 对子key计数:hincrby
-
缺点:hash结构存储消耗高于单个字符
set集合
Redis的set相当于HashSet,无序且唯一,相当于所有value为null的字典。set中最后一个元素被删除时,整个数据结构删除,内存回收。(hash是子key-子value形式,set是子key)
-
操作
- 添加:sadd keySet value1 value2
- 查找是否存在:sismember keySet value1
- 获取keySet的长度:scard keySet
- 弹出:spop keySet
zset有序列表
Redis的有序列表zset,类似SortedSet和HashMap的结合体。它整体是个set,有set的特性,但不同于set,它可以为keySet的每个value设置一个score(任意数值),代表其排序权重,内部由 跳跃列表 数据结构实现。zset中最后一个元素被删除时,整个数据结构删除,内存回收
-
操作
- 添加:zadd keyZset score value1
- 按score排序列出:zrange keySet 0 -1
- 按socre逆序列出:zrevrange keySet 0 -1
- 个数:zcard keyZset
- 获取指定value的score:zscore keyZset value1
- 根据score分区列出:zrangebyscore keyZset startScore endScore
- 删除value1:zrem keyZset value1
-
跳跃列表:实现内部score排序,保证随机的快速插入和删除;因为链表在二分查找时不支持,只有数组支持,所以不使用二分查找定位。
特性
针对list/set/zset/hash
- 新增元素时如果容器不存在则新建一个
- 删除最后一个元素时,删除整个数据结构,回收内存空间
针对所有结构
- 几秒后key值失效:setnx key seconds value 或 expire key seconds
- 过期是整个对象结构过期而不是内部单个元素
- 如果某字符串已设置过期时间,再次调用set方法修改这个元素的值时,过期时间会消失