一、基础数据类型

2.1 String(字符串)

在Redis中String是可以修改的,称为动态字符串(Simple Dynamic String 简称 SDS),说是字符串但它的内部结构更像是一个 ArrayList,内部维护着一个字节数组,并且在其内部预分配了一定的空间,以减少内存的频繁分配。

Redis的内存分配机制是这样:

  • 当字符串的长度小于 1MB时,每次扩容都是加倍现有的空间。
  • 如果字符串长度超过 1MB时,每次扩容时只会扩展 1MB 的空间。

这样既保证了内存空间够用,还不至于造成内存的浪费,字符串最大长度为 512MB.。

字符串的数据结构

  1. struct SDS{
  2. T capacity; //数组容量
  3. T len; //实际长度
  4. byte flages; //标志位,低三位表示类型
  5. byte[] content; //数组内容
  6. }

2.1.1 应用场景

2.1.2 字符串(String)常用的命令:

  1. set [key] [value] 给指定key设置值(set 可覆盖老的值)
  2. get [key] 获取指定key 的值
  3. del [key] 删除指定key
  4. exists [key] 判断是否存在指定key
  5. mset [key1] [value1] [key2] [value2] ...... 批量存键值对
  6. mget [key1] [key2] ...... 批量取key
  7. expire [key] [time] 给指定key 设置过期时间 单位秒
  8. setex [key] [time] [value] 等价于 set + expire 命令组合
  9. setnx [key] [value] 如果key不存在则set 创建,否则返回0
  10. incr [key] 如果value为整数 可用 incr命令每次自增1
  11. incrby [key] [number] 使用incrby命令对整数值 进行增加 number

2.2 list(列表)

Redis中的list和Java中的LinkedList很像,底层都是一种链表结构, list的插入和删除操作非常快,时间复杂度为 0(1),不像数组结构插入、删除操作需要移动数据。像归像,但是redis中的list底层可不是一个双向链表那么简单。
当数据量较少的时候它的底层存储结构为一块连续内存,称之为ziplist(压缩列表),它将所有的元素紧挨着一起存储,分配的是一块连续的内存;当数据量较多的时候将会变成quicklist(快速链表)结构。
可单纯的链表也是有缺陷的,链表的前后指针 prev 和 next 会占用较多的内存,会比较浪费空间,而且会加重内存的碎片化。在redis 3.2之后就都改用ziplist+链表的混合结构,称之为 quicklist(快速链表)。

2.2.1 应用场景

由于list它是一个按照插入顺序排序的列表,所以应用场景相对还较多的,例如:

  • 消息队列:lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能
  • 朋友圈的点赞列表、评论列表、排行榜:lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表。

    2.2.2 list操作的常用命名

  1. rpush [key] [value1] [value2] ...... 链表右侧插入
  2. rpop [key] 移除右侧列表头元素,并返回该元素
  3. lpop [key] 移除左侧列表头元素,并返回该元素
  4. llen [key] 返回该列表的元素个数
  5. lrem [key] [count] [value] 删除列表中与value相等的元素,count是删除的个数。 count>0 表示从左侧开始查找,删除count个元素,count<0 表示从右侧开始查找,删除count个相同元素,count=0 表示删除全部相同的元素(PS: index 代表元素下标,index 可以为负数, index= 表示倒数第一个元素,同理 index=-2 表示倒数第二 个元素。)
  6. lindex [key] [index] 获取list指定下标的元素 (需要遍历,时间复杂度为O(n))
  7. lrange [key] [start_index] [end_index] 获取list 区间内的所有元素 (时间复杂度为 On))
  8. ltrim [key] [start_index] [end_index] 保留区间内的元素,其他元素删除(时间复杂度为 On))