redis数据类型及应用场景

一、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数据结构

应用场景

数据表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)。
双向链表

应用场景

消息队列

注意点

双向链表从头或者尾部插入数据性能非常高,复杂度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应用

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

本作品采用《CC 协议》,转载必须注明作者和本文链接
打不死的小强
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!