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方法修改这个元素的值时,过期时间会消失
原文地址:https://www.cnblogs.com/hangzhi/p/11100673.html