搞定Redis(一)Redis的安裝和五大基本數據類型

一、Redis概述及安裝

  1、概述:

    1.1、Redis是一個開源的key – value存儲系統。

    1.2、和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set — 有序集合)和hash(哈希類型)。

    1.3、這些數據類型都支持push/pop、add/remove以及取交集、並集、和差集等更豐富的操作,而且這些操作都是原子性的。

    1.4、Redis支持各種不同形式的排序

    1.5、與Memcached一樣,為了保證效率,數據都是緩存在內存中

    1.6、Redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件。

  2、應用場景

    2.1、配合關係型數據庫做高速緩存。

      2.1.1、高頻次、熱門訪問的數據,降低IO操作。

      2.1.2、分佈式架構,做session共享。

    2.2、多樣數據結構存儲持久化數據。

  3、安裝

    3.1、下載

      3.1.1、前往Redis官網://redis.io/

      3.1.2、點擊下載鏈接

        

    3.2、安裝

      3.2.1、Linux系統下安裝gcc

        

      3.2.2、把下好的壓縮包上傳至/opt目錄下、並解壓

        

      3.2.3、進入解壓好的文件夾 進行編譯

        

      3.2.4、進行安裝

        

          安裝好的文件在/usr/local/bin目錄下

    3.3、安裝目錄下(/usr/local/bin)內容簡介

      3.3.1、redis-benchmark:性能測試工具

      3.3.2、 redis-check-aof:修復有問題的AOF文件,後面rdb和aof具體講述

      3.3.3、 redis-sentinel:Redis集群使用

      3.3.4、 redis-server:Redis服務啟動程序

      3.3.5、 redis-cli:客戶端操作工具

  4、啟動

    4.1、前台啟動:關閉窗口後就不再繼續運行

        

      

 

     4.2、後台啟動

      4.2.1、把/opt/redis 6.2.4中的redis.conf複製到/etc下面。

      4.2.2、進入/etc目錄,使用vim編輯器打開redis.conf配置文件。更改daemonize屬性值為yes。

      4.2.3、使用redis-server /etc/redis.conf 命令後台啟動redis。

      4.2.4、可使用進程編號結束運行。

  5、Redis相關介紹    

    5.1、Redis默認有16個數據庫,即 0號庫 ~ 15號庫。

    5.2、使用select <dbid>來切換數據庫。

    5.3、同一密碼管理,所有庫的密碼相同。

    5.4、dbsize查看當前庫key的數量

    5.5、flushdb清空當前庫,flushall清空所有庫。

    5.6、Redis底層是使用單線程+多路IO復用的方式

  6、對於Redis鍵的操作

    6.1、keys *  :查看當前庫所有的key。

      

    6.2、exists key  :判斷某個key是否存在。

      

    6.3、type key  :查看key的類型。

      

    6.4、del key  :刪除指定key的數據。

      

    6.5、unlink key  :根據key非阻塞刪除(異步操作)。

      

    6.6、expire key s :給key設置s秒的過期時間。

      

    6.7、ttl key  :查看key的剩餘過期時間。

      

    6.8、select 庫編號  :切換數據庫。

      

    6.9、dbsize  :查看當前數據庫的key的數量。

      

    6.10、fiushdb  :清空當前數據庫。

      

    6.11、flushall  :清空所有數據庫。

二、常用五大數據類型

  1、String:Redis字符串

    1.1、簡介

      1.1.1、String是Redis最基本的類型,你可以理解為與Memcached一模一樣的類型,一個key對應一個value。

      1.1.2、String類型是二進制安全的。意味着Redis的String可以包含任何數據。

      1.1.3、String類型是Redis最基本的數據類型,一個字符串value最多可以是512M。

    1.2、常用命令

      1.2.1、set <key> <value>添加或更新鍵值對。

        

          當key已存在時會更新對應key的value

        

      1.2.2、setnx <key> <value> 當數據庫中key不存在時可以將key-value添加到數據庫

        

      1.2.3、get <key>查詢對應key的值。

        

       1.2.4、append  <key> <value>將給定的value追加原值的末尾

        

      1.2.5、strlen <key> 獲取值得長度

        

 

 

      1.2.6、incr <key>  將key中存儲的數字值增1,只能操作數字,如果為空新增值為1。

        

      1.2.7、decr <key> 將key中存儲的數字值減1,只能操作數字,如果為空新增值為-1。

        

      1.2.8、incrby <key> <num>將key中的值增加指定量。

        

 

 

      1.2.9、incrby <key> <num>將key中的值減去指定量。

        

 

 

       1.2.10、mset <key1> <value1> <key2> <value2>······   同時設置一個或多個key-value。

        

 

 

      1.2.11、mget <key1> <key2> <key3>······同時獲取一個或多個value。

        

 

 

      1.2.12、msetnx<key1> <value1> <key2> <value2>······   同時設置一個或多個key-value,只有所有key都不存在時才能存儲成功。

        

 

 

         具有原子性,有一個失敗則都失敗。

        

 

 

      1.2.13、getrange <key> <起始位置> <結束位置>  獲取key對應value指定位置的值(閉區間)

        

      1.2.14、setrange <key> <起始位置> <value>用value覆寫起始位置後的值(索引從0開始)。

        

 

 

      1.2.15、setex <key> <過期時間> <value> 設置值得同時設置過期時間,單位秒。

        

 

 

      1.2.16、getset <key> <value>以新換舊,設置新值同時獲取舊值

        

 

 

    1.3、數據結構

      String的數據結構為簡單動態字符串(Simple Dynamic String)。是可以修改的字符串,內部結構實現類似Java的ArrayList,採用預分配冗餘空間的方式來減少內存分配。                     

     內部為當前字符串實際分配的空間capacity一般要高於實際字符串長度len。當字符串長度小於1M時,擴容都是加倍現有的空間,如果超過1M,擴容一次只會擴容1M的空間。需要注意的是字符串最大長度為512M。

  2、List:Redis列表

    2.1、簡介:

      2.1.1、特點:單間多值。

      2.1.2、Redis列表是簡單的字符串列表,按照插入時的順序排序。可以選擇從列表的頭部或尾部添加。

      2.1.3、它的底層實際是個雙向鏈表,對兩端的操作性能很高,通過索引操作中間索引性能較差。

        

    2.2、常用命令

      2.2.1、lpush/rpush <key> <value1> <value2> <value3>·······   從左邊或右邊插入一個或多個值。

        

      2.2.2、lpop/rpop <key> 從左邊或右邊取出一個值。值在鍵在,值光鍵亡

        

      2.2.3、rpoplpush <key1> <key2> 從key1列表右邊吐出一個值,插到key2列表左邊。

        

      2.2.4、lrange <key> <start> <stop>按照下標獲得元素(從左到右)。(-1代表右邊第一個)

        常規用法上方已有操作

        獲取全部內內容:

        

 

 

      2.2.5、lindex <key> <index> 根據索引獲取元素(從左至右)。

        

 

 

      2.2.6、llen <key> 獲取列表長度

        

      2.2.7、linsert<key> before/after <value> <newvalue>  在value 前 / 後 插入newvalue

        

      2.2.8、lrem <key> <n> <value>從左邊刪除n個value(從左至右)。

        

      2.2.9、lset <key> <index> <value>將下標為index的值替換為value

        

    2.3、數據結構

      List的數據結構為快速鏈表。

      首先在列表元素比較少的時候使用一塊連續的內存存儲,這個結構是zipList,即壓縮鏈表。

      它將所有的元素緊挨着存儲在一起,分配的是一塊連續的內存。

      當數據量比較多的時候,才會改為quickList。

      因為普通的鏈表需要的附加指針空間太大,會比較浪費空間。比如這個列表裡存的只是int類型的數據,結構上還需要兩個而外的指針prev和next。

      

 

 

       Redis將鏈表和zipList結合起來組成了quickList。也就是將多個zipList使用雙向指針串起來使用。這樣既滿足了快速插入性能,又不會出現太大的空間冗餘。

  3、Set:Redis集合

    3.1、簡介:

        Redis set對外提供的功能與list類似,是一個列表的功能,特殊之處在於set是可以自動排重的,當你需要存儲一個列表數據,有不希望出現重複數據時,set是一個很好地選擇。並且set提供了判斷某個成員是否在一個set集合內的重要接口,這也是list所不能提供的。

        Redis的set是String類型的無序集合它的底層其實是一個value為null的hash表,所以添加,刪除,查找的複雜度都是O(1)

    3.2、常用命令

      3.2.1、sadd <key> <value1><value2>······將一個或多個元素加入到集合中,若該集合中已存在某個元素則該重複元素會被忽略。

        

      3.2.2、smembers <key>取出該集合的所有值。

        

      3.2.3、sismember <key> <value> 判斷集合中是否包含指定元素,有返回1,沒有則返回0。

        

      3.2.4、scard <key> 返回該集合的元素個數。

        

      3.2.5、srem <key> <value1> <value2> ······刪除集合中的元素 

        

      3.2.6、spop <key> 從集合中隨機彈出一個元素。

        

      3.2.7、srandmember <key> <n> 隨機從該集合中取出n個值,但不會從集合中刪除。

        

 

 

       3.2.8、smove <source> <destination> <value>  把集合中的一個元素移動到另一個集合中

        

 

 

      3.2.9、sinter <key1> <key2>返回兩個集合的交集

        

      3.2.10、sunion <key1> <key2>返回兩個集合的並集

        

      3.2.11、sdiff <key1> <key2>返回兩個集合的差集。即key1中有但key2中沒有的。

        

 

 

     3.3、數據結構

      Set數據結構是dict字典,使用哈希表實現的。

      類似於Java中的HashSet內部實現使用的是HashMap,只不過所有的value都指向同一個對象。

      Redis的set結構也是一樣,它的內部使用的是hash結構,所有的value指向同一個內部值。

  4、Hash:Redis哈希

    4.1、簡介:

      Redis Hash是一個鍵值對集合。

      RedisHash是一個String類型的fildvalue的映射表,適合用於存儲對象信息。

      類似Java里的Map<String , Object>。

      

 

 

    4.2、常用命令

      4.2.1、hset <key> <field> <value> 給key集合中的field賦值value。

        

      4.2.2、hget<key><field>從key中取出field對應的值。

        

      4.2.3、hmset <key> <field1> <value1> <field2> <value2>·······批量設置hash的值。

        

      4.2.4、hexists<key><field>查看哈希表key中給定域field是否存在。

        

      4.2.5、hkeys <key>列出該集合的所有field。

        

      4.2.6、hvals <key>列出該集合的所有value。

        

      4.2.7、hincrby <key> <field> <increment> 給key中的field對應的value加上指定值。

        

      4.2.8、hsetnx <key> <field> <value> 給key集合中的field賦值value,只有field不存在時才能添加成功。

         

    4.3、數據結構

      Hash類型對應的數據結構是兩種,zipList(壓縮列表),hashTable(哈希表)。當field-value長度較短,且個數較少時使用zipList,否則使用hashTable。

  5、Zset:Redis有序集合

    5.1、簡介:

      zset與普通集合set相似,是一個沒有重複元素的字符串集合。

      不同之處是有序集合的每個成員都關聯了一個評分,這個評分按照從低到高的方式排列集合成員。集合的成員是唯一的,但是評分是可以重複的

    5.2、常用操作  

      5.2.1、zadd <key> <score1> <value1> <score2> <value2>·······將一個或多個member元素及其score值加入到key中。

        

      5.2.2、zrange <key> <start> <stop> 返回有序集合中下標在start和stop之間的元素

        

      5.2.3、zrangebyscore <key> <min> <max>返回有序集合中score值介於min和max之間的成員,按score遞增的方式排列。

        

      5.2.4、zrevrangebyscore <key> <min> <max>返回有序集合中score值介於min和max之間的成員,按score遞遞減的方式排列。

        

 

 

      5.2.5、zincrby <key> <increment> <value> 為元素的score加上增量。

        

      5.2.6、zrem <key> <value> 刪除該集合下指定的元素。

        

      5.2.7、zcount<key> <min> <max>統計該集合分數區間元素個數。

        

      5.2.8、zrank <key> <value> 返回該值在集合中的排名。(從小到大排)

        

    5.3、數據結構

      zset底層使用了兩個數據結構

      (1)、hash,hash的作用就是關聯value和權重score,保障元素value的唯一性,可以通過value找到相應的score值。

      (2)、跳躍表,跳躍表的目的在於給元素value排序,根據score的範圍獲取元素列表。

Tags: