redis数据类型及应用场景

@爱耍流氓的唐僧  March 30, 2021

一、redis特点
1.所有的数据都存储在内存中,高速的读写。
2.redis的所有操作都是原子性的,支持多个操作合并后的原子性执行,支持事务。
3.提供数据持久化,RDB和AOF。
4.提供了丰富的数据类型,主要5大数据类型:string、hash、list、set、sort set......
5.支持数据备份,即master-slave模式的数据备份。
6.丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

二、redis5大数据类型的设计及应用场景
string
string介绍
string类型是redis的基本数据类型,key-value结构,key是某个数据的在redis中的唯一标识,value是具体的数据,redis的string在底层实现是SDS(simple dynamic string)

set name "hello world"

实际上在redis内部创建了两个SDS,一个为name的key的SDS,一个为hello world的SDS

struct sdshdr {
// 记录buf数组中已使用字节的数量,等于SDS所保存字符串长度
int len;
// 记录buf数组中未使用字节数量
int free;
// 字节数组,用户保存字符串
char buf[]
}

sds数据结构

20200705114342838.png

应用场景
数据表user结构

id    name    email
1    jack    jack@126.com
2    mary    mary@163.com

存储表中某个字段的值

set user:id:1 email jack@126.com

存储对象
将对象以json的格式或者其他对象格式化的字符串

set user:id:1 '[{"id":1,"name":"jack","email":jack@126.com}]'

Hash
Hash介绍
redis的Hash类型很像一张关系型数据库的数据表,Hash的key是一个唯一值,Value则是一个Hashmap的结构,Hash也有两种数据结构,分别是ziplist和散列表,当数据量较小的时候采用ziplist进行存储,当数据超过512个,单个长度大于64字节将采用散列表,这里散列表采用的是murmurhash2算法,采用链地址法来解决hash冲突问题。此外,Redis还支持散列表的动态扩容、缩容。注意,这里在redis里面扩容是分批进行的,避免一次性扩容进行数据搬迁造成服务停顿现象。

应用场景
Hashmap
Hash数据类型在存储上图中数据时比string类型更加的灵活,string需要转json或者其他格式的字符串,而Hashmap则不需要,而且内存开销占优势。

hmset user:1 name jack email jack@126.com
获取设置的值

hget user:1 email

List
List介绍
list是按照插入的顺序的字符串链表,List的底层是双项链表实现的,两端添加元素的复杂度O(1)。
双向链表
list.jpg
应用场景
消息队列

注意点
双向链表从头或者尾部插入数据性能非常高,复杂度O(1),如果从中间插入,会复杂一些,必须要修改前一个和后一个的节点指针,由图可以看出来

SET
SET介绍
set数据类型是一个不重复的集合(没有排序),可以对set集合进行添加,删除,判断是否存在的,可以对多个set进行集合的差集,交集,并集,补集操作,set的底层结构。
在redis中,我们可以查看intset.h文件,这是一个存储整数的集合,其结构如下:

typedef strut intset{
uint32_t encoding;
uint32_t length
int8_t contents
}intset;

其中各字段含义如下:

encoding:数据编码格式,表示每个数据元素用几个字节存储(可取的值有2、4,和8)
length:元素个数
contents:柔性数组,这部分内存单独分配,不包含在intset中
具体的操作我们就不详细展开了,了解集合这种数据结构的应该都很清楚,我们这里说一下,intset有一个数据升级的概念,比方说我们有一个16位整数的set,这时候插入了一个32位整数,所以就导致整个集合都升级为32位整数,但是反过来却不行,这也就是柔性数组的由来如果集合过大,会采用dict的方式来进行存储

应用场景
共同好友

ZSET
ZSET介绍
ZSET在SET的基础之上给集合的每个元素关联了一个分数,往集合中插入数据的时候会根据这个分数排序,底层的存储方式一种是ziplist/zipmap的格式,还有一种是skiplist跳跃表感兴趣可以去了解下。

ZSET应用
好友列表的排序(根据一些特性设置,亲密度等)等


添加新评论