爬虫系列总目录

本章节介绍数据存储相关内容。Mysql、MongoDB、redis 等基础内容。第三章 数据库简介与使用第三章 MongoDB及Redis使用


数据存储-MongoDB及Redis

  • 爬虫系列总目录
  • 一、 MongoDB
  • 1.1 MongoDB安装基础命令
  • 1.2 MongoDB数据库组成
  • 1.2.1 文档
  • 1.2.2 集合
  • 1.2.3 数据库
  • 1.3 MongoDB数据类型
  • 1.4 MongoDB命令
  • 1. MongoDB数据库命令
  • 2. MongoDB集合命令
  • 3. MongoDB文档命令
  • 二、Redis
  • 2.1 Redis安装基础命令
  • 2.2 Redis数据操作
  • 2.2.1 键命令
  • 2.2.2 String
  • 2.2.3 hash
  • 2.2.4 list
  • 2.2.5 set
  • 2.2.6 zset


一、 MongoDB

1.1 MongoDB安装基础命令

windows

启动本地客户端:mongo
查看帮助:mongo –help
退出:exit或者ctrl+c

Mac

跳转到MongoDB安装目录: cd ~/Documents/mongodb
启动服务: mongod --dbpath data --logpath
log/mongod.log --logappend
启动本地客户端:mongo
查看帮助:mongo –help
退出:exit或者ctrl+c

1.2 MongoDB数据库组成

MongoDB是非关系型数据库,它有的是数据库、集合、文档,分别对应关系型里面的数据库、数据表、和表里面一行一行的数据。在MongoDB中,文档构成集合,集合构成数据库。

1.2.1 文档

mongodb里面,文档指的是集合里面的一行数据,一个文档中可以含有多个键值对,可以存放不同的数据类型.

文档组成:

  • _id:用于表示一行文档
  • 键名:一个文档中不可以出现重复的键名,并且严格区分大小写
  • 键值:即键名对应的值

1.2.2 集合

MongoDB中的集合就相当于MySQL中的数据表,集合由文档组成,可以使用show tables查看一个数据库中有哪些集合。

1.2.3 数据库

MongoDB中数据库和MySQL的不同之处在于其组成, show dbs 可以查看相关数据库。

1.3 MongoDB数据类型

  • Object ID: ⽂档ID
  • String: 字符串, 最常⽤, 必须是有效的UTF-8
  • Boolean: 存储⼀个布尔值, true或false
  • Integer: 整数可以是32位或64位, 这取决于服务器
  • Double: 存储浮点值
  • Arrays: 数组或列表, 多个值存储到⼀个键
  • Object: ⽤于嵌⼊式的⽂档, 即⼀个值为⼀个⽂档
  • Null: 存储Null值
  • Timestamp: 时间戳, 表示从1970-1-1到现在的总秒数
  • Date: 存储当前⽇期或时间的UNIX时间格式

1.4 MongoDB命令

1. MongoDB数据库命令

注意:use 库名如果该库不存在,则会自动以该名字创建一个新的库,如果后面跟已有的数据库名,则切换到另一个需要操作的数据库。

查看当前的数据库:db
查看所有的数据库:show dbs /show databases
切换数据库:use db_name
删除当前的数据库:db.dropDatabase()

2. MongoDB集合命令

  1. 查看集合:show collections/tables
  2. 不手动创建集合: 向不存在的集合中第⼀次加⼊数据时, 集合会被创建出来
    手动创建集合:
db.createCollection(name,options)
db.createCollection("kkb")
db.createCollection("kkb", { capped : true, size : 10 } )
  • 参数capped: 默认值为false表示不设置上限,值为true表示设置上限
  • 参数size: 当capped值为true时, 需要指定此参数,表示上限⼤⼩,当⽂档达到上限时, 会将之前的数据覆盖,单位为字节
  1. 删除集合:db.集合名称.drop()

3. MongoDB文档命令

  1. 插入 db.集合名称.insert(document)
    注意:插⼊⽂档时, 如果未指定_id,MongoDB会为⽂档分配⼀个唯⼀的ObjectId,如果键名已经存在会报错。
db.text.insert({name: '张三',age: 18,sex:'男'})
  1. 保存 db.集合名称.save(document)
    注意:如果文档的_id不存在为添加,如果_id存在则为修改。
  2. 查询
    db.集合名称.find() 查询所有内容
    db.集合名称.findOne() 查询所有内容,但是只返回第⼀个
    db.集合名称.find().pretty() 查询所有内容,将结果格式化输出
  3. 更新
db.集合名称.update(<query> ,<update>,{multi:<boolean>})

db.info.insert(
[{name: '张三',age: 19,sex: '男'},
{name: '张三',age: 18,sex: '男'},
{name: '张三',age: 17,sex: '男'}])
  • 参数query:查询条件
  • 参数update:更新操作符
  • 参数multi:可选参数,默认是false,表示只更新找到的第⼀条记录, 值为true表示把满⾜条件的⽂档全部更新
  1. 删除
db.集合名称.remove(<query>,{justOne:<boolean>})

删除一条
db.info.remove({name:'lisi'}, {justOne:1})
删除全部
db.info.remove({name:'lisi'})
  • 参数query:可选,删除的⽂档的条件
  • 参数justOne:可选, 如果设为true或1, 则只删除⼀条, 默认false, 表示删除多条
  1. 相关运算符
  • 比较运算符
等于: 默认是等于判断, 没有运算符
⼩于:$lt (less than)
⼩于等于:$lte (less than equal)
⼤于:$gt (greater than)
⼤于等于:$gte
不等于:$ne

查询info集合中年龄大于等于18的人
db.info.find({age:{$gte:18}})
  • 范围运算符
使⽤"$in", "$nin" 判断是否在某个范围内
查询年龄是17和19岁的信息
db.info.find({age:{$in:[17,19]}})
  • 逻辑运算符
and:直接写多个条件即可
or:使⽤$or,值为数组
  • 使用正则表达式
使⽤//或$regex编写正则表达式
查询李姓信息
db.info.find({name:/^李/})
db.info.find({name:{$regex:'^李'}})

二、Redis

  • redis是key-value的数据结构,每条数据都是一个键值对
  • 键的类型是字符串
  • 键不能重复
  • 值的类型分为五种: 字符串string, 哈希hash, 列表list, 集合set, 有序集合zset

2.1 Redis安装基础命令

redis-cli 连接redis
ping 测试命令
select n 切换数据库
redis中数据库没有名称,默认有16个,通过0-15进行标识,在连接成功后默认选择第一个数据库。

2.2 Redis数据操作

2.2.1 键命令

  • 查找键:参数支持正则表达式
keys pattem 
keys *k*  查看包含k的键
keys *    查看所有键
  • 判断键是否存在, 存在返回1,不存在返回0
exists key
  • 查看值的类型
type key 
type k1 查看k1对应的值的类型
  • 设置过期时间,以秒为单位
    如果没有指定过期时间则⼀直存在,直到使⽤del移除
expire key seconds
expire k2 5  设置k2过期时间为5秒
  • 查看有效时间
ttl key
ttl k3  查看键k3的有效时间

2.2.2 String

字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制,安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。

  • 设置键值
    如果设置的键不存在则为添加,如果设置的键已经存在则修改
set key value
set name kkb
# 根据键名获取值
  • 设置键值过期时间,单位是秒
setex key seconds value
set name 5 zhangsan  #设置键为name值为zhangsan 过期时间为5秒的数据
  • 设置键为name值为zhangsan 过期时间为5秒的数据
mset key1 value1 key2 value2
# 设置键k1的值为kkb k2的值为python
mset k1 kkb k2 python
  • 追加值
append key value
append key value  # 在键k1的值后面追加 666
  • 获取
    如果不存在此键则返回nil
get key 获取
mget key1 key2   # 根据多个键获取多个值
  • 删除
    删除键会将对应的值也进行删除
del key1 key2

2.2.3 hash

  • hash⽤于存储对象,对象的结构为属性、值
  • 值的类型为string
  1. 增加
# 设置单个属性
hset key field value
# 设置多个属性
hmset key field1 value1 field2 value2
  1. 获取
获取指定键所有的属性
hkeys key
获取⼀个属性的值
hget key field
获取多个属性的值
hmget key field1 field2
获取所有属性的值
hvals key
  1. 删除
    删除整个hash键及值,使⽤del命令,
    删除属性,使用hdel命令,删除属性时,属性对应的值会被⼀起删除
删除属性
hdel key field1 field2
删除user2的age属性
hdel user2 age

2.2.4 list

按照插⼊顺序排序

  • 索引从左侧开始,第⼀个元素为0
  • 索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素

  1. 增加
在左侧插⼊数据
lpush key value1 value2 
在右侧插⼊数据
rpush key value1 value2
在指定元素的前或后插⼊新元素
linsert key before/after 现有元素 新元素

从键为'k1'的列表左侧加⼊数据1 2 3
lpush k1 1 2 3

在p前面插入kk
linsert k1 before p kk
  1. 获取
    返回列表⾥指定范围内的元素,start、stop为元素的下标索引
lrange key start stop

获取k1列表所有元素
lrange k1 0 -1
  1. 修改
lset key index value
修改k1列表中下标为3的元素为4
lset k1 3 4
  1. 删除
    将列表中前count次出现的值为value的元素移除
    count > 0: 从头往尾移除
    count < 0: 从尾往头移除
    count = 0: 移除所有
lrem key count value
# 删除k1右侧中2
lrem k1 -3 2

2.2.5 set

⽆序集合
元素为string类型
元素具有唯⼀性,不重复
说明:对于集合没有修改操作

  1. 增加
sadd key member1 member2

向键'all_name'的集合中添加元素'zhangsan'、'lisi'、'wangwu'
sadd all_name zhangsan lisi wangwu
  1. 获取
smembers key

获取键all_name的集合中所有元素
smembers all_name
  1. 删除
srem key

删除all_name中的lisi
srem all_name lisi

2.2.6 zset

有序集合,元素为string类型
元素具有唯⼀性,不重复
每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从小到大排序
说明:没有修改操作

  1. 增加
zadd key score1 member1 score2 member2

向键'all_name1'的集合中添加元素'wangwu'、'zhangsan'、'zhaoliu'、'lisi', 权重分别为3、1、4、2
zadd all_name1 3 wangwu 1 zhangsan 4 zhaoliu 2 lisi
  1. 获取
    返回指定范围内的元素
    start、stop为元素的下标索引
    索引从左侧开始,第⼀个元素为0
    索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
zrange key start stop

获取all_name1中所有的元素
zrange all_range 0 -1

返回score值在min和max之间的元素
zrangebyscore key min max

返回成员member的score值
zscore key member

获取键'all_name1'的集合中权限值在1和3之间的元素
zrangebyscore all_name1 1 3
  1. 删除
删除指定元素
zrem key member1 member2 

删除权重在指定范围的元素
zremrangebyscore key min max

删除集合'all_name1'中元素'lisi'
zrem all_name1 lisi
删除权重在2-4之间的元素
zremrangebyscore all_name1 2 4