Redis01——基本数据类型

131 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

img

(1)string 上限512M 【set key value】【get key】 一key一value

String类型,默认以**SDS动态字符串结构**存储,是二进制安全的(不识别特殊字符)

整数数据可以用long类型表示。所有key都是string类型

非二进制安全:C语言中字符串以特殊字符“\0” 来作为字符串的结束标识。strlen函数计算长度时会一起计算'\0'

应用场景:一般将对象转换为Json格式的字符串存入String类型中方便阅读。

(2)list 上限2^31-1个元素 【lpush key element】 【lrange key start stop】 一key多值

底层由双向链表实现,两端操作效率更高,使用lpushrpop,可作为消息队列。

  • zipList:(连续内存空间存储,采用变长编码),在值较少时使用
  • quickListzipList组成的双向链表,值较多时使用
  • 应用:实现令牌桶算法的限流器

(3)hash 上限2^31-1个元素 【hset key field value】 【hmget key field1】 key dict字典(键值对集合)

  • zipList 当<field,value>数量少时使用
  • hashtabledict字典结构,用dictEntry二维数组)。

应用场景:存储用户数据,key是用户id,<field,value>可以是<"name","zhangsan">,<"age","14">

(4)set 【sadd key member】 【smembers key】 key 无序集合

  • intset,(数量不超过512元素是整数)内部是一个数组,存储数据时是有序的,使用二分查找查数据
  • hashtable,(dict字典结构,value为null)

(5)zset 【zadd key score member】【zrange key start stop】 key 有序集合

Sorted Set(有序集合):按照设置的score值从低到高排序,value不能重复。

  • ziplist,元素数量小于128且member的长度都小于64字节则使用ziplist。
  • skipList,(dict字典+跳表)skiplist结点存储字典leve层级数组每个结点指向下一个包含同层级的skiplist结点,有backward指针指向前一个skiplist结点,可以从表尾向表头遍历。
  • 应用:实现限流器(时间戳+滑动窗口)

img

跳表可以保证增、删、查等操作时的时间复杂度为O(logN),实现简单,缺点是空间占用比较大。为了节省空间我们可以多几个节点抽取为一个节点,比如隔3个或5个。

红黑树虽然查询效率高但是太复杂

其他

Redis存储图片的三种方式:

(1)直接用String存,先把图片用base64编码并作为value存储起来,get后将value进行base64解码。

(2)存储图片路径,将图片保存在本地(上云也可以),value直接存对应的路径即可。

(3)将图片转为对象,存储对象的序列化数据