MySQL之五——非關系型數據庫(nosql)介紹


  • 非關系型數據庫也叫Nosql數據庫,全稱是not noly sql。
  • 2009年初,Johan Oskarsson舉辦了一場關於開源分布式數據庫的討論,Eric Evans在這次討論中提出了NoSQL一詞,用於指代那些非關系型的,分布式的,且一般不保證遵循ACID原則的數據存儲系統。Eric Evans使用NoSQL這個詞,並不是因為字面上的“沒有SQL”的意思,他只是覺得很多經典的關系型數據庫名字都叫“**SQL”,所以為了表示跟這些關系型數據庫在定位上的截然不同,就是用了“NoSQL“一詞。
  • 非關系型數據庫提出另一種理念,例如,以鍵值對存儲,且結構不固定,每一個元組可以有不一樣的字段,每個元組可以根據需要增加一些自己的鍵值對,這樣就不會局限於固定的結構,可以減少一些時間和空間的開銷。使用這種方式,用戶可以根據需要去添加自己需要的字段,這樣,為了獲取用戶的不同信息,不需要像關系型數據庫中,要對多表進行關聯查詢。僅需要根據id取出相應的value就可以完成查詢。

💇‍♂️關系型數據庫與非關系型數據庫的區別:

  • 關系型數據庫通過外鍵關聯來建立表與表之間的關系,非關系型數據庫通常指數據以對象的形式存儲在數據庫中,而對象之間的關系通過每個對象自身的屬性來決定。

💇‍♂️nosql數據庫的特點:

  • 模式自由
    • 不需要定義表結構,數據表中的每條記錄都可能有不同的屬性和格式。
  • 逆規范化
    • 不遵循范式要求,去掉完整性約束,減少表之間的依賴
  • 彈性可擴展
    • 可在系統運行的過程中,動態的刪除和增加節點。
  • 多副本異步復制
    • 數據快速寫入一個節點,其余節點通過讀取寫入的日志來實現異步復制。
  • 弱事務
    • 不能完全滿足事務的ACID特性,但是可以保證事務的最終一致性。

💇‍♂️什么時候用nosql數據庫:

  • 數據庫表schema經常變化
  • 數據庫表字段是復雜數據類型
  • 高並發數據庫請求
  • 海量數據的分布式存儲

Mongodb

➡️Mongodb簡介

  • MongoDB.inc 公司研發的一款nosql類型的文檔型數據庫。
  • 功能強大、使用靈活、性能卓越且易於擴展的數據庫。
  • 2009年發布第一個穩定版本,是當前非常熱門的開源的nosql類型數據庫。
  • 官方網站:https://www.mongodb.org
  • 開源項目:http://github.com/mongodb

➡️Mongodb特點

  • 面向集合存儲,易存儲對象類型的數據
  • 模式自由
  • 支持動態查詢
  • 支持完全索引,包含內部對象
  • 支持查詢
  • 支持復制和故障恢復
  • 使用高效的二進制數據存儲,包括大型對象(如視頻等)
  • 自動處理碎片,以支持雲計算層次的擴展性
  • 支持RUBY,PYTHON,JAVA,C++,PHP等多種語言
  • 文件存儲格式為BSON(一種JSON的擴展)
  • 可通過網絡訪問

➡️Mongodb安裝

  • 1、下載mongodb安裝包,
  • 2、在/usr/local目錄下創建一個mongodb文件夾,然后把mongodb的安裝包解壓到mongodb文件中
  • 3、創建一個存放數據的文件夾data和日志文件logs
    • cd /usr/local/mongodb
    • mkdir data
    • touch logs
  • 4、啟動mongodb
    • /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs --logappend  --port=27017 --fork

➡️Mongodb啟動參數和啟動腳本

  • 使用Mongodb安裝目錄下的mongod文件來啟動mongodb
  • 常用的啟動參數:

    --dbpath的意思是指定存儲數據的文件夾

    --logpath的意思是指定日志存儲文件

    --logappend的意思是日志以增加方式產生

    --port指定端口,如果不寫的話,默認是27017

    --fork 代表后台運行   

  • 也可以把這些參數都寫到一個配置文件中,然后讀取配置文件

➡️Mongodb啟動腳本

  • 啟動腳本:         

    #!/bin/bash

    pid=`ps -ef|grep /usr/local/mongodb/bin/mongod|grep -v "grep" | awk '{print $2}'`

    if [ $pid ]

    then

    echo "mongodb is running..."

    else

    /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs --logappend  --port=27017 --fork

    echo 'mongodb started!'

    fi

➡️停止mongodb和停止腳本

  • Mongodb停止的時候不能直接kill掉,如果kill掉的話,下次啟動會有問題
  • 停止mongodb的時候要用mongod 后面加上shutdown參數,並且指定數據庫文件
  • 停止腳本

  #!/bin/bash

  pid=`ps -ef|grep /usr/local/mongodb/bin/mongod |grep -v "grep" | awk '{print $2}'`

  if [[ $pid ]]

  then

  /usr/local/mongodb/bin/mongod  --shutdown --dbpath /usr/local/mongodb/data/

  echo 'mongodb stoped'

  else

  echo "mongodb is not running..."

  fi

➡️重啟mongodb和重啟腳本

  • 重啟的過程就是先停止,后啟動,我們已經寫好了啟動的腳本和停止的腳本,依次調用即可
  • #!/bin/bash
  • /usr/local/mongodb/stop_mongodb.sh
  • /usr/local/mongodb/start_mongodb.sh

➡️連接mongodb

    • Linux下可以直接使用mongo進入mongod命令行操作

      

      

➡️Mongodb增刪改查

  • 概念: 集合==表  文檔==數據
  • 命令關鍵詞:
    • Show dbs:查看數據庫
    • Show collectios:查看集合
    • Create collection:創建一個集合
    • use:切換數據庫
    • insert:插入數據
    • Find:查找數據
    • Update:修改數據
    • Remove:刪除數據

➡️Mongodb創建和刪除數據庫

  • Mongodb中使用use關鍵字來創建一個數據庫
  • use chenshifeng;#創建了一個數據庫
  • db;#查看當前的數據庫
  • db.dropDatabase();

➡️插入數據

  • Mongodb中使用insert關鍵字來插入數據 db.collectios.insert(doc);
  • 創建一個chenshifeng庫,插入一條班級信息
  • use chenshifeng;
  • db.classes.insert({"name":"塵世風","nums":100,"course":["mysql","linux","性能測試項目實戰","性能調優","安全測試"],"teacher":"塵世風"});
  • 也可以通過定義變量的方式來插入數據
  • new_class=({"name":"塵世風","nums":150,"course":['mysql','nosql','linux','前端性能測試'],"teacher":"塵"});
  • db.classes.insert(new_class);

➡️更新數據

  • Mongodb中使用update關鍵字來更新數據,db.collectios.update({條件},{更新的值})
  • 把剛才插入的喬巴班的信息加一個狀態,status,上課中
  • use chenshifeng;
  • 所有字段加全
    • db.classes.update({"name":"塵世風"},{"name":"塵世風","nums":100,"course":["mysql","linux","性能測試項目實戰","性能調優","安全測試"],"teacher":"塵世風","status":"上課中"});
  • $set方式只更新指定的字段
    • db.classes.update({"name":"塵世風"},{$set:{"createtime":"20150810"}});
  • 更新所有匹配的值
    • db.classes.update({"teacher":"chenshifeng"},{$set:{"teacher":"niuhy"}},{multi:true});
  • 如果更新的值不存在的話,插入一條
    • db.classes.update({"teacher":"fengluo"},{$set:{"teacher":"niuhy"}},{upsert:true});
  • $inc,在原來的值上增加值,只適用於數字型
    • db.classes.update({"name":"塵世風"},{$inc:{"nums":20}});

➡️查詢數據

  • Mongodb中使用find關鍵字來查詢數據,db.collectios.find();
  • db.collectios.find();查詢所有的數據
  • db.collectios.find().pretty();已格式化的方式顯示數據
  • db.collectios.find({"xx":"xx“});#指定條件查詢
  • db.collectios.find({條件1,條件2})#and操作
  • db.collectios.find({$or,[{條件1},{條件2}]})#or操作
  • db.collectios.find({條件1},$or[{條件2},{條件3}]);#and和or合用
  • db.collectios.find().count();#查詢所有的行數
  • db.collectios.find().sort(KEY:1)#排序

➡️Mongodb中的條件表達式

➡️刪除數據

  • Mongodb中使用remove關鍵字來刪除數據,db.collectios.remove();
  • db.collectios.remove({});刪除所有的數據
  • db.collections.remove({條件1},1)#如果有多條匹配的,只刪除一條

➡️開啟profile

    • Mongodb的profile就和mysql的慢查詢類似,用於記錄執行時間超過多少的語句。
    • db.getProfilingLevel()#獲取profile級別
    • db.setProfilingLevel(1,2000)# 設置profile級別
    • profile級別有三種:
      • 0:不開啟
      • 1:記錄慢命令,默認為大於100ms
      • 2:記錄所有命令
    • 查詢profile記錄
      • db.system.profile.find();
      • ts: 該命令在何時執行
        op: 操作類型
        query: 本命令的詳細信息
        responseLength: 返回結果集的大小
        ntoreturn: 本次查詢實際返回的結果集
        millis: 該命令執行耗時,以毫秒記

➡️創建索引

  • db.collections.ensureIndex({xx:1})#創建單列索引
  • db.collections.ensureIndex({xx:1,xx:1})#創建多列索引
  • db.collections.ensureIndex({xx:1},{“unique”:true})#創建唯一索引

➡️查看、刪除索引

  • db.system.indexes.find();查看索引
  • db.collections.getIndexes();#查看當前集合中的索引
  • Mongodb中使用dropIdenx來刪除索引
  • db.collections.dropIndex({xx:1});刪除指定索引
  • db.user.dropIndexes();刪除所有的索引

➡️explain

  • 使用explain可以解析查詢語句
  • db.collection.find({xx:xx}).explain();
  • Explain說明:
    • cursor: 返回游標類型(BasicCursor 或 BtreeCursor)
    • nscanned: 被掃描的文檔數量
    • n: 返回的文檔數量
    • millis: 耗時(毫秒)
    • indexBounds: 所使用的索引
    • isMultiKey:是否使用了多鍵索引

    • scanAndOrder:是否在內存中對結果集進行了排序

    • indexOnly:是否只使用索引就能完成查詢(覆蓋索引) 

Redis

➡️Redis簡介

  • redis是一個開源的、使用C語言編寫的、支持網絡交互的、可基於內存也可持久化的Key-Value數據庫。
  • redis的官網地址,非常好記,是redis.io。
  • Redis和mongodb的區別是redis數據全部存儲在內存中,使用磁盤僅用於數據的持久化,而mongodb數據是存儲在磁盤上。

➡️Redis安裝

  • 1、下載redis安裝包

  wget http://download.redis.io/releases/redis-2.8.12.tar.gz

  • 2、安裝redis依賴

        yum -y install gcc*
        yum -y install make
        yum -y install tcl

  • 3、編譯安裝

        tar xvf  redis-2.8.12.tar.gz 

        mv redis-2.8.12 redis #改名
        mv redis /usr/local #移動

        cd /usr/local/redis

        make

  • 4、使用redis的可執行命令

將redis命令移動到/usr/local/bin目錄下,把redis命令放到/usr/local/bin目錄下后就可以直接使用redis命令,如果不放到/usr/local/bin也是可以的,直接到/usr/local/redis/src目錄下使用即可。

        cd /usr/local/redis/src
        cp -rf redis-benchmark redis-server redis-cli redis-check-dump redis-check-aof /usr/local/bin

➡️Redis啟動

    • 啟動redis
      • 介紹兩種啟動方式,一種是命令啟動,一種是使用配置文件啟動。
      • redis-server & #這種是命令啟動,默認端口6379,&表示后台運行
      • redis-server /usr/local/redis/redis.conf #配置文件啟動的,可以在配置文件中修改端口
      •  由於redis默認帶的配置文件不是后台運行的,咱們不用它,新建一個redis.conf配置文件,把原來那個默認的刪掉,新的配置文件內容如下:
                     daemonize  yes #代表后台啟動              
                     pidfile   /usr/local/redis/redis.pid #pid文件             
                     logfile   /usr/local/redis/redis.log #日志文件              
                     port      6379#端口
                     dir       /usr/local/redis/redisData #持久化文件存放位置

➡️Redis啟動腳本

  • 為了方便管理,現在寫一個redis的啟動腳本和停止腳本
  • 啟動腳本:

#!/bin/bash

pid=`ps -ef|grep redis-server|grep -v "grep"|awk '{print $2}'`

if [[ "$pid" ]]

then

echo "redis is running...."

else

/usr/local/bin/redis-server /usr/local/redis/redis.conf

echo "redis started!“

➡️Redis停止腳本

  • 停止腳本:
    • #!/bin/bash
    • pid=`cat /usr/local/redis/redis.pid`
    • new_pid=`ps -ef|grep $pid|grep -v "grep"|awk '{print $2}'`
    • if [[ $new_pid ]]
    • then
    • kill -9 $pid
    • echo "redis is stoped!"
    • else
    • echo "redis is not running..."
    • fi

➡️Redis重啟腳本

  • 重啟腳本,重啟不過就是先停止,后啟動,我們已經寫好停止和啟動的腳本,依次調用即可:
    • #!/bin/bash
    • /usr/local/redis/stop_redis
    • /usr/local/redis/start_redis

➡️連接redis

    • Linux下可以直接使用redis-cli進入redis命令行操作

      

    • 也可以通過telnet方式連接

      

    • 也可以通過redis-client這個可視化工具來連接

      

➡️Redis的增刪改查

    • 選擇數據庫,使用select關鍵字
      • select 1,選擇第一個數據庫
    • 使用set關鍵字插入數據
      • set name andashu
    • 使用get 關鍵字獲取數據
      • get name
    • 使用del 關鍵字 刪除數據
      • del name

Memcached

➡️Memcached簡介

  • Memcached是一個高性能的分布式的內存對象緩存系統,目前全世界不少人使用這個緩存項目來構建自己大負載的網站,來分擔數據庫的壓力,通過在內存里維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,然后從內存中讀取,從而大大提高讀取速度。

➡️Memcached安裝

  • 1、安裝依賴包libevent

yum -y install libevent

  • 2、編譯安裝

tar xvf memcached-1.2.0.tar.gz

cd memcached-1.2.0

./configure --prefix=/usr/local/memcached

make

make install

➡️Memcached啟動參數

  • -p 監聽的端口
  • -c 最大同時連接數,默認是1024 
  • -m 最大內存使用,單位MB。默認64MB
  • -P 設置保存Memcache的pid文件
  • -d 后台運行
  • -u 運行Memcache的用戶,僅在以root運行的時候有效

➡️Memcached啟動腳本

  • #!/bin/bash
  • pid=`ps -ef|grep memcached|grep -v "grep"|awk '{print $2}'`
  • if [[ $pid ]]
  • then
  • echo "memcached is running..."
  • else
  • /usr/local/bin/memcached -d -m 10 -p 11211 -u root -c 256 -P /tmp/memcached.pid >> /tmp/memcached.log
  • echo 'memcached started pidfile path is /tmp/memcached.pid'
  • fi

➡️Memcached停止腳本

  • #!/bin/bash
  • pid=`cat /tmp/memcached.pid`
  • new_pid=`ps -ef|grep $pid|grep -v "grep"|awk '{print $2}'`
  • if [[ $new_pid ]]
  • then
  • kill -9 `cat /tmp/memcached.pid`
  • echo "memcached stoped..."
  • else
  • echo "memcached is not runing...."
  • fi

➡️Memcached重啟腳本

  • 重啟腳本也和前面的一樣,先停止再啟動
  • #!/bin/bash
  • /usr/local/memcached/stop_mem.sh
  • /usr/local/memcahed/start_mem.sh

➡️Memcached連接方式

  • Memcached沒有可視化工具,只能通過Telnet這種方式來連接
  • telnet ip 端口
  • telnet 211.149.218.16 11211
  • telnet上去之后,可以輸入stats查看memcached信息

  

  

➡️Memcached的增刪改查

  • 增加使用add 關鍵字
    • add key 0 存放時間 數據大小
    • add name 0 30 5
  • 查詢使用get 關鍵字
    • get key
    • get name
  • 修改使用set或者replace關鍵字,set和replace的區別是set一個不存在的key時,會新增,replace一個不存在key時,會報錯。
    • set key 0 存放時間 數據大小
    • replace key 0 存放時間 數據大小
    • set name1 0 50 6
    • replace name 0 70 5
  • 刪除使用delete關鍵字
    • delete key
    • delete name1

轉載自https://www.cnblogs.com/feng0815/p/8722651.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM