OLAP: Analysis(数据越准确越好)(详细,全面) (获得分类汇总数据)
OLTP:Transaction(效率越高越好)(降低单表字段,建立索引等空间换时间)(获得详细数据)
NoSQL:(not only SQL/no-relation SQL)
存储结构灵活的数据
通常保存在内存中,后来大家把他用于缓存,不是主要功能
MongoDB:
基于文件存储
客户端:mongo
链接:
mongo
(如果没有使用用户名和密码,会默认使用test数据库)查看表:
show dbs
(查看物理数据库,test有数据才会展示)创建:
use db_name
查看使用的数据库:
db
切换数据库:
use db_name
删除:
db.dropDatabase()
(先使用)集合:
创建:
db.createCollection(name, options)
db.createCollection('sub', { capped: true, size: 10}) # capped默认False,设为True代表设置上限;size设定稳定上限大小,单位为字节,超过会将之前的数据覆盖
查看集合:
show collections
删除集合:
db.collection_name.drop()
服务端:mongod
- 启动:
suso service mongodb start
- 停止:
sudo service mongodb stop
- 重启:
sudo service mongodb restart
偶数为稳定版1.6X;奇数为开发版:1.7X
beta–没有经过严格测试的版本
release–可以上线的版本
特点:
- 启动:
模式⾃由 :可以把不同结构的⽂档存储在同⼀个数据库⾥
- ⾯向集合的存储:适合存储 JSON⻛格⽂件的形式
- 完整的索引⽀持:对任何属性可索引
- 复制和⾼可⽤性:⽀持服务器之间的数据复制,⽀持主-从模式及服务器之间的相互复制。复制的主要⽬的是提供冗余及⾃动故障转移
- ⾃动分⽚:⽀持云级别的伸缩性:⾃动分⽚功能⽀持⽔平的数据库集群,可动态添加额外的机器
- 丰富的查询:⽀持丰富的查询表达⽅式,查询指令使⽤JSON形式的标记,可轻易查询⽂档中的内嵌的对象及数组
- 快速就地更新:查询优化器会分析查询表达式,并⽣成⼀个⾼效的查询计划
⾼效的传统存储⽅式:⽀持⼆进制数据及⼤型对象(如照⽚或图⽚)
三元素:数据库,集合,文档
集合:类似于关系型数据库中的表
文档:对应关系数据库中的行,代表一个对象
增删改查:
插入:db.stu.insert({})
查询:db.stu.find()``db.stu.findOne()
db.stu.find().pretty()
更新:db.stu.update({query}, {update},{multi:<boolean>})
db.stu.update({query}, {$set: {update}}) # 只更新当前属性
保存:db.stu.save()
删除:db.stu.remove({})
逻辑运算:
and
.find(key:{key1: value1, key2: value2})
or
.find({$or:[{age:{$gt:20}}, {}]})
.find({name:{$or:[, , , ]}})
and和or
.find({$or:[{}, {}], key: value})
$in
.find({name:{$in:[ , , ]}})
$nin
.find({name:{$nin:[]}})
$regex
.find({name:/^黄/})
.find({name:{$regex:'^黄'}})
自定义
$where
自定义js的匿名函数,并且返回boolean值
db.stu.find({ $where:function(){ return this.age > 18; } })
limit()
限制集.find().limit(2)
skip()
略过.find().skip(2)
投影:1代表显示,0代表不显示
.find({}, {name:1, age: 0})
排序
sort()
:1代表升序,-1代表降序.find().sort({字段1:-1, 字段2: 1})
统计个数
count()
.find({age: {$gt: 18}}).count()
.count({age: {$gt: 18}})
去重
distinct()
.distinct('去重字段', {条件})
聚合
aggregate()
.aggregate({管道: {表达式}})
常用管道命令:
$group(分组)
.aggregate({$group: {_id: '$分组字段', counter: {$sum:1}}}) # _id代表分组,$sum:1代表以1的倍数统计
.aggregate($group: {_id: null, avg:{$avg: '$age'}})
$match(筛选)
.aggregate({$match:{age:{$gt:20}}})
管道与管道之间为并列关系:查询年龄大于20的男女生人数
.aggregate({$match:{age:{gt:20}}}, {$gruop:{_id:'$gender', counter:{$sum:1}}})
$project(类似投影)
修改输入文档的结构:重命名,增加,删除字段
.aggregate({$match:{age:{$gt:16}}}, $project: {_id:0, counter:1})
$sort(排序)
$limit(限制数量)
$skip(跳过)
$unwind(对列表数据拆分)
.aggregate({$unwind: '$拆分字段'})
空数组,null,无字段的都会被丢弃!
db.inventory.aggregate({ $unwind:{ path:'$字段名称', preserveNullAndEmptyArrays: #防⽌数据丢失 } })
$push
透视数据,统计后的显示字段.aggregate({$group: {_id: '$分组字段', names: {$push:'$name'}}})
$$ROOT
显示统计后所有字段.aggregate({$group: {_id: '$分组字段', infos: {$push:'$$ROOT'}}})
索引
创建:db.demo.ensureIndex({name:1})
查看:db.demo.getIndexes()
删除:db.demo.dropIndex('_xx_') # xx代表索引名称(创建的索引名称格式为_xx_)
查询耗时:db.demo.find().explain('executionStats')
备份
mongodump -h dbhost -d dbname -o dbdirectory
-h
地址 -d
数据库名 -o
备份位置
回复
mongorestore -h dbhost -d dbname --dir dbdirectory
pymongo
- 创建客户端对象:
client = MongoClient(host, port=27017)
- 数据库对象:
db = client.dbname
- 集合对象:
co = db.collectionname
- Cursor对象:查询⽅法
find()
返回的对象,⽤于进⾏多⾏数据的遍历
方法:
insert_one({})
insert_many([{},{},{}])
update_one()
update_many()
find()
获得的是可迭代cursor对象find_one()
delete_one()
delete_many()
Redis:
save 900 1
save 300 10
save 60 10000
代表60s内更新10000次,会自动将文件从缓存中写入磁盘
daemonize yes
守护进程,不会阻塞当前进程
数据类型:
string
list
hash
set
zset
选择数据库
select 0
select 15
增加,修改
set key value
超时时间ssetex key seconds value
设置多个键值mset key1 value1 key2 value2 ...
追加append key value
获取
get key
mget key1 key2
删除
删除键时,会将值删除
del key1 key2 key3
清空flushall
键命令
keys a
keys *a*
支持通配符
是否存在 exists key1
存在返回1,不存在返回0
查看类型 type key
过期键expire key2 seconds
查看过期时间 ttl key
负数表示已经过期
hash
hset key field value
field 为 hash对象key的属性,value为属性的值
hkeys key
获取键
hmget key1 key2
hvals key
获取值
hdel key field1
删除属性,或者直接用del key
list
左侧插入数据lpush key value1 value2
右侧插入 rpush key value1 value2
指定元素位置插入 linsert key before或after now_value new_value
获取lrange key start stop
修改 lset key index value
索引可以为负
删除 lrem key count value
# 查文档
set
添加 sadd key value1 value2 value3 ...
获取 smembers key
删除 srem key values
移动 smove myset myotherset value
zset
设置 zadd key score1 member1 score2 member2 ...
获取 zrange key start stop
zrangebyscore key min max
返回score值 zscore key member
删除 zrem key member1 member2 ...
zremrangebyscore key min max
事务
设置:pipeline = redis_store.pipeline()
开启:pipeline.multi()
执行:pipeline.execute()
执行失败,会自动回滚
python–redis
获取链接对象 client = StrictRedis()
主机,端口等默认本机
操作 client.set('key', 'value')