Redis開發與運維-第一章初識Redis筆記

個人博客http://www.lampnick.com/php/874

Redis介紹

  • 基於key-value的NoSQL數據庫
  • 數據結構
    • string字符串
    • hash哈希
    • list列表
    • set集合
    • zset有序集合
    • Bitmaps位圖
    • HyperLogLog
    • GEO地理信息定位

特性

  • 速度快,官方給出的數字是讀寫性能可以達到10萬/秒,那爲什麼有這麼快的速度呢?
    • Redis的所有數據都是存放在內存中的,這是Redis速度快的最主要原因
    • Redis是用C寫的,一般來說C實現的程序“距離”操作系統更近,執行速度相對會更快
    • Redis使用了單線程架構,預防了多線程可能產生的競爭問題
    • Redis源代碼是一個集性能和優雅於一體的優秀的開源代碼。
  • 基於鍵值對的數據結構服務器
    • Redis的值不僅可以是字符串,還可以是具體的數據結構
    • 全稱:REmote Dictionary(字典) Server
    • 主要提供了5種數據結構:字符串、哈希、列表、集合、有序集合,同時在字符串的基礎之上演變出了位圖(Bitmaps)和HyperLogLog兩種神奇的“數據結構”,並隨着LBS(Location Based Service,基於位置服務)的不斷髮展,於Redis3.2版本中加入了有關GEO(地理信息定位)的功能。
  • 豐富的功能,除了5種數據結構,還提供了許多額外的功能
    • 提供了鍵過期功能,可以用來實現緩存
    • 發佈訂閱功能,可以用來實現消息系統
    • 支持Lua腳本功能,可以利用Lua創造出新的Redis命令
    • 簡單的事務功能,能在一定程度上保證事務特性。
    • 流水線(Pipeline)功能,這樣客戶端能將一批命令一次性傳到Redis,減少網絡開鎖。
  • 簡單穩定,主要表現在三個方面
    • Redis源碼少,早期只有2萬行左右,3.0版本後添加了集羣特性,增至5萬行左右,相對於很多NoSQL數據庫來說代碼量相對要少很多,也就意味着普通的開發和運維人員完全可以喫透它
    • Redis使用單線程模型,不僅使得Redis服務端處理模型變得簡單,也使得客戶端開發變得簡單
    • Redis不需要依賴於操作系統的類庫(如Memcache需要依賴libevent這樣的系統類庫),Redis自己實現了事件處理的相關功能。
  • 客戶端語言多
    • Redis提供了簡單的TCP通信協議,編程語言可以方便的接入到Redis
  • 持久化
    • 通常看,將數據放在內存中是不安全的,一旦發生斷電或機器故障,重要的數據庫可能會丟失,因此Redis提供了兩種持久化方式:RDB和AOF,可以用兩種策略將內存的數據保存到硬盤,這樣就保證了數據的可持久性
  • 主從複製
    • 提供複製功能,實現了多個相同數據的Redis副本,複製功能是分佈式Redis的基礎
  • 高可用和分佈式
    • 從2.8版本正式提供了高可用實現Redis Sentinel,它能保證Redis節點的故障發現和故障自動轉移。3.0版本正式提供了分佈式實現Redis Cluster,它是Redis真正的分佈式實現,提供了高可用、讀寫和容量的擴展性

Redis的使用場景

Redis可以做什麼
  • 緩存
    • Redis提供了鍵值過期時間設置,並且也提供了靈活控制最大內存和內存溢出後的淘汰策略。
  • 排行榜系統
    • Redis提供了列表和有序集合數據結構,合理地使用這些數據結構可以很方便地構建各種排行榜系統。
  • 計數器應用
  • 社交網絡
  • 消息隊列系統
    • Redis提供了發佈訂閱功能和阻塞隊列的功能,雖然和專業的消息隊列比還不夠足夠強大,但是對於一般的消息隊列功能基本可以滿足。
Redis不可以做什麼
  • 從數據規模和數據冷熱來說
    • 數據規模
      • 大規模數據
      • 小規模數據
    • 數據冷熱
      • 熱數據
      • 冷數據
使用Redis的建議
  • 切勿當作黑盒使用,開發與運維同樣重要,很多線上的故障和問題都是由於完全把Redis當做黑盒造成的,如果不瞭解Redis的單線程模型,有些開發者會在有上千萬個鍵的Redis上執行keys*操作,如果不瞭解持久化的相關原理,會在一個寫操作量很大的Redis上配置自動保存RDB。
  • 閱讀源碼
Redis的安裝
  • 安裝

    # wget http://download.redis.io/releases/redis-3.0.7.tar.gz
    # tar -zxvf redis-3.0.7.tar.gz
    # ln -s redis-3.0.7 redis
    # cd redis
    # make && make install
    安裝完成後,在src和/usr/local/bin目錄下多了幾個redis開關的可執行文件,稱之爲Redis shell
    
  • 安裝之後生成的可執行文件如下

    • redis-server 啓動停止redis
    • redis-cli Redis命令行客戶端
    • redis-benchmark Redis基準測試工具
    • redis-check-aof Redis AOF持久化文件檢測和修復工具
    • redis-check-dump Redis RDB持久化文件檢測和修復工具
    • redis-sentinel 啓動Redis Sentinel
  • 啓動Redis

    • 默認配置
      這種方法會使用Redis的默認配置來啓動,下面就是redis-server執行後輸出的相關日誌
      [root@worker1 redis]# redis-server
      48923:C 13 Nov 15:44:54.871 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
      48923:M 13 Nov 15:44:54.872 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                      _._                                                  
                 _.-``__ ''-._                                             
            _.-``    `.  `_.  ''-._           Redis 3.0.7 (00000000/0) 64 bit
        .-`` .-```.  ```\/    _.,_ ''-._                                   
       (    '      ,       .-`  | `,    )     Running in standalone mode
       |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
       |    `-._   `._    /     _.-'    |     PID: 48923
        `-._    `-._  `-./  _.-'    _.-'                                   
       |`-._`-._    `-.__.-'    _.-'_.-'|                                  
       |    `-._`-._        _.-'_.-'    |           http://redis.io        
        `-._    `-._`-.__.-'_.-'    _.-'                                   
       |`-._`-._    `-.__.-'    _.-'_.-'|                                  
       |    `-._`-._        _.-'_.-'    |                                  
        `-._    `-._`-.__.-'_.-'    _.-'                                   
            `-._    `-.__.-'    _.-'                                       
                `-._        _.-'                                           
                    `-.__.-'                                               
      
      48923:M 13 Nov 15:44:54.872 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
      48923:M 13 Nov 15:44:54.872 # Server started, Redis version 3.0.7
      48923:M 13 Nov 15:44:54.872 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
      48923:M 13 Nov 15:44:54.872 * The server is now ready to accept connections on port 6379
      直接使用redis-server啓動Redis後,會打印出一些日誌,通過日誌可以得知
          - 當前的Redis版本爲3.0.7
          - Redis默認端口是6379
          - Redis建議使用配置文件來啓動
      
    • 運行啓動
      redis-server加上要修改的配置名和值(可以多對),沒設置的配置將使用默認配置
      # redis-server --configKey1 configValue1 --configKey2 configValue2
      如要用6380作爲端口啓動Redis,那麼執行
      
    • 配置文件啓動
      例如將配置寫到/opt/redis/redis.conf,只需要執行如下命令就可以啓動Redis
      # redis-server /opt/redis/redis.conf
      
  • Redis命令行客戶端

    • redis-cli可以使用兩種方式連接Redis服務器
      • 第一種是交互式方式
        [root@worker1 redis]# redis-cli -h 127.0.0.1 -p 6379
        127.0.0.1:6379> set hello world
        OK
        127.0.0.1:6379> get hello
        "world"
        
      • 第二種是命令方式
        [root@worker1 redis]# redis-cli -h 127.0.0.1 -p 6379 get hello
        "world"
        
    • Redis提供了shutdown命令來停止Redis服務,如要停掉127.0.0.1上的6379端口上的服務
      [root@worker1 redis]# redis-cli shutdown
      在服務端能看到輸出如下日誌
      77022:M 13 Nov 16:18:52.551 # User requested shutdown...
      77022:M 13 Nov 16:18:52.551 * Saving the final RDB snapshot before exiting.
      77022:M 13 Nov 16:18:52.569 * DB saved on disk
      77022:M 13 Nov 16:18:52.569 # Redis is now ready to exit, bye bye...
      當再次連接時,連接拒絕
      [root@worker1 redis]# redis-cli -h 127.0.0.1 -p 6379 get hello
      Could not connect to Redis at 127.0.0.1:6379: Connection refused
      
      • 三點需要注意
        • Redis關閉的過程:斷開與客戶端的連接、持久化文件生成,是一種 相對優雅的關閉方式。
        • 除了可以通過shutdown命令關閉Redis服務以外,還可以通過kill進程號的方式關閉掉Redis,但是不要粗暴地使用kill -9強制殺死Redis服務,不但不會做持久化操作,還會造成緩衝區等資源不能被優雅關閉,極端情況會造成AOF和複製丟失數據的情況。
        • shutdown還有一個參數,代表是否在關閉Redis前,生成持久化文件:redis-cli shutdown nosave|save
  • Redis版本

    • 規則
      Redis借鑑了Linux操作系統對於版本號的命名規則:版本號第二位如果是奇數,則爲非穩定版本(例如2.7、2.9、3.1),如果是偶數,則爲穩定版本(例如2.6、2.8、3.0、3.2)。當前奇數版本就是下一個穩定版本的開發版 本,例如2.9版本是3.0版本的開發版本。所以我們在生產環境通常選取偶數版本的Redis,如果對於某些新的特性想提前瞭解和使用,可以選擇最新的 奇數版本。
      
總結
  • Redis的8個特性:速度快、基於鍵值對的數據結構服務器、功能豐富、簡單穩定、客戶端語言多、持久化、主從複製、支持高可用和分佈式。
  • Redis並不是萬金油,有些場景不適合使用Redis進行開發。
  • 開發運維結合以及閱讀源碼是用好Redis的重要方法。
  • 生產環境中使用配置文件啓動Redis。
  • 生產環境選取穩定版本的Redis。(偶數)
  • Redis3.0是重要的里程碑,發佈了Redis官方的分佈式實現Redis Cluster。
參考來自Redis開發與運維書籍
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章