爬虫系列总目录
本章节介绍数据存储相关内容。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集合命令
- 查看集合:show collections/tables
- 不手动创建集合: 向不存在的集合中第⼀次加⼊数据时, 集合会被创建出来
手动创建集合:
db.createCollection(name,options)
db.createCollection("kkb")
db.createCollection("kkb", { capped : true, size : 10 } )
- 参数capped: 默认值为false表示不设置上限,值为true表示设置上限
- 参数size: 当capped值为true时, 需要指定此参数,表示上限⼤⼩,当⽂档达到上限时, 会将之前的数据覆盖,单位为字节
- 删除集合:db.集合名称.drop()
3. MongoDB文档命令
- 插入 db.集合名称.insert(document)
注意:插⼊⽂档时, 如果未指定_id,MongoDB会为⽂档分配⼀个唯⼀的ObjectId,如果键名已经存在会报错。
db.text.insert({name: '张三',age: 18,sex:'男'})
- 保存 db.集合名称.save(document)
注意:如果文档的_id不存在为添加,如果_id存在则为修改。 - 查询
db.集合名称.find() 查询所有内容
db.集合名称.findOne() 查询所有内容,但是只返回第⼀个
db.集合名称.find().pretty() 查询所有内容,将结果格式化输出 - 更新
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表示把满⾜条件的⽂档全部更新
- 删除
db.集合名称.remove(<query>,{justOne:<boolean>})
删除一条
db.info.remove({name:'lisi'}, {justOne:1})
删除全部
db.info.remove({name:'lisi'})
- 参数query:可选,删除的⽂档的条件
- 参数justOne:可选, 如果设为true或1, 则只删除⼀条, 默认false, 表示删除多条
- 相关运算符
- 比较运算符
等于: 默认是等于判断, 没有运算符
⼩于:$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
- 增加
# 设置单个属性
hset key field value
# 设置多个属性
hmset key field1 value1 field2 value2
- 获取
获取指定键所有的属性
hkeys key
获取⼀个属性的值
hget key field
获取多个属性的值
hmget key field1 field2
获取所有属性的值
hvals key
- 删除
删除整个hash键及值,使⽤del命令,
删除属性,使用hdel命令,删除属性时,属性对应的值会被⼀起删除
删除属性
hdel key field1 field2
删除user2的age属性
hdel user2 age
2.2.4 list
按照插⼊顺序排序
- 索引从左侧开始,第⼀个元素为0
- 索引可以是负数,表示尾部开始计数,如-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
- 获取
返回列表⾥指定范围内的元素,start、stop为元素的下标索引
lrange key start stop
获取k1列表所有元素
lrange k1 0 -1
- 修改
lset key index value
修改k1列表中下标为3的元素为4
lset k1 3 4
- 删除
将列表中前count次出现的值为value的元素移除
count > 0: 从头往尾移除
count < 0: 从尾往头移除
count = 0: 移除所有
lrem key count value
# 删除k1右侧中2
lrem k1 -3 2
2.2.5 set
⽆序集合
元素为string类型
元素具有唯⼀性,不重复
说明:对于集合没有修改操作
- 增加
sadd key member1 member2
向键'all_name'的集合中添加元素'zhangsan'、'lisi'、'wangwu'
sadd all_name zhangsan lisi wangwu
- 获取
smembers key
获取键all_name的集合中所有元素
smembers all_name
- 删除
srem key
删除all_name中的lisi
srem all_name lisi
2.2.6 zset
有序集合,元素为string类型
元素具有唯⼀性,不重复
每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从小到大排序
说明:没有修改操作
- 增加
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
- 获取
返回指定范围内的元素
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
- 删除
删除指定元素
zrem key member1 member2
删除权重在指定范围的元素
zremrangebyscore key min max
删除集合'all_name1'中元素'lisi'
zrem all_name1 lisi
删除权重在2-4之间的元素
zremrangebyscore all_name1 2 4