NoSQL(MongoDB&Redis)筆記

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

  1. 創建客戶端對象:client = MongoClient(host, port=27017)
  2. 數據庫對象:db = client.dbname
  3. 集合對象: co = db.collectionname
  4. 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')

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章