无语子之都2021年了你还只会MySQL吗?

要说现在企业中哪种类型数据库使用最为普遍,那么MySQL当仁不让的第一,但是无语子如果你除了MySQL就不知道其他的数据库,那么建议你好好看看本文章,臭宝儿。
🆗,摆好小板凳认真听讲了。
相信作为一个开发人员的你应该对MySQL这一企业常用数据库很了解了,但是为了照顾少部分人,我还是从MySQL开始进行一步步扩展,
首先MySQL数据库是使用关系型数据库管理系统(RDBMS)来存储和管理大数据量,也就是所谓了关系型数据库。而所谓的关系型数据库是建立在关系模型基础之上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
到现在估计有人已经开始吐槽了(🙄这都是啥跟啥,讲点有用的不行??)。
其实本身RDBMS是很空的一个东西,但是落实到RDBMS的常见术语上就很清楚很多。比如
·数据库:数据库是一些关联表的集合
·数据表:表示数据的矩阵,在一个数据库中的表看起来像一个简单的电子表格
·列:一列(数据元素)包含了相同类型的数据,例如邮政编码的数据
·行:一行(元组,或记录)是一组相关的数据,例如用户订阅的数据
·冗余:存储多次数据,容器降低性能,但是提高数据安全性
·主键:主键是唯一的,一个数据表只能包含一个主键,可以用主键来查询数据
·外键:外键用于关联两个表
·复合键:复合键(组合键)用于将多列作为一个索引建
·索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或者多列的值进行排序的一种结构。类似于书籍的目录
·参照完整性:参照的完整性要求关系中不允许引用不存在的实体。与实体的完整性是关系模型必须满足的完整性约束条件,目的是保证数据一致性。


同时,关系型数据库需要遵守ACID原则(事务的原则),就不再赘述,如果不清楚可以👇🔗
https://www.jianshu.com/p/233a69ddc667
如果看了链接还是不太了解的话,建议看一下高性能MySQL这本书(就是有点厚)
扯了这么久的MySQL,现在回到正题。
除了MySQL这一数据库以外还有同属关系型数据库大家庭的MarriaDB、Oracle和SQL Server等等
下边是关系型数据库使用热度的前十位:
https://db-engines.com/en/ranking/relational+dbms
在这里插入图片描述
另外一大类数据库为NoSQL类型数据库–非关系型数据库。这一类型数据库常用于超大规模数据的存储,这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

RDBMSNoSQL
高度组织化结构化数据,结构化查询语言,数据和关系都存储在单独的表中,数据操纵语言,数据定义语言,严格的一致性,基础事务不仅仅是SQL,没有声明性查询语言,没有预定义的模式,键值对存储,列存储,文档存储,图形存储,最终一致性,而非ACID属性,非结构化和不可预知的数据,CAP定理,高性能,高可用,可伸缩性

扯了这么多也得知道有哪些才行是不是,接着看:
·首先是KV结构(常见的不能再常见的Redis)
在这里插入图片描述
·其次是文档结构存储(常见的不能再常见的MongoDB)
在这里插入图片描述
·再说最后一种你可能会遇到的(主要是其他的可能也就用不上了)图存储(常见的不能再常见的Neo4j)
在这里插入图片描述


作为一个有责任心的博主,肯定不能这么草草了之,最起码得带你们入个🚪。快上🚗,带你们从KV高速入?
说起KV类型的数据库,那就不得不提一下王霸之主-Redis了。在解决提高程序查询性能方面是一顶一的高手,首先先来看一下官方介绍

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions, and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
You can run atomic operations on these types, like appending to a string; incrementing the value in a hash; pushing an element to a list; computing set intersection, union and difference; or getting the member with highest ranking in a sorted set.
To achieve top performance, Redis works with an in-memory dataset. Depending on your use case, you can persist your data either by periodically dumping the dataset to disk or by appending each command to a disk-based log. You can also disable persistence if you just need a feature-rich, networked, in-memory cache.
Redis also supports asynchronous replication, with very fast non-blocking first synchronization, auto-reconnection with partial resynchronization on net split.

大概是这个意思:Redis是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如:字符串(String),散列(hash),列表(list),集合(set),有序集合(Sorted set)与范围查询,bitmaps,hyperloglogs和地理空间(geospatial)索引半径查询并且支持流。Redis内置了复制,Lua脚本,LRU驱动事件,事务和不同级别的持久化方案,并通过哨兵和自动分区提供高可用性。
你可以在添加字符串,增加hash值,插入元素到list集合,计算set集合交、并、差集,或者获取排序集中排名最高的成员时进行原子操作。
为了实现更好的性能,Redis运行在内存集合。根据你的redis配置,可以通过定期将数据集转储到磁盘或将每个命令附加到基于磁盘的日志来持久化数据。如果只需要一个功能丰富、联网的内存缓存,还可以禁用持久性。
最后,Redis还支持异步复制,具有非常快速的非阻塞第一次同步、自动重新连接和网络拆分上的部分重新同步。
在这里插入图片描述

现在会不会有人在🈲我了,这都是啥跟啥啊?从哪看出来是KV的啊,净整些没用的凑字数。你是大哥,听小弟慢慢讲来。
KVkey-value的缩写,所以KV数据库是一种以键值对(key是键,value是值,横杠代表这是一对,别跟我抬杠)存储数据的一种数据库。
你写代码肯定有用过Map结构吧,他就是用的KV结构,每一个键会对应一个唯一的值。同样Redis就是类似于Map的一种结构(好好了解一下,面试的时候没准哪个面试官就让你用map实现redis缓存了呢?),使用KV进行存储,K你可以理解成搜索条件,V就是常被搜索的热点数据。
入门就要一点点的入,先从搭建实例开始吧(都说了是数据库,肯定和其他的数据库没啥差别,要搭建)
为了适配大多数人没有自己服务器的现状,就先用💻搭建一下吧。
先简简单单下载个安装包
https://github.com/tporadowski/redis/releases
自己电脑是32位的就下载32位的,是64位的就下载64位的,别瞎下,到时候再不能用了,另外下载稳定版本,请记住Release
在这里插入图片描述
下载完之后,解压缩(不用我教你吧),解压缩完之后就是下面的鬼样子
在这里插入图片描述
到了这一步,就结束了(因为你也不做其他的配置,只是简单使用,后续涉及到的配置文件的调整我会单独出一篇来讲)。
现在请双击redis-server.exe,然后再双击redis-cli.exe,为什么要先双击redis-server.exe,再双击redis-cli.exe呢?因为不起服务端,怎么用客户端呀,瓜娃子。
双击之后就变成了下面的样子
在这里插入图片描述
那么接下来就来使用一下吧,会穿插有这一类型对象的编码(实现原理),所以认真看。

服务器在执行某些命令之前,会先检查给定键的类型能否执行指定的命令,而检查一个键的类型就是检查键的值对象类型

每次当我们在Redis数据库中新创建一个键值对的时候,我们都会至少创建两个对象,一个对象作为键值对的键(键对象),另一个作为键值对的值(值对象)。
Redis中的每一个对象都由一个redisObject结构表示

typedef struct redisObject {
	// 类型
	unsigned type : 4;
	// 编码
	unsigned encoding : 4;
	// 指向底层实现数据结构的指针
	void *ptr;
}robj;

对象的ptr指针指向对象的底层实现数据结构,而这些数据结构由对象的encoding属性决定。
上边我们有知道Redis支持的基本数据类型有:String,list,hash,set,sorted set(zset)。可以对一个数据库键执行TYPE命令,其返回的结构就是这个键所对应的值的类型。
在这里插入图片描述
** 先来看看字符串对象 **
在这里插入图片描述
字符串对象的编码可以是int、raw或者embstr

如果一个字符串对象保存的是整数类型,并且这个整数值可以用long类型来表示,那么字符串对象会将整个整数值保存在字符串对象的ptr属性里边(将void*转换成long),并且将字符串对象的编码设置成int

在这里插入图片描述
如果字符串对象保存的是一个字符串值,并且这个字符串值得长度大于32字节,那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值,并将对象的编码设置为raw,如下:
在这里插入图片描述
当你的字符串值长度小于等于32字节的时候,存储结构就是embstr类型了,如下:
在这里插入图片描述
embstr编码是保存短字符串的一种优化编码方式,这种编码和raw编码一样,都使用redisObject结构和sdshdr结构来表示字符串对象,但是raw编码会调用两次内存分配函数来分别创建redisObject结构和sdshdr结构,而embstr编码则通过调用一次内存分配函数来分配一块连续的空间,空间中依次包含redisObject和sdshdr两个结构。
** 再来看看列表对象 **
在这里插入图片描述
列表对象的编码可以是ziplist和linkedlist
ziplist编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点(entry)保存了一个列表元素。
当列表对象可以同时满足一下两个条件时,列表对象使用ziplist
·列表对象保存的所有字符串元素的长度都小于64字节
·列表对象保存的元素数量小于512个,不能满足这两个条件的列表对象都需要使用linkedlist
注意:在3.2版本以后就引入了quicklist,转换交给quicklist编码来进行
在这里插入图片描述
** 接下来是哈希对象 **
在这里插入图片描述
哈希对象编码是ziplist和hashtable两种
在这里插入图片描述
当哈希对象满足:1、保存的所有键值对的键和值的字符串长度都小于64字节 2、哈希对象保存的键值对数量小于512个的时候编码格式为ziplist
不满足上述条件的,会使用hashtable编码来进行存储
在这里插入图片描述
** 集合对象来了 **
在这里插入图片描述
集合对象的编码可以是intset或者hashtable。intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。
当集合对象满足:1、集合对象保存的所有元素都是整数值 2、集合对象保存的元素数量不超过512个的时候使用intset编码,其他情况都是hashtable编码方式
在这里插入图片描述
** 最后的有序集合缓缓道来 **
在这里插入图片描述
有序集合的编码可以是ziplist或者skiplist。ziplist编码的压缩列表对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员(member),而第二个元素则保存元素的分值(score)。压缩列表内的集合元素按分值从小到大进行排序,分值较小的元素被放置在靠近表头的方向,而分值较大的元素则被放置在靠近表尾的方向。
当有序集合保存的元素数量小于128个或者有序集合保存的所有元素成员的长度都小于64字节的时候会使用ziplist编码,其余情况是skiplist编码


上边简单说了一下在shell界面下的一个简单使用,在写代码的时候肯定不能写shell命令对吧,redis官方也很体贴的为我们提供了api来操作,那个后边来专门讲。


接下来我想考一下大家,上边大家也都能看到,就是一直往redis中add,push。redis是基于内存的,那么就这么一直往里边添加能行吗?

傻子都知道肯定不行,如果这么干机器不得爆了啊。所以比不可少的就是对内存进行回收。

有过C语言开发的应该都知道C语言不具备内存回收的功能,所以redis在自己的对象系统中构建了一个引用计数(reference couting)技术实现的内存回收机制,通过这一机制,程序可以通过跟踪兑现的引用计数信息,在适当的时候自动释放对象并进行内存回收。
·在创建一个新对象时,引用计数的值会被初始化为1;
·当对象被一个新程序使用时,它的引用计数值会被增1
·当对象不再被一个程序使用时,它的引用计数值会被减1
·当对象的引用计数值变为0时,对象所占用的内存会被释放。
除此之外,在使用redis时可以通过对键设置过期时间的方式来保证内存空间的一个回收。
Redis过期键删除有两种策略:
访问数据库键时,校验是否过期,如果过期则删除
周期性删除过期键


今天就先写到这里吧,有点浅薄,后续深入。明天就是清明小假期了,大家应该也都回家吧,注意安全啊。我们节后见…

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

new_repo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值