【初识Redis】

本文介绍了SQL数据库与NoSQL数据库的区别,重点剖析了Redis作为内存键值型NoSQL数据库的特点,包括数据结构(如String、List、Hash、Set、ZSet)及其应用场景。Redis以其内存存储、数据结构多样性及在高并发场景下的优势被提及。
摘要由CSDN通过智能技术生成

【初识Redis】

SQL/NoSQL

SQL(Structured Query Language)是传统的传统的关系型数据库,它使用结构化数据模型,将数据存储在表格中,并通过SQL查询语言进行操作和管理。SQL数据库具有以下特点:

  • 结构化数据模型:SQL数据库使用表格和预定义的模式来组织和存储数据,每个表格由行和列组成。
  • 数据一致性:SQL数据库强调数据的一致性,它遵循ACID(原子性、一致性、隔离性和持久性)原则,确保数据的完整性和可靠性。
  • 数据关系:SQL数据库支持定义和管理数据之间的关系(主键、外键等),可以进行复杂的数据查询和连接操作
  • 适用于复杂查询:由于SQL数据库具有丰富的查询语言和强大的关系代数操作,它们通常适用于需要复杂查询和多表关联的场景。
    在这里插入图片描述
    NoSQL(Not Only SQL)数据库则是一类非关系型数据库,它采用非结构化或半结构化数据模型,不使用固定的表格和模式来存储数据。NoSQL数据库具有以下特点:
  • 非结构化数据模型:NoSQL数据库可以存储各种形式的数据,包括文档、键值对、列族和图形等,没有严格的预定义模式。
  • 可水平扩展:NoSQL数据库通常具有良好的可扩展性,可以轻松处理大规模数据和高并发访问。
  • 灵活性和高性能:由于没有严格的模式限制和复杂的关系操作,NoSQL数据库在处理大量数据和高速读写方面通常表现出色。
  • 最终一致性:NoSQL数据库通常关注分布式系统的可用性和性能,采用最终一致性模型,即数据在一段时间内最终会达到一致状态。在这里插入图片描述

Redis

Redis诞生于2009年全称是Remote Dictionary Server,远程词典服务器,是一个基于内存的键值型NoSQL数据库,具有以下特点
在这里插入图片描述

Redis数据结构

是一个key-value的数据库,key一般是String类型,Value类型多样:五大基本类型+三种特殊类型
Strring、Hash、List、Set、zset;GEO、BitMap、HyperLog

String

特征:存储字符串的数据类型,单个字符串存储最大不超过512MB
常使用业务场景:用于存储JSON序列化后的对象
底层编码:

  • Int编码:
    • 数据结构特点:pt指针直接指向字符串常量池中对应字符串地址,且数组中元素只能为数字
    • 使⽤要求:每⼀个字符必须是数字
  • EmbStr编码:
    • 数据结构特点:采⽤简单动态字符串结构,这种结构的特征就在于是⼀个可扩容的字符数组,由当前已使⽤⻓度字段,当前未使⽤⻓度字段以及⼀个字符数组组成。
    • 扩容规则:当字符数组⼤⼩⼩于1MB时,将总⻓度进⾏翻倍,如果字符数组⼤⼩⼤于1MB,那么每次增加1MB的⻓度
    • 使⽤要求:当字符串⼤⼩⼩于32MB时候,采⽤的编码
    • 数据结构内存地址所在:为RedisObject对象后的连续内存
  • Raw编码:
    • 数据结构特点:同样采⽤简单动态字符串作为数据结构
    • 使⽤要求为当字符串⼤⼩超过32MB的时候,⾃动转为RAW编码
    • 数据结构内存地址所在:不和RedisObject对象在⼀起,⽽是在内存中其他随机地⽅
  • 重点:由于EmbStr和Raw编码中简单动态字符串结构(SDS)内存地址不同,所以最开始⽣成String对象的时候,分配内存的次数也不同,由于EmbStr的RedisObject对象和SDS对象是连续的,所以⼀起分配内存就⾏,但是raw需要两次内存分配
List

特征:为有序,可重复列表。每个List类型可以插⼊(2的32次⽅)-1个元素
常使用业务场景:

  • 最新与最⽼数据的TOP显示——由于底层采⽤双向链表/压缩列表的⽅式进⾏存储均能获取头节点和尾节点指针,每个节点均有前后指针的关系,⾮常适合进⾏操作头部与尾部节点
  • 消息队列——即⽣产者可以使⽤Lpush⽅法往List类型的头部插⼊信息,然后消费者通过Lpop对List类型的尾部进⾏消费。

底层编码:

  • ZipList编码:
    • 数据结构特点:即⼀段连续的内存数组,但是和普通的数组不同,他的每⼀个元素空间都是根据其中存储的元素⼤⼩来规定的,并不是死板的固定⼤⼩,并有记录当前最后⼀个元素位置的指针
    • 使⽤要求:即当每⼀个元素⼤⼩不超过64个字节,总元素个数不超过512个
    • 数据结构内存地址所在:作为RedisObject对象后的连续内存,所以⽣成List对象时,此编码只⽤分配⼀次内存
  • LinkedList编码:
    • 数据结构特点:就是双向链表
    • 使⽤要求:当不满⾜zipList编码要求的时候,就会变成LinkedList编码
    • 数据结构内存地址所在:不和RedisObject在⼀起,⽽是在内存中的任意位置
Hash

特征:每个Hash类型可以存放(2的32次⽅)-1个键值对
常使用业务场景:

  • 购物⻋的管理——使⽤⽤户id作为key值,⽤商品id作为field字段,⽤商品数量作为value,那么我们可以使⽤hgetAll指令完成购物⻋全选,hdel删除指定商品等等操作

底层编码:

  • ZipList编码:
    • 数据结构特点:和List类型采⽤此编码时运⽤不太⼀样,Hash类型会把field-value键值对连续的插⼊到压缩列表中,从⽽完成不同键值对的存储
    • 使⽤要求:即当每⼀个元素⼤⼩不超过64个字节,总元素个数不超过512个
    • 数据结构内存地址所在:作为RedisObject对象后的连续内存,所以⽣成List对象时,此编码只⽤分配⼀次内存
  • Hashtable编码:
    • 数据结构特点:底层为哈希表数据结构,⽤以存储field-value键值对
    • 使⽤要求:当不满⾜zipList编码要求的时候,就会变成Hashtable编码
Set

特征:为⽆序,⽽不可重复集合,可以存放(2的32次⽅)-1个元素
常使用业务场景:

  • 元素去重——即⼤量元素去重操作会占⽤⼤量CPU资源,那么把这些数据存储到Set类型中,即可完成去重操作
  • 共同好友等——把⼀个⽤户的好友和另⼀个⽤户的好友进⾏交集处理,得到他们的公同好友,然后进⾏推荐

底层编码:

  • inset编码:
    • 数据结构特点:即由整型数组组成的连续内存(此数组按元素⼤⼩进⾏排序),但是除了整形数组外,还有有当前数组包含的元素数量以及采⽤整形的编码,可分为int16,int32,int64.分别是整形数组中运⾏存放数值的⼤⼩
    • 使⽤要求:元素个数⼩于512个,⽽且集合内元素全为数字
    • 数据结构内存地址所在:和RedisObject相连的连续内存
  • HT编码:
    • 数据结构特点:由Value值为空的Hashtable结构组成,被称为字典。
    • 使⽤要求:当不满⾜inset编码要求的时候,就会变成HT编码
ZSet

特征:为有序,⽽不可重复集合,可以存放(2的32次⽅)-1个元素
常使用业务场景:

  • 热⻔数据TOP排⾏榜——利⽤Zset类型,有序不重复特点,把重复的数据进⾏去重并且使⽤score字段排序后,从⼩到⼤排序,反序即可得到热⻔数据TOPC排⾏榜

底层编码:

  • ZipList编码:
    • 数据结构特点:压缩列表的另⼀种使⽤,即使⽤⼀个新增的score字段来决定元素在压缩列表中的位置,默认从⼩到⼤
    • 使⽤要求:即当每⼀个元素⼤⼩不超过64个字节,压缩数组⻓度不能超过128个元素
    • 数据结构内存地址所在:和RedisObject相连的连续内存
  • skipList编码:
    • 数据结构特点:通过跳表与Hashtable的集合编码,利⽤跳表存储hash表中的节点来完成有序,操作主要还是在hash表中,跳表中的⼤⼩由Score字段来决定
    • 使⽤要求:当不满⾜zipList编码要求的时候,就会变成skipList编码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值