Redis| 青训营笔记

106 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第10天。今天学的是Redis相关知识。
Redis是一种基于内存的数据库,并且提供一定的持久化功能。在日常对数据库的访问中,读操作的次数远超写操作,所以需要读的可能性是比写的可能大得多的。当我们使用SQL语句去数据库进行读操作时,数据库就会去磁盘把对应的数据索引取回来,这是一个相对较慢的过程。如果我们把数据放在Redis中,也就是直接放在内存之中,让服务端直接去读取内存中的数据,那么这样速度明显就会快上不少,并且会极大减小数据库的压力,但是使用内存进行数据存储开销也是比较大的,限于成本的原因,一般我们只是使用Redis存储一些常用和主要的数据。
Redis有5种数据结构,分别是string(字符串),list(列表),set(无序集合),zset(有序集合)和hash(哈希)。在Redis中有一个核心的对象叫做redisObject ,是用来表示所有的key和value的,用redisObject结构体来表示String、Hash、List、Set、ZSet五种数据类型。redisObject有5个属性,分别是数据类型,编码方式,数据指针,虚拟内存和其它信息。
String类型的数据结构存储方式有三种int、raw和embstr。int是整数型值。raw是用SDS(简单动态字符串)方式存储一个字符串值并且长度大于32个字节的字符串。embstr是存储一个字符串值并且长度小于等于32个字节的字符串。SDS有3个属性,分别是len,free和buf。len保存了字符串的长度,free表示buf数组中未使用的字节数量,buf数组则是保存字符串的每一个字符元素。Hash对象的实现方式有两种分别是ziplist和hashtable。list有ziplist,linkedlist和quicklist三种。linkedlist是一个双向链表,有指向前后节点的指针。插入、修改、更新的时间复杂度为O(1),查询的时间复杂度为O(n)。set是无序的不可重复的集合。ZSet是有序集合,底层实现是ziplist和skiplist。