NoSQL非關系型數據庫Redis (鍵值對(key-value)數據庫) 學習筆記


 

redis是一款高性能的NOSQL系列的非關系型數據庫

 

1.1.什么是NOSQL
            NoSQL(NoSQL = Not Only SQL),意即“不僅僅是SQL”,是一項全新的數據庫理念,泛指非關系型的數據庫。


            隨着互聯網web2.0網站的興起,傳統的關系數據庫在應付web2.0網站,特別是超大規模和高並發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關系型的數據庫則由於其本身的特點得到了非常迅速的發展。NoSQL數據庫的產生就是為了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。

            1.1.1.    NOSQL和關系型數據庫比較
                優點:
                    1)成本:nosql數據庫簡單易部署,基本都是開源軟件,不需要像使用oracle那樣花費大量成本購買使用,相比關系型數據庫價格便宜。
                    2)查詢速度:nosql數據庫將數據存儲於緩存之中,關系型數據庫將數據存儲在硬盤中,自然查詢速度遠不及nosql數據庫。
                    3)存儲數據的格式:nosql的存儲格式是key,value形式、文檔形式、圖片形式等等,所以可以存儲基礎類型以及對象或者是集合等各種格式,而數據庫則只支持基礎類型。
                    4)擴展性:關系型數據庫有類似join這樣的多表查詢機制的限制導致擴展很艱難。

                缺點:
                    1)維護的工具和資料有限,因為nosql是屬於新的技術,不能和關系型數據庫10幾年的技術同日而語。
                    2)不提供對sql的支持,如果不支持sql這樣的工業標准,將產生一定用戶的學習和使用成本。
                    3)不提供關系型數據庫對事務的處理。

            1.1.2.    非關系型數據庫的優勢:
                1)性能NOSQL是基於鍵值對的,可以想象成表中的主鍵和值的對應關系,而且不需要經過SQL層的解析,所以性能非常高。
                2)可擴展性同樣也是因為基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。

            1.1.3.    關系型數據庫的優勢:
                1)復雜查詢可以用SQL語句方便的在一個表以及多個表之間做非常復雜的數據查詢。
                2)事務支持使得對於安全性能很高的數據訪問要求得以實現。對於這兩類數據庫,對方的優勢就是自己的弱勢,反之亦然。

            1.1.4.    總結
                關系型數據庫與NoSQL數據庫並非對立而是互補的關系,即通常情況下使用關系型數據庫,在適合使用NoSQL的時候使用NoSQL數據庫,
                讓NoSQL數據庫對關系型數據庫的不足進行彌補。
                一般會將數據存儲在關系型數據庫中,在nosql數據庫中備份存儲關系型數據庫的數據

 1.2.主流的NOSQL產品
            •    鍵值(Key-Value)存儲數據庫
                    相關產品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
                    典型應用: 內容緩存,主要用於處理大量數據的高訪問負載。 
                    數據模型: 一系列鍵值對
                    優勢: 快速查詢
                    劣勢: 存儲的數據缺少結構化
            •    列存儲數據庫
                    相關產品:Cassandra, HBase, Riak
                    典型應用:分布式的文件系統
                    數據模型:以列簇式存儲,將同一列數據存在一起
                    優勢:查找速度快,可擴展性強,更容易進行分布式擴展
                    劣勢:功能相對局限
            •    文檔型數據庫
                    相關產品:CouchDB、MongoDB
                    典型應用:Web應用(與Key-Value類似,Value是結構化的)
                    數據模型: 一系列鍵值對
                    優勢:數據結構要求不嚴格
                    劣勢: 查詢性能不高,而且缺乏統一的查詢語法
            •    圖形(Graph)數據庫
                    相關數據庫:Neo4J、InfoGrid、Infinite Graph
                    典型應用:社交網絡
                    數據模型:圖結構
                    優勢:利用圖結構相關算法。
                    劣勢:需要對整個圖做計算才能得出結果,不容易做分布式的集群方案。

 

        1.3 什么是Redis
            Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫,官方提供測試數據,50個並發執行100000個請求,讀的速度是110000次/s,寫的速度是81000次/s ,且Redis通過提供多種鍵值數據類型來適應不同場景下的存儲需求,目前為止Redis支持的鍵值數據類型如下:
                1) 字符串類型 string
                2) 哈希類型 hash
                3) 列表類型 list
                4) 集合類型 set
                5) 有序集合類型 sortedset
            1.3.1 redis的應用場景
                •    緩存(數據查詢、短連接、新聞內容、商品內容等等)
                •    聊天室的在線好友列表
                •    任務隊列。(秒殺、搶購、12306等等)
                •    應用排行榜
                •    網站訪問統計
                •    數據過期處理(可以精確到毫秒
                •    分布式集群架構中的session分離

 

1.4 Redis 下載與安裝

  

  官網:https://redis.io/

  中文網: https://www.redis.net.cn/

  Linux版下載,(5.0.4 2019年發布) : http://download.redis.io/releases/

  GitHub上有Windows版本,(3.0.504 2016年發布) 地址是:https://github.com/MicrosoftArchive/redis

 

  Linux版本的安裝

$ tar zxvf redis-5.0.4.tar.gz $ cd redis-5.0.4 $ make
$ src/redis-server #啟動服務器端
$ src/redis-cli #啟動客戶端 redis> set foo bar #存儲一個鍵值對 OK redis> get foo #查看剛剛的鍵 "bar"

can't connect to redis-server

安裝完Linux服務器上的redis后,在windows本地上使用 RedisDesktopManager連接該redis后一直報can't connect to redis-server 
解決方案如下:

https://blog.csdn.net/gwd1154978352/article/details/79339195

修改配置文件 redis.conf
daemonize yes #136行 no改為yes
# bind 127.0.0.1 #69行注釋掉
protected-mode no #88行 yes改為no

再次啟動時候,加上配置參數
src/redis-server redis.conf


1.5 Redis 中文網里面的命令操作指南  
  https://www.redis.net.cn/order/
   Redis 字符串(String) 命令
   Redis 列表(List) 命令

   Redis 哈希(Hash) 命令--Map

   Redis 集合(Set) 命令

   Redis 有序集合(sorted set) 命令


1.6 Redis 字符串常用命令,其它命令參考官方文檔說明即可.
  1. GET KEY_NAME
  2. 返回 key 的值,如果 key 不存在時,返回 nil。 如果 key 不是字符串類型,那么返回一個錯誤。

 

  1.  > SET KEY_NAME VALUE
  2. 在 Redis 2.6.12 以前版本, SET 命令總是返回 OK 。
  3. 從 Redis 2.6.12 版本開始, SET 在設置操作成功完成時,才返回 OK

 

  1.  > APPEND KEY_NAME NEW_VALUE
  2. 返回 追加指定值之后, key 中字符串的長度。

 

  1.  > PSETEX key1 EXPIRY_IN_MILLISECONDS value1
  2. 設置成功時,返回OK。

 

1.7 Redis 哈希(Hash)常用命令,其它命令參考官方文檔說明即可.
  1.  > HSET  KEY_NAME  FIELD VALUE
  2. 如果字段是哈希表中的一個新建字段,並且值設置成功,返回 1 。 如果哈希表中域字段已經存在且舊值已被新值覆蓋,返回 0 。

 

  1.  > HGET  KEY_NAME  FIELD_NAME
  2. 返回給定字段的值。如果給定的字段或 key 不存在時,返回 nil 

 

  1.  > HGETALL  KEY_NAME
  2. 以列表形式返回哈希表的字段及字段值。 若 key 不存在,返回空列表。

 

  1.  > HDEL  KEY_NAME  FIELD1.. FIELDN
  2. 被成功刪除字段的數量,不包括被忽略的字段

1.8 Redis 列表(List)常用命令,其它命令參考官方文檔說明即可.

 

  1.  > LPUSH KEY_NAME VALUE1.. VALUEN
  2. Lpush 命令將一個或多個值插入到列表頭部(最左邊)
  3. 執行 LPUSH 命令后,返回列表的長度。
  4. 在Redis 2.4版本以前的 LPUSH 命令,都只接受單個 value 值

 

  1.  > RPUSH KEY_NAME VALUE1..VALUEN
  2.  用於將一個或多個值插入到列表的尾部(最右邊)。
  3. 執行 RPUSH 操作后,返回列表的長度。
  4. 在Redis 2.4版本以前的 RPUSH 命令,都只接受單個 value 值

 

  1.  > LRANGE KEY_NAME START END
  2. Lrange 返回列表中指定區間內的元素,區間以偏移量 START 和 END 指定。 其中 0 表示列表的第一個元素, 1 表示列表的第二個元素,以此類推。 你也可以使用負數下標,以 -1 表示列表的最后一個元素, -2 表示列表的倒數第二個元素,以此類推。
  3. 返回一個列表,包含指定區間內的元素

 

  1.  > LLEN KEY_NAME
  2. 移除並返回列表的第一個元素。 當列表 key 不存在時,返回 nil 。

 

  1.  > RPOP KEY_NAME
  2. 移除並返回列表的最后一個元素。 當列表不存在時,返回 nil 。

 

1.9 Redis 集合(Set)常用命令,其它命令參考官方文檔說明即可.
    1.  > SADD KEY_NAME VALUE1..VALUEN
    2. 將一個或多個成員元素加入到集合中,已經存在於集合的成員元素將被忽略
    3. 在Redis2.4版本以前, SADD 只接受單個成員值
    4. 返回被添加到集合中的新元素的數量,不包括被忽略的元素。

     

    1. > SMEMBERS KEY VALUE
    2. 返回集合中的所有成員。
    1.  > SREM KEY MEMBER1..MEMBERN
    2. Srem 命令用於移除集合中的一個或多個成員元素,不存在的成員元素會被忽略
    3. 在 Redis 2.4 版本以前, SREM 只接受單個成員值。
    4. 被成功移除的元素的數量,不包括被忽略的元素。

     

    1.10 Redis 有序集合(SortedSet)常用命令,其它命令參考官方文檔說明即可.

     

    1.  > ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN
    2. 用於將一個或多個成員元素及其分數值加入到有序集當中
    3. 如果某個成員已經是有序集的成員,那么更新這個成員的分數值,並通過重新插入這個成員元素,來保證該成員在正確的位置上
    4. 分數值可以是整數值或雙精度浮點數(分數值是排序的依據)
    5. 在 Redis 2.4 版本以前, ZADD 每次只能添加一個元素
    6. 返回被成功添加的新成員的數量,不包括那些被更新的、已經存在的成員。
    1. > ZRANGE key start stop [WITHSCORES]
    2. 其中成員的位置默認按分數值遞增(從小到大)來排序。

    3. 下標參數 start 和 stop 都以 0 為底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。

      你也可以使用負數下標,以 -1 表示最后一個成員, -2 表示倒數第二個成員,以此類推。

    4. 返回指定區間內,帶有分數值(可選)的有序集成員的列表。 
    5.  

      1.  > Zrem key member
      2. 在 Redis 2.4 版本以前, ZREM 每次只能刪除一個元素。
      3.  Zrem 命令用於移除有序集中的一個或多個成員,不存在的成員將被忽略
      4. 返回被成功移除的成員的數量,不包括被忽略的成員。
    6.  

    7. 1.11 Redis 通用命令,其它命令參考官方文檔說明即可.

      1.  > KEYS PATTERN
      2.  PATTERN 正則表達式
      3. 返回符合給定模式的 key 列表 (Array)。
      1.  > TYPE KEY_NAME
      2. 返回 key 的數據類型,數據類型有:
      3. none (key不存在)
      4. string (字符串)
      5. list (列表)
      6. set (集合)
      7. zset (有序集)
      8. hash (哈希表)
      9. > DEL KEY_NAME
      10.  

        返回被刪除 key 的數量

 

 

 1.12 Redis持久化

  Redis是一個內存數據庫,當Redis重啟后數據會丟失;所以我們要將內存中的數據持久化。

    它不能保證所有的內存數據都能持久化而不丟失,只能保證大多數數據。

 

  Redis持久化機制

  1) RDB 默認使用這種機制, 在一定間隔時間中,監測key的變化情況,然后持久化數據

    對性能影響小,推薦的方式.   生成的持久化文件就是 dump.rdb

    

    redis.conf配置文件中配置的如下內容就是RDB機制

    

  2)  AOF 日志記錄的方式,可以記錄每一條命令的操作,可以每一次命令操作后持久化.

    對性能影響大   生成的持久化文件就是 appendonly.aof

   

 

1.13 Java客戶端 Jedis

    Jedis是Java操作Redis數據庫的工具, 類似於導入一個mysql-connector-java.jar包就能通過jdbc操作mysql數據庫.

  1. 提前下載jar包(如下截圖的)

  2. 在IDEA中 File-->New-->Project-->Java Enterprise-->勾選 Create project from template-->填項目名稱及其選擇路徑.

       3. 新建lib文件夾,將包拷貝到lib目錄,並且選中lib目錄,右鍵Add as Library

  4.新建包和類,類內容如下截圖

  5.運行測試類,到Redis客戶端工具查看結果.

 

 

 

 

 

 

 

 

 

 1.14 Java客戶端 Jedis工具類

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

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



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