新闻推荐系统实践2:离线物料系统的构建(数据库基础)

1. MySQL基础

p.s.由于低版本,尤其5.x版本的MySQL对各大软件的兼容性都不是很好,驱动会出现问题,windows版本下最好安装8.x版本的。

1.1 SQL书写规范

写SQL语句时,要求按照如下规范进行:

  • SQL 语句要以分号(;)结尾

  • SQL 不区分关键字的大小写 ,这对于表名和列名同样适用。

  • 插入到表中的数据是区分大小写的。例如,数据Computer、COMPUTER 或computer,三者是不一样的。

  • 常数的书写方式是固定的,在SQL 语句中直接书写的字符串、日期或者数字等称为常数。常数的书写方式如下所示。

    • SQL 语句中含有字符串的时候,需要像'abc'这样,使用单引号(')将字符串括起来,用来标识这是一个字符串。
    • SQL 语句中含有日期的时候,同样需要使用单引号将其括起来。日期的格式有很多种('26 Jan 2010' 或者'10/01/26' 等)。
    • 在SQL 语句中书写数字的时候,不需要使用任何符号标识,直接写成1000 这样的数字即可。
  • 单词之间需要用半角空格或者换行来分隔。

  • SQL中的注释主要采用--/* ... */的方式,第二种方式可以换行。在MySQL下,还可以通过#来进行注释。

1.2 命名规则

  • 在数据库中,只能使用半角英文字母、数字、下划线(_)作为数据库、表和列的名称 。
  • 名称必须以半角英文字母作为开头。
  • 名称不能重复,同一个数据库下不能有2张相同的表。

1.3 数据类型

MySQL 支持所有标准 SQL 数值数据类型。

数值包含的类型如下:

  • 整型数据:TINYINTINTEGERSMALLINTMEDIUMINTDECIMAL 、NUMERIC 和BIGINT

  • 浮点型数据:DECIMALFLOATREAL 和 DOUBLE PRECISION)。

其中,关键字INTINTEGER的同义词,关键字DEC是的同义词。

表示时间值的日期和时间类型为DATETIMEDATETIMESTAMPTIMEYEAR

字符串类型指CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSET

1.4 数据库及表的基本操作

MySQL操作太熟悉了...就不记录了。

  • 在查询NULL时,SQL中存在第三种真值,不确定(UNKNOWN)NULL和任何值做逻辑运算结果都是不确定;

  • 考虑 NULL 时的条件判断也会变得异常复杂,因此尽量给字段加上NOT NULL的约束。

1.5 Pymysql的使用

python3 -m pip install PyMySQL

如果希望在Python中操作MySQL数据库,那么首先就要登陆到MySQL下的用户。

我们通过创建库pymysql下的类connect的一个实例来登陆到数据库。

import pymysql

# 这里登陆到我之前创建的admin账户
db = pymysql.connect(
     host='localhost',
     user='admin',
     password='mysql123',
     database='shop',				
     charset='utf8mb4',
     cursorclass=pymysql.cursors.DictCursor
)
  • host:数据库服务器地址,默认localhost
  • user:所要登陆的用户名;
  • password:用户的登录密码;
  • database:所要连接的数据库库名;
  • charset:使用的字符类型;
  • cursorclass:定义游标使用的类型,通过指定游标使用的类型,在返回输出的结果时将按照指定的类型进行返回。例如,这里设置为字典游标。

关于游标,可以理解为在命令行中的光标。在命令行中,我们是在光标处键入语句的。这里游标的起到类似作用。

  • # 创建游标
    cursor = db.cursor()

    实际上,除了在初始化connect的实例时指定游标类型,我们在初始化游标时也可以指定游标类型,默认为元组类型。

    cursor = db.cursor(cursor=pymysql.cursors.DictCursor)

    cursors共支持四类游标:

  • Cursor: 默认,元组类型

  • DictCursor: 字典类型

  • SSCursor: 无缓冲元组类型

  • SSDictCursor: 无缓冲字典类型

2. MongoD基础

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

主要特点:

  • MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
  • 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
  • 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  • Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  • MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  • MongoDB安装简单

MongoDB概念解析

在mongodb中基本的概念是文档、集合、数据库。下表将帮助您更容易理解Mongo中的一些概念:

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接,MongoDB不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

常用命令

"show dbs" 命令可以显示所有数据的列表。

执行 "db" 命令可以显示当前数据库对象或集合。

运行"use"命令,可以连接到一个指定的数据库。同时,use也负责创建数据库

MongoDB 中使用 createCollection() 方法来创建集合。

MongoDB 中使用 drop() 方法来删除集合。

文档的数据结构和 JSON 基本一样。所有存储在集合中的数据都是 BSON 格式。

BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

MongoDB 使用 insert() 或 save() 方法向集合中插入文档

  • save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。
  • insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。

MongoDB 使用 update() 和 save() 方法来更新集合中的文档。

MongoDB remove() 函数是用来移除集合中的数据。

MongoDB 数据更新可以使用 update() 函数。在执行 remove() 函数前先执行 find() 命令来判断执行的条件是否正确,这是一个比较好的习惯。

MongoDB 查询文档使用 find() 方法。

find() 方法以非结构化的方式来显示所有文档。如果你需要以易读的方式来读取数据,可以使用 pretty() 方法

MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。

语法格式如下:

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

MongoDB OR 条件语句使用了关键字 $or,语法格式如下:

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

 

MongoDB sort() 方法

在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

2.1 PyMongo

Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接。

3. Redis基础

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。由于是内存数据库,读写非常高速,可达10w/s的评率,所以一般应用于数据变化快、实时通讯、缓存等。但内存数据库通常要考虑机器的内存大小。Redis 是完全开源免费的,遵守 BSD 协议,是一个灵活的高性能 key-value 数据结构存储,可以用来作为数据库、缓存和消息队列。相比于其他的 key-value 缓存产品有以下三个特点:

  • Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载到内存使用。
  • Redis 不仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。
  • Redis 支持主从复制,即 master-slave 模式的数据备份

命令

1.基本操作命令

redis-server [--daemonize yes][--port 6379]

可以通过带参数方式来启动,如果参数过多,可以使用/etc/redis/redis.conf下面的配置文件来启动Redis。

redis-server /etc/redis/redis.conf

连接Redis

redis-cli [-h host -p port -a password]

停止Redis有两种方法,一种是通过 redis-cli 停止,另一种是通过杀掉redis服务进程

> redis-cli shutdown

> kill redis-pid

redis.conf配置中默认16个库,下标从0~15。进入客服端默认选中第0个库,可以通过select命令进行切换,index表示库的小标。

127.0.0.1:6379> SELECT index

删除当前选择的数据库中的所有数据,这个命令永远不会出现失败。

127.0.0.1:6379[1]> FLUSHDB 

删除所有数据库里面的数据,注意是所有数据库,这个命令永远不会出现失败。

127.0.0.1:6379[1]> FLUSHALL

查看当前选择的库中key的数量

127.0.0.1:6379> DBSIZE

2. Key的操作命令

该部分指令主要是为了对数据库中的key进行增删改查等一些列操作

3. 字符串类型-string命令

字符串是Redis中最常见的数据类型,它能够存储任何形式的字符串,其中包括二进制格式,JSON格式,序列化格式等数据。而string相关的命令则是用于管理redis字符串值。

4. 列表-list命令

(后续系统学习)

5. 哈希类型-Hash命令

hash类似于java中的HashMap,在Reids中做了更多的优化。此外hash是一个sytring类型的field和value的映射表,特别适合用于存储对象。例如我们可以借用hash数据结构来存储用户信息,商品信息等。

6. 集合类型-set命令

7. 有序集合类型-sortedset命令

(后续系统学习)

3.1 Python调用Redis

在Python中,目前可以通过一个redis模块来实现操控Redis

python -m pip install redis

Python连接Redis

Redis模块提供了两种连接的模式:直连模式和连接词模式。

直连模式

直连模式的方式简单方便,适合少量长期连接的场景。其中host参数是ip地址,如果Redis服务存在于本地,可以使用127.0.0.1,或者换成Redis服务所在的ip地址。db表示当前选择的库,其参数值可以是 0-15;如果设置连接数据库的密码,那么就需要使用password进行验证。

import redis

r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='')
r.set('name':'jiangyou')
print(r.get('name'))

连接池模式

连接池模式是使用 connection pool(连接池)来管理 redis server 的所有连接,每个Redis实例会维护自己的连接池来管理管理对一个 redis server 所有的连接,避免每次建立,释放连接的开销。

import redis

pool = redis.ConnectionPool(host="127.0.0.1",port=6379,db=0,password="",decode_responses=True, max_connections=10)
r1 = redis.Redis(connection_pool=pool)   #  第一个客户端访问
r2 = redis.Redis(connection_pool=pool)   #  第二个客户端访问

上面的参数,decode_responses=True 可以使得redis取出的结果改成字符串,其默认的是字节, max_connections参数可以设置最大连接数量,这样当有新的客户端请求连接时,只需要去连接池获取即可,这样就可以把一个连接共享给多个客服端,减少每次连接所消耗的时间以及资源。

基本操作

在Redis模块中,提供了RedisStrictRedis来支持Redis访问和操作。其中 StrictRedis 使用python基于Redis协议实现了所有官方的Redis操作命令,也就是说其实对于python操作redis的API接口和上面提到的Redis官方接口一样。

3. MySQL, MongoDB和Redis在项目中的应用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值