.Net轉Java自學之路—Redis篇

Redis:前端

  關係型數據庫(SQL):MySQL、Oraclemysql

    特色:數據與數據之間,表與字段之間,表與表之間是存在關係的c++

    優勢:
      一、數據之間有關係,進行數據的增刪改查時很是方便。
      二、關係型數據庫,有事物操做。保證數據的完整性。redis

    缺點:
      一、由於數據和數據之間有關係,是由底層大量算法保證的。大量算法會拉低系統運行速度。大量算法會消耗系統資源
      二、海量數據的增刪改查時,會顯的無能爲力。在作某些操做時,極可能會宕機(卡死)
      三、在海量數據環境下對數據表進行維護/擴展,也會變得無能爲力。適合處理通常量級的數據。保證的是安全。算法

  非關係性數據庫(NOSQL):Redis、mongoDBsql

    爲了處理海量數據,須要將關係型數據庫的關係 去掉。非關係型數據庫設計之初,是爲了替代關係型數據庫的。數據庫

    優勢:
      一、海量數據的增刪改查,很是輕鬆。
      二、海量數據的維護/擴展,也會很是輕鬆。後端

    缺點:
      一、由於數據與數據之間沒有關係,因此不能一目瞭然。
      二、非關係型數據庫,沒有關係,沒有強大的事物來保證數據的完整和安全。緩存

    適合處理海量數據,保證的是效率。不必定安全。安全

  NoSql數據庫的四大分類:

    一、鍵值(Key-Value)存儲數據庫。

      相關產品:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
      典型應用:內容緩存,主要用於處理大量數據的高訪問負載
      數據模型:一系列的鍵值對。
      優點:優秀的快速查詢,穩定性強。
      劣勢:存儲的數據缺乏結構化。

    二、列存儲數據庫

      相關產品:Cassandra、HBase、Riak
      典型應用:分佈式的文件系統。
      數據模型:以列簇式存儲,將同一列數據存儲在一塊兒。
      優點:查找速度快,可擴展性強,更容易進行分佈式擴展
      劣勢:功能相對侷限,使用極大的內存纔可調配,且系統處理算法時將有數秒,甚至更長時間的不可用,致使大量處理超時。

    三、文檔型數據庫(淘汰)

      相關產品:CouchDB、MongoDB
      典型應用:Web應用(與Key-Value相似,Value時結構化的)
      數據模型:一系列鍵值對
      優點:數據結構要求不嚴格
      劣勢:查詢性能不高,並且缺少統一的查詢語法。

    四、圖形(Graph)數據庫:

      相關產品:Neo4J、InfoGrid、Infinite Graph
      典型應用:社交網絡(關係網)
      數據模型:圖結構
      優點:利用圖結構相關算法。
      劣勢:須要對整個圖作計算才能得出結果,不容易作分佈式的集羣方案。侷限性過強。

  Redis使用環境:
    一、能夠做爲關係型數據庫的緩存存在。
    二、能夠作任務隊列。
    三、能夠作大量數據運算。
    四、能夠作大量數據的排行榜。  

  Linux系統 Redis 安裝:

    redis是C語言開發,安裝redis須要先將官網下載的源碼進行編譯,編譯依賴gcc環境。若是沒有gcc環境,須要安裝gcc:yum install gcc-c++

    一、上傳redis.tar.gz的安裝包。並解壓到當前目錄:tar -zxvf redis-3xxxxx.tar.gz

    二、編譯redis(編譯,將.c文件編譯爲.o文件)
      進入解壓文件夾:cd redis-3xxxxx
      執行 make
      若是沒有安裝gcc,編譯將出現錯誤提示。(安裝失敗,必須刪除文件夾,從新解壓)

    三、安裝:make PREFIX=/usr/local/redis install
      PREFIX指定的目錄能夠隨意指定。
      安裝完後,在/usr/local/redis/bin下有幾個可執行文件:
        redis-benchmark >> 性能測試工具
        redis-check-aof >> AOF文件修復工具
        redis-check-dump >> RDB文件檢查工具(快照持久化文件)
        redis-cli >> 命令行客戶端
        redis-server >> redis服務器啓動命令

    四、回到根目錄:cd ~ 進入redis-3xx 文件中,
      Copy複製redis.conf文件到/usr/local/redis目錄下(和bin同級目錄中)

    注:若沒有配置文件redis也能夠啓動,不過將啓動默認配置,不方便修改端口號等信息。

  Redis啓動:對應默認端口號6379

    前端啓動:進入/usr/local/redis文件夾下:./bin/redis-server 啓動
      啓動客戶端:./bin/redis-cli 或 ./bin/redis-cli -h IP地址 -p 6379
      缺點:沒法部署集羣。

    後端啓動:修改redis.conf配置文件,將daemonize改成yes之後端模式啓動
      啓動時,指定配置文件:進入/usr/local/redis:cd /usr/local/redis
      啓動:./bin/redis-server ./redis.conf

  Redis關閉:

    一、查詢PID,kill -9 pid 殺死進程。
      至關於斷電,非正常關閉,極可能會形成數據丟失。
    二、正常關閉:正常關閉,數據保存
      ./bin/redis-cli shutdown

Redis數據類型:

  redis使用的時鍵值對 保存數據。至關於Map 。

  key:都是字符串。key名都是自定義的。

  value:對應五種數據類型

    一、String字符串
    二、hash:數據格式相似於JSON
      例:{uname:"zs",age:"18"}
    三、list集合: 至關於Java中的LinkedList鏈表。添加/刪除效率極高。
      例:[1,2,3,4]
    四、set:至關於Java中的HashSet
      例:['a','b','c']
    五、有序的set集合:
      例:[1000 'a',100 'b' 10 'c']

  String:

    字符串類型時Redis中最爲基礎、經常使用的數據存儲類型。字符串在Redis中二進制安全的。這意味者該類型存入和獲取的數據相同。在Redis中字符串類型的Value最多能夠容納的數據長度爲512M。

    二進制安全和數據安全是沒有關係的。

    MySQL關係型數據庫,二進制不安全。由於存儲的編碼和取出的編碼格式不一致,會形成亂碼而丟失數據。

      一、頻繁的編解碼會浪費大量的系統性能。

      二、頻繁的編解碼極可能由於碼錶不一樣致使亂碼。

      因此二進制不安全。

    Redis非關係型數據庫,二進制安全。

      一、編解碼都是在客戶端完成的。沒有頻繁編解碼,執行效率高。

      二、沒有頻繁編解碼,不會出現亂碼。

      因此二進制數據安全。

    賦值(增、改):

      set key value :設定key只有指定的字符串value
        若是該key存在則進行覆蓋(修改)操做。老是返回"OK"

    取值(查):

      get key:獲取key的value。若該key的關聯的value不是String類型,redis將返回錯誤信息,由於get命令只能用於獲取String類型的value;若該key不存在,返回(nil)。

    刪:

      del key :刪除指定key。返回值是數字類型。表示刪除幾條數據。

    擴展:

      getset key value:先獲取該key的值,再設置該key的值。

      incr key:將指定的key的value原子性的遞增1。
        若該key不存在,其初始值爲0,再incr以後其值爲1。
        若value的值不能轉成整型,該操做將執行失敗並返回相應的錯誤信息。

      decr key:將指定的key的value原子性的遞減1。
        若該key不存在,其初始值爲0,再decr以後其值爲-1。
        若value的值不能轉成整型,該操做將執行失敗並返回相應的錯誤信息。

      append key value:拼湊字符串。
        若該key存在,則在原來的value後追加該值。
        若該key不存在,則從新建立一個key,並賦值value。

      incrby key increment:將指定的key的value原子性增長increment。
        若該key不存在,其初始值爲0,在incrby後,其值爲increment。
        若該值不能轉成整型,則失敗並返回錯誤信息。

      decrby key decrement:將指定的key的value原子性減小decrement。
        若該key不存在,其初始值爲0,在decrby後,其值爲decrement。
        若該值不能轉成整型,則失敗並返回錯誤信息。

    String的使用環境:主要用於保存JSON格式的字符串。

  hash:

    Redis中的Hash類型能夠堪稱具備String key和String value的map容器。每個Hash能夠存儲4294967295個鍵值對。

    賦值:

      hset key field value :爲指定的key設定field/value對(鍵值對)。至關於 增。

      hmset key field value field1 value1...:爲指定的key設定多個field/value對(鍵值對)。

    取值:

      hget key field:獲取指定的key的field值。

      hmget key field field1...:獲取指定key的多個field值。

      hgetall key:獲取key中的全部field-value。

    刪除:

      hdel key field field1...:刪除一個或多個field字段。

      del key:刪除正個hash。

    擴展:

      hincrby key field increment :設置key中field的值增長increment。

      hexists key field :判斷指定的key中filed是否存在。

      hlen key :獲取key所包含的field的數量。

      hkeys key :獲取全部的字段。

      hvals key :獲取全部的value。

  list:

    鏈表LinkList。Redis操做中,最多的操做是進行元素的增刪。

    使用環境:

      一、作大數據集合的增刪
      二、作任務隊列

    賦值:

      lpush key values[value1 value2...]:在指定的key所關聯的list頭部插入全部的values。
        若該key不存在,該命令在插入的以前建立一個與該key關聯的空鏈表,以後再向該鏈表的頭部插入數據。插入成功,返回元素的個數。
        例:lpush list1 a b c d

      rpush key values[value1 value2...]:在該list的尾部添加元素。
        例:rpush list2 a b c d

    取值:

      lrange key start end:獲取鏈表中從start到end的元素的值。start、end從0開始計數;也可爲負數。
        若爲-1 則表示鏈表尾部的元素;-2 則表示倒數第二個元素;以此類推...
        例:取所有元素:lrange key 0 -1

    刪除:

      lpop key:返回並彈出指定的key關聯的鏈表中的第一個元素,即頭部元素。
        若該key不存在,返回nil;
        若該key存在,則返回鏈表的頭部元素。

      rpop key:從尾部彈出元素。

    擴展:

      llen key:返回指定的key關聯的鏈表中的元素的數量。

      lrem key count value:刪除某種元素。效率極爲低下。刪除count個值爲value的元素。
        若count大於0,從頭向尾遍歷並刪除count個值爲value的元素。
        若count小於0,則從尾向頭遍歷並刪除正數count個值爲value的元素。
        若count等於0,則刪除鏈表中全部等於value的元素。
        例:lrem list1 0 a 表示從左刪除list1中全部的a
          lrem list1 2 a 表示從頭刪除list1中的2個a
          lrem list1 -2 a 表示從尾刪除list1中的2個a

      lset key index value:經過索引替換元素。效率不高。設置鏈表中的index的角標的元素值。0表明鏈表的頭元素,-1表明鏈表的尾元素。操做鏈表的角標不存在則拋異常。

      linsert key before/after prvot value:從索引前/後插入元素。效率不高。在pivot元素前或後插入value這個元素。

      rpoplpush resource destination:將鏈表中的尾部元素彈出並添加到頭部。[循環操做]
        例:rpoplpush list1 list2 倆隊排列
          rpoplpush list1 list1 循環隊列

  set:

    set集合中不容許出現重複的元素。

    做用:在Redis操做中,涉及到倆個大數據集合的並集、交集、差集的運算。

    賦值:

      sadd key values[value一、value2...]:向set中添加數據,若該key的值已存在則不會重複添加
        例:sadd set1 a b c d

    取值:

      smembers key :獲取set中全部元素。
        例:smembers set1

      sismember key member:判斷參數中指定的成員是否在該set中。1 表示存在,0 表示不存在或該key自己就不存在。不管集合中有多少元素均可以極快的返回結果。
        例:sismember set1 a 判斷集合set1中是否有a元素

    刪除:

      srem key values[value一、value2...]:刪除set中指定的元素
        例:srem set1 a c

    差集運算:

      sdiff key1 key2...:返回key1與key2中相差的元素,並且與key的順序有關。即返回差集。

    交集運算:

      sinter key1 key2 key3...:返回交集

    並集運算:

      sunion key1 key2 key3...:返回並集

    擴展:

      scard key:獲取set中元素的數量。

      srandmember key :隨機返回set中的一個元素。

      sdiffstore destination key1 key2...:將key一、key2相差的元素存儲在destination上
        例:sdiffstore set1 set2 set3  將set2與set3的差集元素存儲到set1中。

      sinterstore destination key[key...]:將返回的交集存儲在destination上
        例:siterstore set1 set2 set3  將set2與set3的交集元素存儲到set1中。

      sunionstore destination key[key...]:將返回的並集存儲在destination中
        例:sunionstore set1 set2 set3  將set2與set3的並集元素存儲到set1中。

  有序set集合:

    有序且不重複。有序set集合專門用來作排行榜。

    賦值:

      zadd key score member score2 member2...:將全部元素以及該元素的分數存放到sorted-set中。若該元素已經存在,則會用新的分數替換原有的分數。返回值是新加入到集合中的元素個數,不包含以前已經存在的元素。
        例:zadd set1 1000 zhangsan 100 lisi 10 王五

    查看:

      zscore key member:返回指定元素的分數。
        例:zscore set1 zhangsan

      zcard key : 獲取集合中的元素數量
        例:zcard set1

      zrange key start end[withscores]:範圍查詢。獲取集合中腳標爲start-end的元素,[withscores]參數代表返回的元素包含分數。
        例:zrange set1 0 -1  查詢全部元素。正序排列。由小到大
          zrange set1 0 -1 withscores  查詢全部元素。而且帶有各自的分數。正序。由小到大

      zrevrange key start end[withscores]:範圍查詢。獲取集合中腳標爲start-end的元素,[withscores]參數代表返回的元素包含分數。
        例:zrevrange set1 0 -1  查詢全部元素。倒序排列。由大到小
          zrevrange set1 0 -1 withscores  查詢全部元素。而且帶有各自的分數。倒序。由大到小

    刪除:

      zrem key member[member...]:刪除集合中指定元素。能夠指定多個。
        例:zrem set1 zhangsan lisi

      zremrangebyrank key start stop:按照排名範圍刪除元素。
        例:zremrangebyrank set1 0 1  刪除前倆名

      zremrangebyscore key min max:按照分數範圍刪除元素。
        例:zremrangebyscore set1 50 500  刪除分數在50到500之間的元素

    擴展:

      zrangebyscore key min max[withscores][limit offset count]:返回分數在min-max的元素並按照分數從低到高排序。[withscores]:顯示分數;[limit offset count]:offset,代表從腳標爲offset的元素開始,並返回count個元素。
        例:zrangebyscore set1 50 500  返回分數在50-500之間的元素。
          zrangebyscore set1 50 500 withscores  返回分數在50-500之間的元素。加上分數。
          zrangebyscore set1 50 500 withscores limit 0 1  返回分數在50-500之間的元素。加上分數。而且只查前1個元素。

      zincrby key increment member:設置指定成員的增長分數。返回更改後的分數
        例:zincrby set1 10 zhangsan  給zhangsan增長10分。

      zcount key min max: 獲取分數在min-max之間的元素。
        例:zcount set1 50 500  計算50-500分數之間的元素由多少

      zrank key member:返回成員在集合中的排名。索引(從小到大)
        例:zank set1 zhangsan  返回zhangsan的排名。

      zrevrank key member:返回元素在集合中的排名。索引(從大到小)
        例:zrevrank set1 zhangsan  返回zhangsan的排名。

  通用命令:

    keys pattern:獲取全部與pattern匹配的key,返回全部與該key匹配的keys。
      通配符:
        *:表示任意一個或多個字符。
        ?:表示任意一個字符。
      例:keys * 查詢全部的key
        keys ???? 查詢key長度是四位的key名。
        keys *name* 查詢key名包含name的key名。

    del key1 key2...:刪除指定的key。能夠指定多個。

    exites key:判斷該key是否存在,1表明存在。0表明不存在。

    rename key newkey:爲當前的key重命名。

    type key:獲取指定key的類型。該命令將以字符串的格式返回。返回的字符串爲string、list、set、hash和zset。若是key不存在,則返回none。

  設置key有效時間:

    expire key:設置過時時間。單位:秒

    ttl key:獲取該key所剩的超時時間,若沒有設置超時,返回-1。若返回-2,表示超時不存在。

  消息訂閱與發佈:

    subscribe channel:訂閱頻道。
      例:subscribe mychat 訂閱mychat這個頻道。

    psubscribe channel*:批量訂閱頻道。
      例:psubscribe s* 訂閱以s開頭的頻道。

    publish channel content:在指定的頻道中發佈消息。
      例:publish mychat 'abcdefg'

  多數據庫:

    Redis的數據庫已經提早建立好了,默認有16個數據庫。數據庫的名字是0,1,2...15號數據庫。在redis上所作的全部數據操做,都是默認在0號數據上操做的。數據庫與數據庫之間,是不能共享鍵值對的。

    切換數據庫:select 數據庫名(1,2,3...15)

    把某個鍵值對進行數據庫的移植:move key 1:將key鍵移植到1號數據庫中。

    清空當前數據庫:flushdb

    清空全部的數據庫內容:flushall

  事物:
    mysql的事物是爲了保證數據完整性,安全。

    Redis的事物是爲了進行redis語句的批量化執行。

    multi:開啓事物,用於標記事物的開始,其後執行的命令都將被存入命令隊列,知道執行EXEC時,這些命令纔會被原子的執行。
      相似與關係型數據庫中的:begin transaction

    exec:提交事物,相似與關係型數據庫中的:commit

    discard:事物回滾,相似與關係型數據庫中的:rollback

  瞭解命令:

    ping:返回PONG爲已成功連通

    echo:在命令行打印一些內容  echo hehe

    select:切換數據庫  select 1

    quit:退出客戶端。等同於:Ctrl+C

    dbsize:返回當前數據庫中key的數量。

    info:獲取服務器的信息和統計。

  持久化:把數據保存在硬盤上。

    關係型數據庫MySQL-持久化:

      任何的增刪改語句,都是在硬盤上作的操做。
      斷電之後,硬盤上的數據仍是存在。

    非關係型數據庫Redis-持久化:

      默認狀況下,全部的增刪改,數據都是在內存中進行操做。
      斷電之後,內存中的數據不存在。redis的部分數據會丟失,丟失的數據時保存在內存中的數據。因此Redis是存在持久化操做的。

    Redis有倆種持久化策略:

      RDB:是Redis的默認持久化機制。RDB至關於照快照,保存的是一種狀態。

        優勢:
          一、快照保存數據速度極快,還原數據速度極快。
          二、適用於災難備份。

        缺點:
          一、小內存機器不適合使用。由於RDB機制符合要求就會照快照。(隨時隨地啓動)會佔用部分系統資源(忽然的佔用),極可能內存不足直接宕機。

        適用於:內存比較充裕的計算機。

        RDB什麼時候進行照快照:
          一、服務器正常關閉時,照快照。
          二、key知足必定條件時,照快照。

        配置說明:
          一、save 900 1:每900秒至少有一個key發生變化,則dump內存快照。
          二、save 300 10:每300秒至少有10個key發生變化,則dump內存快照。
          三、save 60 10000:每60秒至少10000個key發生變化,則dump內存快照。

      AOF:

        使用日誌功能保存數據的操做。適用於:內存比較小的計算機。

        每秒同步(默認):每秒進行一次AOF保存數據。安全性低,但比較節省系統資源。

        每修改同步:只要有key變化語句,就進行AOF保存數據。比較安全,但極爲浪費系統資源。

        不一樣步:不進行任何持久化操做。不安全。

        AOF操做:
          只會保存致使key變化的語句。

        AOF配置:

          AOF默認時關閉的。

          開啓AOF:
            一、appendonly yes
            二、放開 appendfsync always

          always:每次有數據修改發生時都會寫入AOF文件。
          everysec:每秒同步一次,該策略爲AOF的缺省策略。
          no:從不一樣步,高效但數據不會被持久化。

        優勢:
          持續性佔用極少許的內存資源。

        缺點:
          一、日誌文件會特別大,不適用於災難恢復。
          二、恢復效率遠遠低於RDB。

  Jedis:

    全部的Redis命令,Jedis都有對應的方法。

    Java中鏈接Redis數據庫須要開啓Linux中Redis對應的端口號:

      /shin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
      /etc/rc.d/init.d/iptables save

    單實例鏈接Redis數據庫:Jedis jedis=new Jedis("IP",6379);

    Jedis鏈接池:

JedisPoolConfig config = new JedisPoolConfig();//設置鏈接池的配置對象
//能夠不設置池的參數
config.setMaxTotal(int);//設置池中最大鏈接數
config.setMaxIdle(int);//設置空閒時池中包有的最大鏈接數
JedisPool pool = new JedisPool(config,"IP",6379);//設置鏈接池對象
Jedis jedis=pool.getResource();//從池中獲取鏈接對象。
jedis.get("name");
jedis.close();//鏈接歸還池JedisPool中

    JedisUtils:

public class JedisUtils{
    //定義一個鏈接池對象
    private final static JedisPool POOL;
    static{//初始化操做
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(int);
        config.setMaxIdle(int);
        POOL = new JedisPool(config,"IP",6379);
    }
    
    //從池中獲取鏈接
    public static Jedis getJedis(){
        return POOL.getResource();
    }
}
相關文章
相關標籤/搜索