nosql

公共基础

一、NoSQL概述

1、NoSQL

NoSQL定义:

非关系型、分布式、开放源码和具有横向扩展能力的下一代数据库。NOSQL==“Not Only SQL”。

2 数据库的分类
1、TRDB数据库

传统关系型数据库:基于单机集中管理数据理念,传统关系型数据库建立在集中的数据库管理系统上

TRDB数据库特点:

使用强存储模式技术;采用SQL技术标准定义和操作数据库;采用强事务保证可用性以及安全;采用单机集中处理方式

2、NoSQL数据库

一般NoSQL技术从数据存储结构原理分为:

键值存储:

特点:通过唯一的键值对组织数据,适用于快速存取和简单数据模型。 ​ 代表产品:Redis,Cassandra,Riak,DynamoDB。 ​ 列族存储:

特点:数据被组织成列族,每个列族包含多个列,适用于大规模数据和高吞吐量。 ​ 代表产品: HBase,Cassandra。 ​ 文档存储:

特点:数据以文档的形式存储,文档可以是自包含的、具有层次结构的文档或键值对。 ​ 代表产品:MongoDB,Couchbase,RavenDB。 ​ 图形数据库(Graph Databases):

特点:以图的形式存储数据,适用于复杂的关系和图状结构查询。 ​ 代表产品:Neo4j,OrientDB,ArangoDB。

NoSQL数据库特点:

使用弱存储模式技术;无SQL技术标准定义和操作数据库;采用弱事务保证可用性;主要采用多机分布式处理方式。

基于大数据应用产生的新技术

3、NewSQL数据库

结合传统关系型数据库与Nosql数据库技术的优点,实现大数据环境下的数据存储和处理。

二、数据库存储架构分类

1、单机架构

优点:集中部署、便于运维

缺点: 单机只能纵向扩展,可扩展性差;存在单点故障,出现故障会停机

2、主备架构

数据库部署在两台服务器上,主机负责数据读写,备机利用数据同步进行数据同步,保证数据一致。

优点:有一定的低于故障的能力;提升了数据的容错性

缺点:资源浪费,无故障只使用主机;性能压力集中在主机;故障时需要人工干预

3、主从架构

通过读写分离模式分散服务压力,主机负责写操作,从机负责数据查询服务

优点:提升资源利用率,适合读多写少场景;在大并发的场景,可以使用负载均衡在多个从机之间;从机扩展灵活,扩容操作不影响业务

缺点:延迟问题,数据同步到从机数据库时存在延迟,存在暂时性的数据不一致;写操作的性能压力在主机;主机故障是需要主从切换,人工干预需要响应时间,自动切换复杂度高

4、多主架构

数据库服务器互为主从,同时对外提供完整的数据服务

优点:资源利用率高;降低单点故障的风险

缺点:双主机都接受写数据,要实现数据双向同步,双向复制会带来延迟问题,极端情况有可能数据丢失

5、分片架构

水平数据分片架构,把数据分散在多个节点上分片方案,每个片包括数据库一部分

优点:

数据分散在集群的各个节点上,所有节点可以独立性工作;提升数据库写性能,降低单库数据容量

三、MongDB

1、MongoDB概述

由c++编写的开源、高性能、无模式的基于分布式文件存储的文档型数据库

特点:

高性能、高可用性、高扩展性、丰富的查询支持、可替换已完场文档某个指定的数据字段

应用场景:

社交场景:使用mongodb存储用户信息

游戏场景:用户信息,装备积分

物流场景:订单信息,订单状态

视频直播场景:点赞互动信息

场景操作特点:数据量大;读写操作频繁;价值较低的数据,对事物性要求不高

2、MongoDB增删改查

集合命名规则:

不能是空字符串;不能含有$、 \0 ;不能以system开头;用“.”来组织子集合

集合操作:

创建集合 :

(1)指定创建

db.createCllection("name1")

db.createCllection("cn",{"capped":true,"size":1000})

(2)默认创建(向不存在的集合里插入文档)

db.names.insert({"name":"zs","age":20})

查看集合

(1)show table

(2)show collections

(3)db.getCollectionNames()

(4)db.collections.stats()

删除集合:dorp()

db.collections.drop()

文档操作

插入

1、insert()、 insert({},{},{})

db.name.insert({"name":"zhangsan"},{"age":20})

2、insertOne()

db.name.insertOne({"name":"wangwu"})

3、insertMany([{},{},{},{}])

4、v=({"name":"xiaobai","age":5})

查询

(1)、无条件查询

db.name.find()

(2)、带条件查询

< :lt <=:lte >: gt >=: gte !=: ne

格式:db.col.find({"age":{$lt:30}}).pretty() 年龄小于30

db.col.find({"age":{$gt18,$lt20}}) 大于18,小于20的人

(3)、AND条件

db.col.find({key1:value1, key2:value2})

(4)、OR条件

db.col.find({$or:[{key1:value1}, {key2:value2}]})

(5)、AND与OR

db.col.find({key1:value1,$or:[{key:value2},{key3:values3}]})

(6)、投影查询

db.col.find({},{"name":1,"_id":0}) id不被获取

db.col.find({},{"name":1,"_id":0}) id被获取

在_id字段为0时候,其他字段可以为1

在_id为1的时候,其他字段必须为1;

排序

sort(): 1为升序,-1为降序

db.col.find({},{age:1,_id:0}).sort{age:-1} 按照年龄降序排序

db.col.find({},{age:1,_id:0}).sort{age:-1,num:1}按照年龄降序,年龄相同按照num升序

修改

db.col.update(参数1,参数2,参数3)

参数1:query查询条件

参数2:更新对象

db.col.update({k1:v1},{"$set":{k2:v2}})

$set:字段存在修改,不存在添加

3、MongoDB索引

db.name.createIndex({"name":1})

1:升序,-1:降序

1、索引种类

(1)单字段索引

在集合同键上不能重复创建索引,新插入文档name值不能相同,集合存在相同name不能创建索引

嵌套文档单字段索引

db.name.insert({tage:{pres:"123",call:"123"}})

db.name.createIndex({"tage.press":1})

(2)、复合索引

交叉索引

查询的时候通过多个字段索引查询,查询多个字段使用复合索引,最终结果做交集

先按照第一个字段排序,第一个字段相同按照第二个字段排序

db.name.createIndex({key:1,key2:1})

(3)、hash索引

哈希索引使用索引字段值的哈希值维护缩影条目,哈希索引可以用作哈希分片键 来对数据分片,基于哈希的分片将字段的索引用作 分片键,以跨分片群集对数据进行分区

db.name.createIndex({name:"hashed"})

(4)、文本索引

字符串内容上创建执行文件的查询操作,为了执行文件检索查询,必需在集合上有一个text索引,一个集合只能拥有一个文本索 引,文本索引可以覆盖多个字段,索引操作符text index ,$text

db.name.createIndex({name:"text",description:"text"})

db.name.find({$text:{$search:"java coffee shop"}})

2、查看索引

db.name.getIndexes()

db.name.getIndexKeys()

3、查看索引大小

db.name.totallndexSize()

4、删除索引

db.name.droplndex("name_index")

5、重建索引

db.name.reIndex()

6、索引限制

额外开销

每个索引会占据一定的存储空间,在进行增删改查操作的时候需要对索引进行操作

内存使用

由于索引会存储在内存中,确保索引大小不超过内存限制

查询限制

索引不能被正则表达式及非操作符:$nin,$ not使用

集合索引不能超过64个;索引名长度不能超过128个字符;一个复合索引最多可以有31个字段。

4、MongoDB 集群

1、mongdb集群

复制集:保证数据安全性和可用性

分片:实现数据海量存储

四、redis

1、Redis概述

开源、c语言编写、默认端口号6379、key-value形式存在,存储非结构化数据

基本特征:

1、键值性;2、单线程;3、低延迟,速度快;4、支持数据持久化;5、支持主从模式,哨兵模式,分片集群;6、支持多语言客户端;

Redis主从模式特点:

  1. 数据复制:主节点(Master)将数据复制到一个或多个从节点(Slaves)。主节点负责写入操作,而从节点负责读取操作。通过数据复制,从节点可以保持与主节点相同的数据副本,以提供读取操作的性能和可用性。

  2. 故障转移:当主节点发生故障或不可用时,从节点可以自动选举一个新的主节点,以保持系统的可用性。故障转移通常是通过Redis哨兵(Sentinel)或集群管理器实现的。

  3. 扩展性:Redis主从模式可以通过添加更多的从节点来扩展读取性能和容量。从节点可以分担主节点的读取负载,从而提高系统的扩展性。

  4. 可靠性和备份:通过将数据复制到多个从节点,Redis主从模式提供了数据的冗余备份。即使主节点发生故障,从节点可以提供持续的读取服务,并且在主节点恢复后可以重新进行同步。

  5. 数据一致性:Redis主从模式提供了异步复制,默认情况下从节点与主节点之间的复制是异步的。这意味着从节点可能会有一些延迟,并且在复制期间可能会发生数据丢失的情况。但通过配置Redis的持久化机制和复制选项,可以提高数据的一致性和容错性。

2、Redis基本数据结构
(1)String

string类型的值最大能存储512MB

应用场景:

1、数字计数:如贴子点赞数

2、存储对象:以json形式存储

命令含义
Set key value [EX PX NX XX]EX:到期时间为秒,PX:到期时间为毫秒,NX:键不存在,创建键名,XX:键存在才设置值
Mset多建设置值 mset set1 "aa" set2 "bb"
MsetNX当多个键中有一个键存在不执行 MsetNX set1 "cec" set3 "ccd"
Get key返回指定键的值,不存在键返回 nil
MGet key1 key2指定多个键
Del key删除key
StrLen key获取键的值长度
Append key vlaue存在key追加,不存在key创建
GetRange key start end返回指定范围的字符串子集
GetSet key vlaue返回旧的值,设置新的值
SetRange key start vlaue在start位置设置vlaue
Decr 、DecrBy 、Incr 、IncrBy 、IncrByFloat-1、-n、+1、 +n 、+n.0
(2)list

list类型:key不可重复,value可重复,链表实现,插入顺序排列,读写从两头开始

应用场景:

1、微信朋友圈点赞

2、新浪微博、腾讯微博个人用户的关注列表,粉丝列表

3、新闻、资讯类网站,最新按照发生的时间顺序展示列表

序号命令及描述
Blpop key1 [key2 ] timeout移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
Brpopkey1 [key2 ] timeout移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
BrpopLpush source destination timeout从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
Lindex key index通过索引获取列表中的元素
Linsert key BEFORE|AFTER pivot value在列表的元素前或者后插入元素
Llen key获取列表长度
Lpop key移出并获取列表的第一个元素
Lpush key value1 [value2]将一个或多个值插入到列表头部
Lpushx key value将一个值插入到已存在的列表头部
Lrange key start stop获取列表指定范围内的元素
Lrem key count value移除列表元素
Lset key index value通过索引设置列表元素的值
Ltrim key start stop对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
Rpop key移除列表的最后一个元素,返回值为移除的元素。
RpopLpush source destination移除列表的最后一个元素,并将该元素添加到另一个列表并返回
Rpush key value1 [value2]在列表中添加一个或多个值到列表尾部
Rpushx key value为已存在的列表添加值
(3)hash

存储对个键值对,无序,键名不应太长,适合小规模数据对象存储,每个hash可以存储2的32次方-1个键值对,占用更小空间,更加节省内存空间

应用场景:

1、购物车

2、存储对象hash类型的结构与对象的结构相似对象

序号命令及描述
HDEL key field1 field2删除一个或多个哈希表字段
HEXISTS key field查看哈希表 key 中,指定的字段是否存在。
HGET key field获取存储在哈希表中指定字段的值。
HGETALL key获取在哈希表中指定 key 的所有字段和值
HINCRBY key field increment为哈希表 key 中的指定字段的整数值加上增量 increment 。
HINCRBYFLOAT key field increment为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
HKEYS key获取哈希表中的所有字段
HLEN key获取哈希表中字段的数量
HMGET key field1获取所有给定字段的值
HMSET key field1 value1 field2 value2同时将多个 field-value (域-值)对设置到哈希表 key 中。
HSET key field value将哈希表 key 中的字段 field 的值设为 value 。
HSETNX key field value只有在字段 field 不存在时,设置哈希表字段的值。
HVALS key获取哈希表中所有值。
HSCAN key cursor [MATCH pattern] [COUNT count]迭代哈希表中的键值对。
(4)set

value不重复,value无序,读写任意,set元素最大可以包括2的32次方-1个元素

应用场景:

1、抽奖,提供一个随机元素的操作

2、点赞、签到、打卡、每个用户只能点赞、签到或打卡一次。

命令功能
Sadd添加一个或多个元素到集合中
SMembers返回集合所有元素
Srem删除集合中指定的元素
scard返回集合元素数量
srandMember从集合中随机返回一个或多个元素
smove把一个集合的元素移动到另一个集合中
spop从集合中随机返回(并删除)一个或多个元素
slsMember集合成员是否存在判断
Ssan增量迭代式返回集合元素
(5)Zset

value不能重复,每个value会关联一个分数值,通过分数数值大小对value从小到大排序,插入顺序无关

应用场景:

1、排行榜

序号命令及描述
Zadd key score1 member1向有序集合添加一个或多个成员,或者更新已存在成员的分数
Zcard key获取有序集合的成员数
Zcount key min max计算在有序集合中指定区间分数的成员数
Zincrby key increment member有序集合中对指定成员的分数加上增量 incremen
Zinterstore destination numkeys key计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination
Zrange key start stop [WITHSCORES]通过索引区间返回有序集合指定区间内的成员
Zrangebylex key min max [LIMIT offset count]通过字典区间返回有序集合的成员
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]通过分数返回有序集合指定区间内的成员
ZRANK key member返回有序集合中指定成员的索引
ZREM key member [member ...]移除有序集合中的一个或多个成员ZREMRANGEBYLEX key min max
ZREMRANGEBYLEX key min max移除有序集合中给定的字典区间的所有成员
ZREMRANGEBYRANK key start stop移除有序集合中给定的排名区间的所有成员
ZREMRANGEBYSCORE key min max移除有序集合中给定的分数区间的所有成员
ZREVRANGE key start stop [WITHSCORES]返回有序集中指定区间内的成员,通过索引,分数从高到低
ZREVRANGEBYSCORE key max min [WITHSCORES]返回有序集中指定分数区间内的成员,分数从高到低排序
ZREVRANK key member返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
ZSCORE key member返回有序集中,成员的分数值
ZUNIONSTORE destination numkeys key [key ...]计算给定的一个或多个有序集的并集,并存储在新的 key 中
ZSCAN key cursor [MATCH pattern] [COUNT count]迭代有序集合中的元素(包括元素成员和元素分值)

五、消息队列及Redis集群

1、消息队列

Publish 发布消息到指定频道

Subscribe 订阅频道信息

A卷

简答题

一、redis特点

键值型

单线程

低延迟速度快

支持数据持久化

支持主从,哨兵、分片

支持多语言客户端

二、字符串命令
命令含义
Set key value [EX PX NX XX]EX:到期时间为秒,PX:到期时间为毫秒,NX:键不存在,创建键名,XX:键存在才设置值
Mset多建设置值 mset set1 "aa" set2 "bb"
MsetNX当多个键中有一个键存在不执行 MsetNX set1 "cec" set3 "ccd"
Get key返回指定键的值,不存在键返回 nil
MGet key1 key2指定多个键
Del key删除key
StrLen key获取键的值长度
Append key vlaue存在key追加,不存在key创建
GetRange key start end返回指定范围的字符串子集
GetSet key vlaue返回旧的值,设置新的值
SetRange key start vlaue在start位置设置vlaue
Decr 、DecrBy 、Incr 、IncrBy 、IncrByFloat-1、-n、+1、 +n 、+n.0
三、mongdb索引
mongodb的索引,为什么要建立索引,查询时有无索引的区别

MongoDB建立索引的主要目的是为了提高查询性能和数据访问效率

有索引和没有索引的区别:

  1. 当没有建立索引时:MongoDB读取数据时,必须扫描集合中的所有我能当记录。这种全集扫描的效率非常低。

  2. 建立索引::MongoDB读取数据时,将扫描索引内容,而不会去扫描对应的集合。提高了查询的效率。

B卷

一、redis无序集合

基本操作(难:扫描集合扫描以Z开头的集合,一次扫描个数为2 SSCAN setName 0 MATCH Z* COUNT 2

命令功能
Sadd添加一个或多个元素到集合中
SMembers返回集合所有元素
Srem删除集合中指定的元素
scard返回集合元素数量
srandMember从集合中随机返回一个或多个元素
smove把一个集合的元素移动到另一个集合中
spop从集合中随机返回(并删除)一个或多个元素
slsMember集合成员是否存在判断
Ssan增量迭代式返回集合元素
二、redis五种基本类型应用场景
  1. 字符串(string):适用于缓存、计数器、分布式锁等场景。例如,可以将用户的个人信息存储为一个字符串。

  2. 哈希(hash):适用于存储对象,每个对象可以包含多个字段。例如,可以将用户的详细信息存储为一个哈希。

  3. 列表(list):适用于消息队列、最新消息列表等场景。例如,可以将用户发表的消息存储为一个列表。

  4. 集合(set):适用于去重、共同好友等场景。例如,可以将用户的好友列表存储为一个集合。

  5. 有序集合(sorted set):适用于排行榜、热门文章等场景。例如,可以将文章的热度值存储为一个有序集合。

三、mongodb 分片与复制集的作用

1、分片:

用于处理海量数据的存储和处理。通过将数据分布在多个节点上,可以提高数据的存储能力和处理性能。分布集群还可以提供高可用性和容错能力,即使某个节点发生故障,系统仍然可以正常运行。

2、复制集:

在多个节点上保存数据的副本来提供故障恢复和容灾能力。复制集由一个主节点和多个从节点组成,主节点负责处理所有的写操作,并将写操作同步到从节点上。当主节点发生故障时,从节点可以自动选举一个新的主节点,确保系统的连续性和可用性。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值