Day38.NoSQL数据库入门

NoSQL 与 SQL 的区别 业界为了解决上面提到的几个需求,推出了多款新类型的数据库,在设计上,它们非常关注对数据高并发地读写和对海量数据的存储等,与关系型数据库相比,它们在架构和数据模型方量面做了“减法”,而在扩展和并发等方面做了“加法”。海量数据的存储如果选用大型商用数据,如Oracle,那么整个解决方案的成本是非常高的,要花很多钱在软硬件上。其实NoSQL数据库仅仅是关系数据库在某些方面(性能,扩展)的一个弥补,单从功能上讲,NoSQL的几乎所有的功能,在关系数据库上都能够满足,所以选择NoSQL的原因并不在功能上。 阅读详情

NoSQL数据库入门



前言

本文主要是展示了NoSQL数据库的简单介绍以及两个例子


一. NoSQL入门

NoSQL概述

如今,大多数的计算机系统(包括服务器、PC、移动设备等)都会产生庞大的数据量。其实,早在2012年的时候,全世界每天产生的数据量就达到了2.5EB(艾字节, 1 E B ≈ 1 0 18 B 1EB\approx10^{18}B 1EB≈1018B)。这些数据有很大一部分是由关系型数据库来存储和管理的。 早在1970年,E.F.Codd发表了论述关系型数据库的著名论文“A relational model of data for large shared data banks”,这篇文章奠定了关系型数据库的基础并在接下来的数十年时间内产生了深远的影响。实践证明,关系型数据库是实现数据持久化最为重要的方式,它也是大多数应用在选择持久化方案时的首选技术。

NoSQL是一项全新的数据库革命性运动,虽然它的历史可以追溯到1998年,但是NoSQL真正深入人心并得到广泛的应用是在进入大数据时候以后,业界普遍认为NoSQL是更适合大数据存储的技术方案,这才使得NoSQL的发展达到了前所未有的高度。2012年《纽约时报》的一篇专栏中写到,大数据时代已经降临,在商业、经济及其他领域中,决策将不再基于经验和直觉而是基于数据和分析而作出。事实上,在天文学、气象学、基因组学、生物学、社会学、互联网搜索引擎、金融、医疗、社交网络、电子商务等诸多领域,由于数据过于密集和庞大,在数据的分析和处理上也遇到了前所未有的限制和阻碍,这一切都使得对大数据处理技术的研究被提升到了新的高度,也使得各种NoSQL的技术方案进入到了公众的视野。

NoSQL数据库按照其存储类型可以大致分为以下几类:

类型部分代表特点
列族数据库HBase
Cassandra
Hypertable
顾名思义是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的I/O优势,适合于批量数据处理和即时查询。
文档数据库MongoDB
CouchDB
ElasticSearch
文档数据库一般用类JSON格式存储数据,存储的内容是文档型的。这样也就有机会对某些字段建立索引,实现关系数据库的某些功能,但不提供对参照完整性和分布事务的支持。
KV数据库DynamoDB
Redis
LevelDB
可以通过key快速查询到其value,有基于内存和基于磁盘两种实现方案。
图数据库Neo4J
FlockDB
JanusGraph
使用图结构进行语义查询的数据库,它使用节点、边和属性来表示和存储数据。图数据库从设计上,就可以简单快速的检索难以在关系系统中建模的复杂层次结构。
对象数据库db4o
Versant
通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。

说明:想了解更多的NoSQL数据库,可以访问http://nosql-database.org/。

二. Redis非关系型数据库

2.1 Redis概述

Redis是一种基于键值对的NoSQL数据库,它提供了对多种数据类型(字符串、哈希、列表、集合、有序集合、位图等)的支持,能够满足很多应用场景的需求。Redis将数据放在内存中,因此读写性能是非常惊人的。与此同时,Redis也提供了持久化机制,能够将内存中的数据保存到硬盘上,在发生意外状况时数据也不会丢掉。此外,Redis还支持键过期、地理信息运算、发布订阅、事务、管道、Lua脚本扩展等功能,总而言之,Redis的功能和性能都非常强大,如果项目中要实现高速缓存和消息队列这样的服务,直接交给Redis就可以了。目前,国内外很多著名的企业和商业项目都使用了Redis,包括:Twitter、Github、StackOverflow、新浪微博、百度、优酷土豆、美团、小米、唯品会等。

2.2 Redis简介

2008年,一个名为Salvatore Sanfilippo的程序员为他开发的LLOOGG项目定制了专属的数据库(因为之前他无论怎样优化MySQL,系统性能已经无法再提升了),这项工作的成果就是Redis的初始版本。后来他将Redis的代码放到了全球最大的代码托管平台Github,从那以后,Redis引发了大量开发者的好评和关注,继而有数百人参与了Redis的开发和维护,这使得Redis的功能越来越强大和性能越来越好。

Redis是REmote DIctionary Server的缩写,它是一个用ANSI C编写的高性能的key-value存储系统,与其他的key-value存储系统相比,Redis有以下一些特点(也是优点):

  • Redis的读写性能极高,并且有丰富的特性(发布/订阅、事务、通知等)。
  • Redis支持数据的持久化(RDB和AOF两种方式),可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis支持多种数据类型,包括:string、hash、list、set,zset、bitmap、hyperloglog等。
  • Redis支持主从复制(实现读写分析)以及哨兵模式(监控master是否宕机并自动调整配置)。
  • Redis支持分布式集群,可以很容易的通过水平扩展来提升系统的整体性能。
  • Redis基于TCP提供的可靠传输服务进行通信,很多编程语言都提供了Redis客户端支持。

2.3 Redis的应用场景

  1. 高速缓存 - 将不常变化但又经常被访问的热点数据放到Redis数据库中,可以大大降低关系型数据库的压力,从而提升系统的响应性能。
  2. 排行榜 - 很多网站都有排行榜功能,利用Redis中的列表和有序集合可以非常方便的构造各种排行榜系统。
  3. 商品秒杀/投票点赞 - Redis提供了对计数操作的支持,网站上常见的秒杀、点赞等功能都可以利用Redis的计数器通过+1或-1的操作来实现,从而避免了使用关系型数据的update操作。
  4. 分布式锁 - 利用Redis可以跨多台服务器实现分布式锁(类似于线程锁,但是能够被多台机器上的多个线程或进程共享)的功能,用于实现一个阻塞式操作。
  5. 消息队列 - 消息队列和高速缓存一样,是一个大型网站不可缺少的基础服务,可以实现业务解耦和非实时业务削峰等特性,这些我们都会在后面的项目中为大家展示。

2.4 Redis的安装和配置

可以使用Linux系统的包管理工具(如yum)来安装Redis,也可以通过在Redis的官方网站下载Redis的源代码,解压缩解归档之后通过make工具对源代码进行构建并安装,在更新这篇文档时,Redis官方提供的最新稳定版本是Redis 5.0.10。
下载:

wget https://download.redis.io/releases/redis-5.0.10.tar.gz

解压缩和解归档:

tar -zxf redis-5.0.10.tar.gz

进入Redis源代码目录:

cd redis-5.0.10

构建和安装:

make && make install

在redis源代码目录下有一个名为redis.conf的配置文件,我们可以先查看一下该文件。

vim redis.conf

下面我们对Redis的配置文件进行一个扼要的介绍。

配置Redis服务的IP地址和端口:

在这里插入图片描述

配置底层有多少个数据库:

配置Redis的持久化机制 - RDB。

在这里插入图片描述
在这里插入图片描述

配置Redis的持久化机制 - AOF:

在这里插入图片描述

配置访问Redis服务器的口令:

在这里插入图片描述

配置Redis的主从复制(通过主从复制可以实现读写分离):

在这里插入图片描述

配置慢查询:

在这里插入图片描述

上面这些内容就是Redis的基本配置,如果你对上面的内容感到困惑也没有关系,先把Redis用起来再回头去推敲这些内容就行了。如果想找一些参考书,《Redis开发与运维》是一本不错的入门读物,而《Redis实战》是不错的进阶读物。

2.5 Redis的服务器和客户端

接下来启动Redis服务器,下面的方式将以默认的配置启动Redis服务。

redis-server

如果希望修改Redis的配置(如端口、认证口令、持久化方式等),可以通过下面两种方式。

方式一:通过参数指定认证口令和AOF持久化方式。

redis-server --requirepass yourpass --appendonly yes

方式二:通过指定的配置文件来修改Redis的配置。

redis-server /root/redis-5.0.10/redis.conf

下面我们使用第一种方式来启动Redis并将其置于后台运行,将Redis产生的输出重定向到名为redis.log的文件中。

redis-server --requirepass yourpass > redis.log &

可以通过ps或者netstat来检查Redis服务器是否启动成功。

ps -ef | grep redis-server
netstat -nap | grep redis-server

接下来,我们尝试用Redis命令行工具redis-cli去连接服务器,该工具默认连接本机的6379端口,如果需要指定Redis服务器和端口,可以使用-h和-p参数分别进行指定。

redis-cli

进入命令行工具后,就可以通过Redis的命令来操作Redis服务器,如下所示。

127.0.0.1:6379> auth yourpass
OK
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>

Redis有着非常丰富的数据类型,也有很多的命令来操作这些数据,具体的内容可以查看Redis命令参考,在这个网站上,除了Redis的命令参考,还有Redis的详细文档,其中包括了通知、事务、主从复制、持久化、哨兵、集群等内容。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-URKAbvAx-1618298725941)(./res/redis-data-types.png)]

说明:上面的插图来自付磊和张益军编著的《Redis开发与运维》一书。

127.0.0.1:6379> set username admin
OK
127.0.0.1:6379> get username
"admin"
127.0.0.1:6379> set password "123456" ex 300
OK
127.0.0.1:6379> get password
"123456"
127.0.0.1:6379> ttl username
(integer) -1
127.0.0.1:6379> ttl password
(integer) 286
127.0.0.1:6379> hset stu1 name hao
(integer) 0
127.0.0.1:6379> hset stu1 age 38
(integer) 1
127.0.0.1:6379> hset stu1 gender male
(integer) 1
127.0.0.1:6379> hgetall stu1
1) "name"
2) "hao"
3) "age"
4) "38"
5) "gender"
6) "male"
127.0.0.1:6379> hvals stu1
1) "hao"
2) "38"
3) "male"
127.0.0.1:6379> hmset stu2 name wang age 18 gender female tel 13566778899
OK
127.0.0.1:6379> hgetall stu2
1) "name"
2) "wang"
3) "age"
4) "18"
5) "gender"
6) "female"
7) "tel"
8) "13566778899"
127.0.0.1:6379> lpush nums 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lrange nums 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lpop nums
"5"
127.0.0.1:6379> lpop nums
"4"
127.0.0.1:6379> rpop nums
"1"
127.0.0.1:6379> rpop nums
"2"
127.0.0.1:6379> sadd fruits apple banana orange apple grape grape
(integer) 4
127.0.0.1:6379> scard fruits
(integer) 4
127.0.0.1:6379> smembers fruits
1) "grape"
2) "orange"
3) "banana"
4) "apple"
127.0.0.1:6379> sismember fruits apple
(integer) 1
127.0.0.1:6379> sismember fruits durian
(integer) 0
127.0.0.1:6379> sadd nums1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> sadd nums2 2 4 6 8
(integer) 4
127.0.0.1:6379> sinter nums1 nums2
1) "2"
2) "4"
127.0.0.1:6379> sunion nums1 nums2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "8"
127.0.0.1:6379> sdiff nums1 nums2
1) "1"
2) "3"
3) "5"
127.0.0.1:6379> zadd topsinger 5234 zhangxy 1978 chenyx 2235 zhoujl 3520 xuezq
(integer) 4
127.0.0.1:6379> zrange topsinger 0 -1 withscores
1) "chenyx"
2) "1978"
3) "zhoujl"
4) "2235"
5) "xuezq"
6) "3520"
7) "zhangxy"
8) "5234"
127.0.0.1:6379> zrevrange topsinger 0 -1
1) "zhangxy"
2) "xuezq"
3) "zhoujl"
4) "chenyx"
127.0.0.1:6379> zrevrank topsinger zhoujl
(integer) 2
127.0.0.1:6379> geoadd pois 116.39738549206541 39.90862689286386 tiananmen
(integer) 1
127.0.0.1:6379> geoadd pois 116.27172936413572 39.99135172904494 yiheyuan
(integer) 1
127.0.0.1:6379> geoadd pois 117.27766503308104 40.65332064313784 gubeishuizhen
(integer) 1
127.0.0.1:6379> geodist pois tiananmen gubeishuizhen km
"111.5333"
127.0.0.1:6379> geodist pois tiananmen yiheyuan km
"14.1230"
127.0.0.1:6379> georadius pois 116.86499108288572 40.40149669363615 50 km withdist
1) 1) "gubeishuizhen"
   2) "44.7408"

2.6 在Python程序中使用Redis

可以使用pip安装名为redis的三方库,该三方库的核心是一个名为Redis的类,Redis对象代表一个Redis客户端,通过该客户端可以向Redis服务器发送命令并获取执行的结果。上面我们在Redis客户端中使用的命令基本上就是Redis对象可以接收的消息,所以如果了解了Redis的命令就可以在Python中玩转Redis。

pip3 install redis

进入Python交互式环境,使用redis三方库来操作Redis。

>>> import redis
>>>
>>> client = redis.Redis(host='127.0.0.1', port=6379, password='yourpass')
>>>
>>> client.set('username', 'admin')
True
>>> client.hset('student', 'name', 'luohao')
1
>>> client.hset('student', 'age', 40)
1
>>> client.keys('*')
[b'username', b'student']
>>> client.get('username')
b'admin'
>>> client.hgetall('student')
{b'name': b'luohao', b'age': b'40'}

三. MongoDB概述

3.1 MongoDB简介

MongoDB是2009年问世的一个面向文档的数据库管理系统,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。虽然在划分类别的时候后,MongoDB被认为是NoSQL的产品,但是它更像一个介于关系数据库和非关系数据库之间的产品,在非关系数据库中它功能最丰富,最像关系数据库。

MongoDB将数据存储为一个文档,一个文档由一系列的“键值对”组成,其文档类似于JSON对象,但是MongoDB对JSON进行了二进制处理(能够更快的定位key和value),因此其文档的存储格式称为BSON。关于JSON和BSON的差别大家可以看看MongoDB官方网站的文章《JSON and BSON》。

目前,MongoDB已经提供了对Windows、macOS、Linux、Solaris等多个平台的支持,而且也提供了多种开发语言的驱动程序,Python当然是其中之一。

3.2 MongoDB的安装和启动

可以从MongoDB的官方下载链接下载MongoDB,官方提供了Windows、macOS和多种Linux版本的安装包。下面以CentOS为例,简单说一下如何安装和启动MongoDB。

下载服务器和命令行的RPM安装包。

wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.4/x86_64/RPMS/mongodb-org-server-4.4.2-1.el7.x86_64.rpm
rpm -ivh mongodb-org-server-4.4.2-1.el7.x86_64.rpm
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.4/x86_64/RPMS/mongodb-org-shell-4.4.2-1.el7.x86_64.rpm
rpm -ivh mongodb-org-shell-4.4.2-1.el7.x86_64.rpm

启动MongoDB服务器,需要先创建保存数据的文件夹。

mkdir -p /data/db

修改MongoDB的配置文件,将其中bindIp选项的值修改为本机IP地址而不是默认的127.0.0.1,本机IP地址可以通过ifconfig命令进行查看。

vim /etc/mongod.conf

使用systemctl命令启动服务。

systemctl start mongod

3.3 MongoDB基本概念

我们通过与关系型数据库的比较来说明MongoDB中的一些概念。

SQLMongoDB
databasedatabase
table(表)collection(集合)
row(行)document(文档)
column(列)field(字段)
indexindex
table joins(表连接)(嵌套文档)
primary keyprimary key

3.4 通过Shell操作MongoDB

  1. 启动命令行工具,进入交互式环境。

    mongo
    

    说明:

  2. 查看、创建和删除数据库。

    > // 显示所有数据库
    > show dbs
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    > // 创建并切换到school数据库
    > use school
    switched to db school
    > // 删除当前数据库
    > db.dropDatabase()
    { "ok" : 1 }
    
  3. 创建、删除和查看集合。

    > // 创建并切换到school数据库
    > use school
    switched to db school
    > // 创建colleges集合
    > db.createCollection('colleges')
    { "ok" : 1 }
    > // 创建students集合
    > db.createCollection('students')
    { "ok" : 1 }
    > // 查看所有集合
    > show collections
    colleges
    students
    > // 删除colleges集合
    > db.colleges.drop()
    true
    

    说明:在MongoDB中插入文档时如果集合不存在会自动创建集合,所以也可以按照下面的方式通过插入文档来创建集合。

  4. 文档的CRUD操作。

    > // 向students集合插入文档
    > db.students.insert({stuid: 1001, name: '小可爱', age: 20})
    WriteResult({ "nInserted" : 1 })
    > // 向students集合插入文档
    > db.students.save({stuid: 1002, name: '小盆友', tel: '18812345678', gender: '男'})
    WriteResult({ "nInserted" : 1 })
    > // 查看所有文档
    > db.students.find()
    { "_id" : ObjectId("5b13c72e006ad854460ee70b"), "stuid" : 1001, "name" : "小可爱", "age" : 38 }
    { "_id" : ObjectId("5b13c790006ad854460ee70c"), "stuid" : 1002, "name" : "小盆友", "tel" : "13012345678", "gender" : "男" }
    > // 更新stuid为1001的文档
    > db.students.update({stuid: 1001}, {'$set': {tel: '13566778899', gender: '男'}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > // 插入或更新stuid为1003的文档
    > db.students.update({stuid: 1003}, {'$set': {name: '李元芳', tel: '13022223333', gender: '男'}},  upsert=true)
    WriteResult({
            "nMatched" : 0,
            "nUpserted" : 1,
            "nModified" : 0,
            "_id" : ObjectId("5b13c92dd185894d7283efab")
    })
    > // 查询所有文档
    > db.students.find().pretty()
    {
            "_id" : ObjectId("5b13c72e006ad854460ee70b"),
            "stuid" : 1001,
            "name" : "小可爱",
            "age" : 30,
            "gender" : "男",
            "tel" : "13566778899"
    }
    {
            "_id" : ObjectId("5b13c790006ad854460ee70c"),
            "stuid" : 1002,
            "name" : "小可爱",
            "tel" : "18812345678",
            "gender" : "男"
    }
    {
            "_id" : ObjectId("5b13c92dd185894d7283efab"),
            "stuid" : 1003,
            "gender" : "男",
            "name" : "李元芳",
            "tel" : "13022223333"
    }
    > // 查询stuid大于1001的文档
    > db.students.find({stuid: {'$gt': 1001}}).pretty()
    {
            "_id" : ObjectId("5b13c790006ad854460ee70c"),
            "stuid" : 1002,
            "name" : "小盆友",
            "tel" : "18812345678",
            "gender" : "男"
    }
    {
            "_id" : ObjectId("5b13c92dd185894d7283efab"),
            "stuid" : 1003,
            "gender" : "男",
            "name" : "李元芳",
            "tel" : "13022223333"
    }
    > // 查询stuid大于1001的文档只显示name和tel字段
    > db.students.find({stuid: {'$gt': 1001}}, {_id: 0, name: 1, tel: 1}).pretty()
    { "name" : "小盆友", "tel" : "18812345678" }
    { "name" : "李元芳", "tel" : "18822223333" }
    > // 查询name为“骆昊”或者tel为“13022223333”的文档
    > db.students.find({'$or': [{name: '骆昊'}, {tel: '13022223333'}]}, {_id: 0, name: 1, tel: 1}).pretty()
    { "name" : "小可爱", "tel" : "13566778899" }
    { "name" : "李元芳", "tel" : "13022223333" }
    > // 查询学生文档跳过第1条文档只查1条文档
    > db.students.find().skip(1).limit(1).pretty()
    {
            "_id" : ObjectId("5b13c790006ad854460ee70c"),
            "stuid" : 1002,
            "name" : "小盆友",
            "tel" : "13012345678",
            "gender" : "男"
    }
    > // 对查询结果进行排序(1表示升序,-1表示降序)
    > db.students.find({}, {_id: 0, stuid: 1, name: 1}).sort({stuid: -1})
    { "stuid" : 1003, "name" : "李元芳" }
    { "stuid" : 1002, "name" : "小盆友" }
    { "stuid" : 1001, "name" : "小可爱" }
    > // 在指定的一个或多个字段上创建索引
    > db.students.ensureIndex({name: 1})
    {
            "createdCollectionAutomatically" : false,
            "numIndexesBefore" : 1,
            "numIndexesAfter" : 2,
            "ok" : 1
    }
    

使用MongoDB可以非常方便的配置数据复制,通过冗余数据来实现数据的高可用以及灾难恢复,也可以通过数据分片来应对数据量迅速增长的需求。关于MongoDB更多的操作可以查阅官方文档 ,同时推荐大家阅读Kristina Chodorow写的《MongoDB权威指南》。

3.5 在Python程序中操作MongoDB

可以通过pip安装pymongo来实现对MongoDB的操作。

pip install pymongo

进入Python交互式环境,就可以执行以下的操作。

>>> from pymongo import MongoClient
>>>
>>> client = MongoClient('mongodb://127.0.0.1:27017') 
>>> db = client.school
>>> for student in db.students.find():
...     print('学号:', student['stuid'])
...     print('姓名:', student['name'])
...     print('电话:', student['tel'])
... 
学号: 1001.0
姓名: 小可爱
电话: 13566778899
学号: 1002.0
姓名: 小盆友
电话: 13012345678
学号: 1003.0
姓名: 李元芳
电话: 13022223333
>>> db.students.find().count()
3
>>> db.students.remove()
{'n': 3, 'ok': 1.0}
>>> db.students.find().count()
0
>>> from pymongo import ASCENDING
>>>
>>> coll = db.students
>>> coll.create_index([('name', ASCENDING)], unique=True)
'name_1'
>>> coll.insert_one({'stuid': int(1001), 'name': '小可爱', 'gender': True})
<pymongo.results.InsertOneResult object at 0x1050cc6c8>
>>> coll.insert_many([{'stuid': int(1002), 'name': '小盆友', 'gender': False}, {'stuid': int(1003), 'name': '白元芳', 'gender': True}])
<pymongo.results.InsertManyResult object at 0x1050cc8c8>
>>> for student in coll.find({'gender': True}):
...     print('学号:', student['stuid'])
...     print('姓名:', student['name'])
...     print('性别:', '男' if student['gender'] else '女')
... 
学号: 1001
姓名: 小可爱
性别: 男
学号: 1003
姓名: 李元芳
性别: 男

关于pymongo更多的知识可以通过它的官方文档进行了解,也可以使用MongoEngine这样的库来简化Python程序对MongoDB的操作,除此之外,还有以异步I/O方式访问MongoDB的三方库motor都是不错的选择。


总结

今天主要是学习了NoSQL数据库的基本知识,然后然是了非关系型数据库的两个最常用的数据库Redis和Mongo,学习了安装和配置以及最基本的操作,继续加油,有兴趣的小伙伴可以观看官方文档,不管在什么时候,官方文档永远是最好的参考书。

溜了溜了,脑壳疼。Loading(38/100)。。

N32G003学习——第九章 第三节1 串口 发送 经过第九章前2节的学习,基础打下之后,开始敲代码。 阅读详情

相关推荐

syslog RFC5424协议详解

RFC5424协议解读与报文分析。

chenwr2018的博客 6690

NoSQL

诞生的原因 随着互联网的不断发展,各种类型的应用层出不穷,所以导致在这个云计算的时代,对技术提出了更多的需求,主要体现在下面这四个方面: 1. 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度; 2. 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量; 3. 大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理;...

509

LoRa正点原子模块组网步骤

按照我上一篇的博客和视频演示,相信大家一定都可实现了lora模块点对点的通信了。那我们来进行一个比较有高难度的设计吧! 使用多个loRa模块去完成一个组网设计: 在这之前一定要配置模块信息为定点传输 AT+TMODDE要等于1奥 第一步分析通讯协议: 点对点通讯是在透明传输的条件下,地址和信道都是一样的,直接发送接受数据。 组网呢我们利用是: 定向传输就是 A、B的地址、信道不同 假如A是要想B发送信息就用函数来下面: int b[5]...

weixin_43205178的博客 4082

NoSQL入门

NoSQL概述 如今,大多数的计算机系统(包括服务器、PC、移动设备等)都会产生庞大的数据量。其实,早在2012年的时候,全世界每天产生的数据量就达到了2.5EB(艾字节,$$1EB\approx10^{18}B$$)。这些数据有很大一部分是由关系型数据库来存储和管理的。 早在1970年,E.F.Codd发表了论述关系型数据库的著名论文“A relational model of data fo...

weixin_30785593的博客 286

Maxwell中铜导体热损计算的关键步骤与技巧

本文详细介绍了在Maxwell软件中准确计算铜导体热损的关键步骤与实用技巧。重点阐述了如何正确设置涡流场求解器、启用涡流效应、根据工作频率计算并应用肌肤深度以指导网格剖分,以及准确施加激励和定义电流回路。文章还强调了使用温度相关材料属性和进行后处理验证的重要性,旨在帮助工程师获得可靠的热损计算结果,优化产品设计。

weixin_29232121的博客 497

Ubuntu 24.04 高效部署Slurm集群:从零到生产环境实战

本文提供了一份在Ubuntu 24.04 LTS系统上从零开始部署生产级Slurm高性能计算集群的完整实战指南。内容涵盖网络配置、Munge安全认证、Slurm核心组件安装与配置,并深入讲解了cgroups资源隔离、NFS共享存储、配置无感知模式等生产环境优化技巧,最后通过实例演示如何提交与管理Slurm作业,帮助用户构建高效、稳定的计算平台。

weixin_29213655的博客 565

SQL vs NoSQL:如何选择最适合你的数据存储方案

前文提过,随着企业规模扩大,一种方式是对数据库做分库,做了分库之后,数据迁移(1 个库的数据按照一定规则打到 2 个库中)、跨库 Join(订单数据里有用户数据,两条数据不在同一个库中)、分布式事务处理都是需要考虑的问题,尤其是分布式事务处理,业界当前都没有特别好的解决方案。首先是结构化数据,根据定义结构化数据指的是由二维表结构来逻辑表达和实现的数据,严格遵循数据格式与长度规范,也称作为行数据,特点为:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。

Reische的博客 330

Windows系统下Mamba环境配置实战:从零到编译成功

本文详细记录了在Windows系统下从零开始配置Mamba深度学习环境的完整实战过程。针对官方不直接支持Windows的难点,文章提供了关键解决方案,包括安装特定版本的Python、PyTorch与第三方Triton,以及修改源码以解决Windows编译器的兼容性问题,最终成功编译并运行Mamba-SSM。

weixin_28842269的博客 500

SQL vs NoSQL: 为满足您的业务需求选择正确的数据库模型

了解像MongoDB、DynamoDB和Cassandra这样的NoSQL数据库的需求关于基本SQL的快速回顾SQL(Structured Query Language)数据库,也称为关系数据库,是一种基于关系模型的数据库管理系统(DBMS)。它以结构化的方式组织和存储数据,使用带有行和列的表来表示实体及其关系。SQL数据库使用一种称为SQL的结构化查询语言与数据库进行交互。SQL提供了一组命令...

小技术君 380

ROS2入门到精通—— 1-1 Linux和ROS2基础

本文介绍了Linux的一般指令以及ROS2的常见理论和操作

BigDavid123的博客 3804

华为OD机试 - 不含101的数(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。小明在学习二进制时,发现了一类不含101的数,也就是:现在给定一个正整数区间,请问这个区间内包含了多少个不含101的数?输入的唯一一行包含两个正整数。输出的唯一一行包含一个整数,表示在区间内一共有几个不含101的数。8 1668 → “1000”

学Java,找哪吒 1250

Day 38 Mysql初识

什么是Mysql 1.1 数据存储 1.1.1数据库 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,数据库用于记录数据,使用数据库记录数据可以表现出各种数据间的联系,也可以很方便地对所记录的数据进行增、删、改、查等操作。 数据库是一种特殊文件,其中存储着需要的数据 数据库核心元素: 记录 数据表(记录的集合) 数据库(数据表的集合) 1.1.2数据库服务器、数据管理系统、数据库、表与记录的关系 记录:文件中的一行内容 表:文件 数据库:文件夹 数据库管理系统:软件(本质是一

A1L__的博客 221

通过情感分类实例 详细介绍如果借助Huggingface平台 完成Transformers模型运行(包括配置环境-tokenizer-Model-输出头-预测)

attention_mask和padding是配套使用的,当人为去修改padding的时候,也要把attention_mask里面的参数进行修改。下载Huggingface包,Huggingface可以说是一个社区,集成了很多nlp的模型、数据集、预训练权重文件等等,并且免费,只需要pip install下载即可。那么用什么做分类就选择什么输出头,就import什么东西。代码中使用了自动分词器选择,它是由checkpoint指定的预训练模型关联的,不用我们自己选择tokenizer,它自动帮我们选择好了。

LZL2020LZL的博客 1135

day38

今日内容:   1.认识数据库   2.修改默认密码   3.常用操作指令 1.认识数据库 什么是MYSQL? 是一个关系型数据库管理系统,基于socket编写的C/S架构的软件 什么是数据库? 数据:用于记录事物状态的符号 记录:描述事物的典型特征的组合,在文件中就是有一行文本 表:一个文件 库:一个文件夹 文件处理就可以将数据永久保存 用我们之前所学...

dd125130的博客 94

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

day38_MySQL

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公 司开发,现在已经属于 Oracle 旗下产品。MySQL 是最流行的关系型数据 库管理系统之一,在 WEB 应用方面,MySQL是最好的RDBMSRelationalDatabase Management System,关系数据库管 理系统) 应用软件之一。开源免费!DDL语句创建库/表 create database/table 名字修改库/表 alter database/table 名字 …

qq_57747969的博客 958

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

《后端技术面试 38 讲》学习笔记 Day 09

在整个互联网系统架构中,承受着最大处理压力,最难以被伸缩的,就是数据存储部分。目前用来改善数据存储能力的主要手段包括:数据库主从复制、数据库分片和 NoSQL 数据库。现实中,也会采用 MySQL 主主复制的方案。使用主主复制需要注意的是,主主复制仅仅用来提升数据写操作的可用性,并不能用来提高写操作的性能。,也就是说,所有的应用程序都必须连接到同一个主数据库进行写操作。

过了这个村没这个老王的博客 652

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Day01-MySQL数据库介绍及部署

数据:图片 文字 视频 用户名 密码 代码信息(html php jar)地址 人类识别 – 保存数据:二进制信息 – 保存 --磁盘人类可识别信息 - DBMS(数据库管理系统)- 二进制 -磁盘(颗粒-正负极)DBMS分类:RDBMS(关系型数据库软件):主流核心使用数据库软件NoSQL(非关系数据库软件):辅助数据库软件程序DDBMS(分布式数据库软件):解决海量数据存储与管理(NewSQL)8.0 5.7 数据库初始化操作。

苦难带不走梦想 2436

搭建mysql数据库_DAY01

mysql搭建与修改登录密码策略

NSD1907的博客 388

Day38-数据库入门学习

一、初识数据库 1.数据库的由来 怎么才能把数据永久保存下来,根据我们以前的所学,文件处理就可以将数据永久存储。 但是文件处理有很大的问题  1.管理不方便  2.文件操作效率问题  3.一个程序不太可能仅运行在同一台电脑上 那么为了解决这些问题,采取了提高计算机性能的方式  1.垂直扩展 指的是更换性能更好的硬件  2.水平扩展 指的就是添加更多的计算机 把任务分配给每一台 (分布式计算...

weixin_30859423的博客 114

第十九周-day79-数据库day01_请列出你熟悉的数据库系统软件

图片、文字、表格、附件、视频、软件、用户账户信息、订单。

m0_57541068的博客 384

2022-08-15 学习笔记 day38-数据库概述

SQL语言分类----> 事物控制语言(Transaction Control Language)----> 数据操作语言(Data Manipulation Language)----> 数据定义语言(Data Definition Language)----> 数据控制语言(Data Control Language)----> 数据查询语言(Data Query Language)..................

weixin_56090951的博客 410

redis_day02

redis_day01回顾 Redis的特点 1、基于key-value的非关系型数据库 2、基于内存存储,速度很快 3、基于内存存储,经常当作缓存型数据库使用,常用信息缓存在redis数据库中 五大数据类型 1、字符串类型(string) 2、列表类型(list) 3、哈希类型(hash) 4、集合类型(set) 5、有序集合类型(sorted set) 字符串类型 # 设置key相关操作 ...

纸鸢栀年°的博客 284

day07数据库总结

什么是数据库 数据库是按照数据的结构来组织,存储,和管理数据的仓库,简而言之,就是存放数据的仓库 数据库和SQL是什么关系? 结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。 数据库里面放着数据,而SQL是用来操作数据库里数据的语言(工具)。 例如有一碗米饭(碗就是mysq

weixin_60331955的博客 496

redis_day02_note

redis_day01回顾 Redis的特点 1、基于key-value的非关系型数据库 2、基于内存存储,速度很快 3、基于内存存储,经常当作缓存型数据库使用,常用信息缓存在redis数据库中 五大数据类型 1、字符串类型(string) 2、列表类型(list) 3、哈希类型(hash) 4、集合类型(set) 5、有序集合类型(sorted set) 字符串类型 # 设置key相关操作 ...

huhaidi123的博客 208

《后端技术面试 38 讲》学习笔记 Day 07

当同时访问系统的用户不断增加的时候,需要消耗的系统计算资源也不断增加,需要更多的 CPU 和内存去处理用户的计算请求,需要更多的网络带宽去传输用户的数据,需要更多的磁盘空间去存储用户的数据。当消耗的资源超过了服务器资源的极限的时候,服务器就会崩溃,整个系统无法正常使用。垂直伸缩与水平伸缩传统的行业,比如银行、电信这些企业的软件系统,主要是使用垂直伸缩这种手段实现系统能力的提升,在服务器上增强,提升服务器的硬件水平。

过了这个村没这个老王的博客 348

第十九周-day79-数据库day01

哔哩哔哩DBA课程视频 https://www.bilibili.com/video/av53865503?from=search&seid=9747436813733100017 老男孩DBA郭老师简书 IT人的职业素养 人品 责任(权利) 严谨 细心 :把最简单的事情做的最漂亮 最专业 心态: 不惹事 不怕事 工作环境收起好奇心 熟悉操作系统 精通 熟悉公司业务: 产品功能 用户...

linux丶晨星 342
上一篇: Day37.数据库的几个重要概念
下一篇: Day39.数据分析简介
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值