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')