站長資訊網
        最全最豐富的資訊網站

        Redis學習之 基本數據結構

        Redis使用教程欄目介紹其基礎數據結構

        Redis學習之 基本數據結構

        推薦(免費):redis使用教程

        Redis基礎數據結構

        Redis有5種基本數據結構:String(字符串)、list(列表)、set(集合)、hash(哈希)、zset(有序集合)

        字符串string

        字符串類型是Redis的value最簡單的數據結構,類似與Java語言中的ArrayList(數字列表),不過在Redis里String是一種動態字符串

        Redis里的String采用預分配冗余空間的方法

        [圖片上傳失敗…(image-724c60-1537973556456)]

        set & get

        >set keyname test OK  >get keyname test  //key如果存在就返回0 >setnx keyname test 0  >exists keyname  >del keyname 1  //批量設置 >mset key1 test1 key2 test2 OK  //批量獲取 >mget key1 key2 1) test1 2) test2

        key過期

        //設置5s后過期 >expire keyname 5  //setex是expire和set的復合寫法 >setex keyname 5 test OK  //5s后查詢 >get keyname NULL

        計數
        ps:value為數字的情況,可以使用incr和incrby計數

        >set num 10 OK  //incr默認加1 >incr num 11  //incrby后面要加上數字 >incrby num ERR wrong number of arguments for 'incrby' command  //正確計數 >incrby num 5 16

        列表list

        下面介紹一下redis的另外一種數據結構list
        前面我們說redis里的string類似與java語言里面的ArrayList,則redis里的列表就類似與LinkList(鏈表),鏈表一個特別就是更新和新增特別快,查詢索引慢。

        為什么說類似與linklist?因為redis的list并非和linklist一樣,它其實是一種快速列表(quicklist)的形式,列表結構如圖:

        [圖片上傳失敗…(image-625c1b-1537973556457)]

        這里要介紹一下壓縮列表(ziplist)了,壓縮列表是什么?其實就是連續的內存空間

        從圖可以看出快速列表其實就是由壓縮列表和雙向的指針組成,不過我們知道鏈表是兩個指針的,也就是prev和next執行,這就是快速列表和linklist的一個不同點了。

        PS:然后redis設計時,為什么改成雙向指針?假如和鏈表一樣,用兩個指針prev、next,同樣可以實現遍歷,不過雙向指針有一個很明顯的優點,就是占用的內存空間就相對少了。

        隊列和棧

        /* 隊列:First in first out */  //加兩個value >rpush keynames key1 key2 2  //計算 >llen keynames 2  >lpop keynames key1  >lpop keynames key2  //rpush會自動過期的 >rpop keynames NULL  /* 棧:First in last out */  //同樣,加兩個元素 >rpush keynames key1 key2 2  >rpop keynames key2  >rpop keynames key1

        字典hash

        Redis的字典類似與java語言的hashmap,也是無序的二維結構,也即數組加列表的結構。這是redis字典和hashmap類似的地。

        然后也有不同,比如rehash,刷新字典操作,hashmap是全部熱hash,當字典足夠多時,性能不是很好的,所以redis進行改造,采用漸進式的方式,為什么說是漸進式?因為redis不會全部reload,而是保存新舊兩個字典,然后采用定時任務,將舊hash的數據搬到新的hash,搬后在回收hash內存空間

        字典(hash)的數組加鏈接結構:
        [圖片上傳失敗…(image-f5660f-1537973556457)]

        >hset keynames key1 "test1" 1  >hset keynames key2 "test2" 1  //批量set >hmset keynames key1 "test1" key2 "test2" OK  //獲取key1的值 >hget keynames key1 test1  //獲取hash為keynames的長度 >hlen keynames 2  //獲取全部 >hgetall keynames 1) key1 2) test1 3) key2 4) test2

        集合set

        redis的set和java語言中的hashset類型,是一種無序唯一的。

        >sadd keynames key1 1  //key1已經加過了,所以返回1 >sadd keynames key1 key2 1  >smembers keynames 1) key2 2) key1  //查詢某個key是否存在,相當與contains >sismember keynames key1 1  //相當于count >scard keynames 2  //隨意彈出key1 >spop keynames key1

        有序集合zSet

        有序集合是redis里比較有特色的,它類似于SortedSet和HashMap的組合。其內部實現是一種被稱作跳躍列表的數據結構。有序集合一方面它就是一個set,所以每個元素都是唯一的,然后它可以給每個value賦值一個score,再根據這個score進行排序,score就相當于一個權限排序的標識。

        ps:因為這個原因,有序集合可以被用來存儲粉絲信息,value值是粉絲id,score是關注時間

        //9.0是score也就是權重 >zadd keyname 9.0 math 1  >zadd keyname 9.2 history 1  //順序 >zrange keyname 0 -1 1) history 2) math  //逆序 >zrevrange keyname 0 -1 1) math 2) history  //相當于count() >zcard keyname 2  獲取指定key的score >zscore keyname math 9

        跳躍列表 TODO

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 91精品国产91久久久久福利| 91久久精品国产91性色也| 在线观看日韩精品| 亚洲精品无码成人片在线观看| 亚洲精品成a人在线观看| 精品午夜久久福利大片| 欧美精品亚洲精品日韩1818| 国产成人亚洲精品91专区手机| 国产精品制服丝袜亚洲欧美| 久久精品国产99久久丝袜| 亚洲精品99久久久久中文字幕 | 久久精品99久久香蕉国产色戒| 国产精品亚韩精品无码a在线 | 天天爽夜夜爽夜夜爽精品视频 | 国产精品黄网站| 国产观看精品一区二区三区| 精品久久久久久久中文字幕| 亚洲精品国精品久久99热| 人精品影院| 视频二区国产精品职场同事| 亚洲AV日韩精品一区二区三区| 国产精品 91 第一页| 91精品国产91久久久久久| 国产精品网站在线观看| 国产精品香港三级国产AV| 日产精品久久久一区二区| 秋霞午夜鲁丝片午夜精品久| 99久久er这里只有精品18| 精品午夜福利在线观看| 久久久精品国产sm调教网站| 亚洲国产精品无码久久98| 精品国产污污免费网站| 国产精品偷伦视频观看免费| 日本aⅴ精品中文字幕| 亚洲第一极品精品无码久久| 亚洲日韩精品A∨片无码| 亚洲国产精品嫩草影院| 国产精品素人搭讪在线播放| 九九在线精品视频专区| 精品国产91久久久久久久| 亚洲国产精品成|