<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Redis 學習筆記1:數據類型

      Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及 zset(sorted set:有序集合)。

      一、Redis 數據類型-STRING

      1、常用命令

      SET key value                #存
      GET key                      #取
      Del key                      #刪除key
      INCR key                     #自增key對應的value的值,增量為1
      INCRBY key increment         #自增key對應的value的值,增量為 increment
      DECR key                     #遞減key對應的value的值,增量為-1
      getset key value             #命令用于設置指定 key 的值,并返回 key 的舊值。
                                  當 key 沒有舊值時,即 key 不存在時,返回 nil 
                                  當 key 存在但不是字符串類型時,返回一個錯誤

       

      2、實例

      實例1: set key value

      D:\Redis>redis-cli.exe -h 127.0.0.1 -p 6379
      127.0.0.1:6379> set set:test 1   # 返回ok 說明成功
      OK
      127.0.0.1:6379> set set:test1 1
      OK
      127.0.0.1:6379> set set:test2 1
      OK
      127.0.0.1:6379> keys *           # 列出所有的key
      1) "set:test"
      2) "set:test2"
      3) "set:test1"
      127.0.0.1:6379> set system:user 1
      OK
      127.0.0.1:6379> set system:role 1
      OK
      127.0.0.1:6379> set system:group 1
      OK
      127.0.0.1:6379> keys *
      1) "system:role"
      2) "set:test"
      3) "set:test1"
      4) "set:test2"
      5) "system:group"
      6) "system:user"
      127.0.0.1:6379>

      說明:

        set system:user 1
        key就是 system:user ;value就是1

      實例2:切庫

      127.0.0.1:6379> select 1
      OK
      127.0.0.1:6379[1]> keys *
      (empty list or set)
      127.0.0.1:6379[1]> select 0
      OK
      127.0.0.1:6379> keys *
      1) "system:role"
      2) "set:test"
      3) "set:test1"
      4) "set:test2"
      5) "system:group"
      6) "system:user"
      127.0.0.1:6379>

      在 redis.conf 文件中,配置項 database 16 設置了數據庫的數量為16,默認數據庫是0。

      可以使用select 命令在連接上指定數據庫id。

      當我們沒有默認選擇庫時,默認使用 0 庫。

       

      實例3:get key

      127.0.0.1:6379> set a 1
      OK
      127.0.0.1:6379> get a
      "1"
      127.0.0.1:6379> set b {a:b,1:2}
      OK
      127.0.0.1:6379> get b
      "{a:b,1:2}"
      127.0.0.1:6379>

       

      實例4:del key

      127.0.0.1:6379> keys *
      1) "system:role"
      2) "b"
      3) "set:test"
      4) "set:test1"
      5) "set:test2"
      6) "system:group"
      7) "system:user"
      8) "a"
      127.0.0.1:6379> del a  # 刪除成功
      (integer) 1
      127.0.0.1:6379> keys *
      1) "system:role"
      2) "b"
      3) "set:test"
      4) "set:test1"
      5) "set:test2"
      6) "system:group"
      7) "system:user"
      127.0.0.1:6379>
      127.0.0.1:6379> del a  #刪除失敗
      (integer) 0

       

      實例5:遞增key

      127.0.0.1:6379> incr test
      (integer) 1
      127.0.0.1:6379> get test
      "1"
      127.0.0.1:6379> incr test
      (integer) 2
      127.0.0.1:6379> get test
      "2"
      127.0.0.1:6379> incr test
      (integer) 3
      127.0.0.1:6379> get test
      "3"
      127.0.0.1:6379> incrby test 3
      (integer) 6
      127.0.0.1:6379> get test
      "6"

      當值(字符串)里是數字時,才可以自增。

       

      實例6:遞減key

      127.0.0.1:6379> DECR test
      (integer) 5

       

      實例7:先取再設置(同時進行)

      127.0.0.1:6379> getset test1 1
      (nil)
      127.0.0.1:6379> get test1
      "1"
      127.0.0.1:6379> getset test1 2
      "1"
      127.0.0.1:6379> get test1
      "2"
      127.0.0.1:6379>

      redis getset 命令用于設定指定key的值,并返回key的舊值。

       

      3、STRING 類型的實際場景

      場景1:做商品詳情和緩存

      127.0.0.1:6379> set spu:10001 '{"color":"red","struct":"glass","length":30,"width":25,"price":"1345.20"}'
      OK
      127.0.0.1:6379> get spu:10001
      "{\"color\":\"red\",\"struct\":\"glass\",\"length\":30,\"width\":25,\"price\":\"1345.20\"}"
      127.0.0.1:6379>

      說明:比如客戶端發起請求查詢 sup:10001 商品信息,api程序先去redis拿,拿到了就直接返回給api程序,api返回給客戶端,這樣就起到了做緩存的目的。

       

      場景2:給數據做唯一編碼

      有一些數據需要唯一的編碼去命名,如用例編碼。

      使用redis 用incr 生成用例編碼

      127.0.0.1:6379> incr test_case_no
      (integer) 1
      127.0.0.1:6379> incr test_case_no
      (integer) 2
      127.0.0.1:6379> incr test_case_no
      (integer) 3

       

      場景3:做分布式鎖

      1、什么是分布式鎖:針對多服務的情況,在外面加個分布式鎖,每個服務都要在獲得分布式鎖后進行操作。

      2、Redis為什么可以做分布式鎖:因為redis是單線程運行的,沒有并發,所有請求都是一個一個操作。

      3、redis怎么做分布式鎖:

        expire [key] time     #設置一個key有效期

        exists [key]             # 判斷key是否存在

        偽代碼:

      先判斷鎖是否存在(key存在,exists):
      
        如果存在:pass
      
        如果不存在:set key 'xxx' && 設置過期時間
      
              操作

       

      4、如何設置過期時間&如何判斷key是否存在

      127.0.0.1:6379> set hqq2 'a'
      OK
      127.0.0.1:6379> exists hqq2     #判斷key是否存在
      (integer) 1
      127.0.0.1:6379> expire hqq2 10  #設置過期時間為10s
      (integer) 1
      
      10秒后再次操作
      127.0.0.1:6379> exists hqq2
      (integer) 0
      127.0.0.1:6379>

      5、設置過期時間的實際應用場景:

      set key '限時活動'
      expire key 10
      while get key:
          繼續活動
      活動結束
      127.0.0.1:6379> set 618day 'huodong'
      OK
      127.0.0.1:6379> expire 618day 100
      (integer) 1
      127.0.0.1:6379> get 618day
      "huodong"
      127.0.0.1:6379> get 618day
      (nil)

       

      4、總結STRING

      1、一個key對應一個value

      2、Redis的String可以包含任何數據,比如 jpg圖片或者序列的對象

      3、一個key最大能存儲512MB

       

      二、Redis 數據類型-HASH

       1、什么是哈希值

      哈希值是通常用一個短的隨機字母和數字組成的字符串來代表,是一組任意長度的輸入信息通過哈希算法得到的“數據指紋”。因為計算機在底層機器碼是采用二進制的模式。因此通過哈希算法得到的任意長度的二進制值映射為較短的固定長度的二進制值,即哈希值。此外,哈希值是一段數據唯一且極其緊湊的數值表示形式,如果通過哈希一段明文得到哈希值,哪怕只更改該段明文中的任意一個字母,隨后得到的哈希值都將不同。

       
      2、Redis hash結構

       

         Redis hash 是一個鍵值對集合;

        Redis hash 是一個string類型的field 和 value 的映射表;

        hash 適合存儲對象

       

      3、設置

      127.0.0.1:6379> hset htest1 key1 1
      (integer) 1
      127.0.0.1:6379> hget htest1 key1
      "1"
      127.0.0.1:6379> hset htest1 key2 2
      (integer) 1
      127.0.0.1:6379> hget htest1 key2
      "2"

      結構:

       

      4、刪除

      127.0.0.1:6379[1]> hdel htest1 key1
      (integer) 1
      127.0.0.1:6379[1]> hget htest1 key1
      (nil)

       

      5、是否存在

      127.0.0.1:6379[1]>  HEXISTS htest1 key1
      (integer) 0  #不存在
      127.0.0.1:6379[1]>  HEXISTS htest1 key2
      (integer) 1  #存在

       

      6、展示key的所有的value(第二級的key)

      127.0.0.1:6379[1]> hset htest1 key3 3
      (integer) 1
      127.0.0.1:6379[1]> hset htest1 key4 'a'
      (integer) 1
      127.0.0.1:6379[1]> hkeys htest1
      1) "key2"
      2) "key3"
      3) "key4"

      結構:

       

       

      7、展示key 的所有的最后一級value

      127.0.0.1:6379[1]> hvals htest1
      1) "2"
      2) "3"
      3) "a"
      127.0.0.1:6379[1]>

       

      8、獲取key下面的所有的鍵和值

      127.0.0.1:6379[1]> hgetall htest1
      1) "key2"
      2) "2"
      3) "key3"
      4) "3"
      5) "key4"
      6) "a"

       

      9、進階實例

      127.0.0.1:6379[1]> hmset w3ckey name 'redis tutorial' description 'redis basic commands for caching' likes 20 visitors 23000
      OK
      127.0.0.1:6379[1]> hgetall w3ckey
      1) "name"
      2) "redis tutorial"
      3) "description"
      4) "redis basic commands for caching"
      5) "likes"
      6) "20"
      7) "visitors"
      8) "23000"
      127.0.0.1:6379[1]>

      說明:

        設置了redis的一些描述信息(name,description,likes,visitors)到hash表的w3ckeys中。

       

      10、redis hash 命令

      序號
      命令及描述
      1
      HDEL key field2 [field2] 刪除一個或多個哈希表字段
      2
      HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。
      3
      HGET key field 獲取存儲在哈希表中指定字段的值/td>
      4
      HGETALL key 獲取在哈希表中指定 key 的所有字段和值
      5
      HINCRBY key field increment 為哈希表 key 中的指定字段的整數值加上增量 increment 。
      6
      HINCRBYFLOAT key field increment 為哈希表 key 中的指定字段的浮點數值加上增量 increment 。
      7
      HKEYS key 獲取所有哈希表中的字段
      8
      HLEN key 獲取哈希表中字段的數量
      9
      HMGET key field1 [field2] 獲取所有給定字段的值
      10
      HMSET key field1 value1 [field2 value2 ] 同時將多個 field-value (域-值)對設置到哈希表 key 中。
      11
      HSET key field value 將哈希表 key 中的字段 field 的值設為 value 。
      12
      HSETNX key field value 只有在字段 field 不存在時,設置哈希表字段的值。
      13
      HVALS key 獲取哈希表中所有值
      14
      HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的鍵值對。

       

      三、Redis 數據類型-LIST

      1、redis 列表是簡單的字符串列表,按照插入順序排序。

      2、可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。

      3、redis list可以做什么:

        1)列表可以做什么:index-value  pop  append

        2)redis list同樣可以 pop

      4、常用基本命令

        ? lpush [key] [element...]
        ? rpush [key] [element...]
        ? lpop [key]
        ? rpop [key]
        ? lrange [key] [start] [end]
        ? llen [key]

      5、實踐

      實踐1:從左邊插入

      127.0.0.1:6379[1]> lpush ltest 1  #從左邊插入
      (integer) 1
      127.0.0.1:6379[1]> lpush ltest 1
      (integer) 2  #返回的是添加到第幾個數
      127.0.0.1:6379[1]> lpush ltest 2
      (integer) 3
      127.0.0.1:6379[1]> llen ltest   #看長度
      (integer) 3
      127.0.0.1:6379[1]> lrange ltest 0 -1  #第一個0,最后一個-1
      1) "2"
      2) "1"
      3) "1"

      得到的結構類似:ltest:[2,1,1]

      實踐2:從右邊插入

      127.0.0.1:6379[1]> rpush ltest 3
      (integer) 4
      127.0.0.1:6379[1]> lrange ltest 0 -1
      1) "2"
      2) "1"
      3) "1"
      4) "3"

      得到的結構類似:ltest:[2,1,1,3]

      實踐3:刪除

      127.0.0.1:6379[1]> lpop ltest      #從左邊刪除
      "2" 
      127.0.0.1:6379[1]> lrange ltest 0 -1
      1) "1"
      2) "1"
      3) "3"
      127.0.0.1:6379[1]> rpop ltest      #從右邊刪除
      "3"
      127.0.0.1:6379[1]> lrange ltest 0 -1
      1) "1"
      2) "1"

       

      6、redis list 可以在實際工作中做什么?--消息隊列
      1)消息隊列:ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ等
      2)什么是消息隊列:
        我們可以把消息隊列比作是一個存放消息的容器,當我們需要使用消息的時候可以取出消息供自己使用。  
        隊列:先進先出
      3)使用隊列的好處:
      好處1:通過異步處理提高系統性能。

       

       在不使用消息隊列服務器的時候,用戶的請求數據直接寫入數據庫,在高并發的情況下數據庫壓力劇增,使得響應速度變慢。
      使用消息隊列之后,用戶的請求數據發送給消息隊列之后立即返回,再由消息隊列的消費者進程從消息隊列中獲取數據,異步寫入數據庫。由于消息隊列服務器處理速度快于數據庫(消息隊列也比數據庫有更好的伸縮性),因此響應速度得到大幅改善。
       
      好處2:降低系統耦合度

       

       

      消息隊列使利用發布-訂閱模式工作,消息發送者(生產者)發布消息,一個或多個消息接受者(消費者)訂閱消息,通過A的認證后就可以消費。
      從上圖可以看到消息發送者(生產者)和消息接受者(消費者)之間沒有直接耦合,
      消息發送者將消息發送至分布式消息隊列即結束對消息的處理,
      消息接受者從分布式消息隊列獲取該消息后進行后續處理,并不需要知道該消息從何而來。
      對新增業務,只要對該類消息感興趣,即可訂閱該消息,對原有系統和業務沒有任何影響,從而實現網站業務的可擴展性設計。
       
      只有在解耦這個特定的場景下,使用發布-訂閱模式。其他還有點對點訂閱模式等。

       
      壞處1:系統可用性降低
      系統可用性在某種程度上降低,為什么這樣說呢?在加入MQ之前,你不用考慮消息丟失或者說MQ掛掉等等的情況,但是,引入MQ之后你就需要去考慮了!
       
      壞處2:系統復雜度提高
      加入MQ之后,你需要保證消息沒有被重復消費、處理消息丟失的情況、保證消息傳遞的順序性等等問題!
       
      壞處3:一致性問題
      了消息隊列可以實現異步,消息隊列帶來的異步確實可以提高系統響應速度。但是,萬一消息的真正消費者并沒有正確消費消息怎么辦?這樣就會導致數據不一致的情況了!
       
      4)如何實現:lpush 先進;rpop 先出 就可以實現消息隊列
       

      四、Redis 數據類型-SET(集合)

      1、Redis 的Set 是string類型的無序集合
      集合成員是唯一的,這就意味著集合中不能出現重復的數據。
       
      2、Redis 中 集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。
       
      3、基本命令
      ? sadd [key] [member...]
      ? srem [key] [member]
      ? spop [key]
      ? scard [key]
      ? smembers [key]
       
      4、實戰

      127.0.0.1:6379[1]> sadd stest redis
      (integer) 1
      127.0.0.1:6379[1]> sadd stest mongdb
      (integer) 1
      127.0.0.1:6379[1]> sadd stest mysql
      (integer) 1
      127.0.0.1:6379[1]> sadd stest mysql
      (integer) 0
      127.0.0.1:6379[1]> smembers stest
      1) "mysql"
      2) "mongdb"
      3) "redis"
      
      127.0.0.1:6379[1]> srem stest redis  #刪除某個元素
      (integer) 1
      127.0.0.1:6379[1]> smembers stest
      1) "mysql"
      2) "mongdb"
      127.0.0.1:6379[1]>
      
      
      127.0.0.1:6379[1]> scard stest  #查看有幾個元素
      (integer) 2
      127.0.0.1:6379[1]> sadd stest hqq
      (integer) 1
      127.0.0.1:6379[1]> scard stest
      (integer) 3
      127.0.0.1:6379[1]> smembers stest
      1) "hqq"
      2) "mysql"
      3) "mongdb"
      127.0.0.1:6379[1]>
      
      隨機刪除:(因為是無序的)
      127.0.0.1:6379[1]> spop stest
      "mysql"
      127.0.0.1:6379[1]> spop stest
      "mongdb"

      5、實際應用場景

      1)可以使用Redis的Set數據類型跟蹤一些唯一性數據

      比如訪問某一博客的唯一IP地址信息。
      對于此場景,我們僅需在每次訪問該博客時將訪問者的IP存入Redis中,Set數據類型會自動保證IP地址的唯一性。
       
      2)充分利用Set類型的服務端聚合操作方便、高效的特性,可以用于維護數據對象之間的關聯關系。
      比如所有購買某一電子設備的客戶ID被存儲在一個指定的Set中,而購買另外一種電子產品的客戶ID被存儲在另外一個Set中,如果此時我們想獲取有哪些客戶同時購買了這兩種商品時,Set的intersections交集命令就可以充分發揮它的方便和效率的優勢了。
       

      五、Redis 數據類型-SORTEDSET

      1、sorted set 有序集合
      Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復的成員。
      不同的是每個元素都會關聯一個double類型的分數。
      redis正是通過分數來為集合中的成員進行從小到大的排序。
      有序集合的成員是唯一的,但分數(score)卻可以重復。
       
      2、集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。 
       
      3、常用命令
      ? zadd [key] [score] [member]
      ? zrem [key] [member]
      ? zcard [key]
      ? zrange [key] [start] [stop] [withscroes]
       

      4、實戰

      127.0.0.1:6379[1]> zadd ztest 1 case1
      (integer) 1
      127.0.0.1:6379[1]> zadd ztest 2 case3
      (integer) 1
      127.0.0.1:6379[1]> zadd ztest 3 case2
      (integer) 1
      127.0.0.1:6379[1]> zrange ztest 0 -1
      1) "case1"
      2) "case3"
      3) "case2"
      127.0.0.1:6379[1]>
      
      長度:
      127.0.0.1:6379[1]> zcard ztest (integer) 3 刪除指定元素: 127.0.0.1:6379[1]> zrem ztest case1 (integer) 1 127.0.0.1:6379[1]> zrange ztest 0 -1 1) "case3" 2) "case2" 127.0.0.1:6379[1]> 返回索引: 127.0.0.1:6379[1]> zrank ztest case2 (integer) 1 127.0.0.1:6379[1]> zrank ztest case3 (integer) 0

      5、實際應用場景

      有序集合的使用場景與集合類似,但是set集合不是自動有序的,而sorted set可以利用分數進行成員間的排序,而且是插入時就排序好。所以當你需要一個有序且不重復的集合列表時,就可以選擇sorted set數據結構作為選擇方案。
       
      1) 排行榜:有序集合經典使用場景。
       
      可以用于一個大型在線游戲的積分排行榜。每當玩家的分數發生變化時,可以執行ZADD命令更新玩家的分數,此后再通過ZRANGE命令獲取積分TOPTEN的用戶信息。當然我們也可以利用ZRANK命令通過username來獲取玩家的排行信息。最后我們將組合使用ZRANGE和ZRANK命令快速的獲取和某個玩家積分相近的其他用戶的信息。
       
      2)用Sorted Sets來做帶權重的隊列,比如普通消息的score為2,重要消息的score為1,然后工作線程可以選擇按score的來獲取工作任務。讓重要的任務優先執行。
       
      3)Sorted-Set類型還可用于構建索引數據。
       

      六、Redis 的數據庫操作

      ? select [index]

      ? keys [partten]

      ? del [key]

      ? type [key]

      ? exists [key]           #判斷是否存在key

      ? expire [key] time  #設置超時時間

      ? ttl a                      #查看key還剩多長時間

      ? flushdb                #刪除指定db

      ? flushall                #刪除所有db

      posted @ 2020-12-15 15:58  hqq的進階日記  閱讀(99)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 无码日韩做暖暖大全免费不卡 | 亚洲 日韩 国产 制服 在线| 人妻aⅴ无码一区二区三区 | 国产偷人妻精品一区二区在线| av综合亚洲一区二区| 精品国产中文字幕在线| 亚洲欧洲日产国无高清码图片| 亚洲人成网站77777在线观看| 国产按头口爆吞精在线视频| 久久久久蜜桃精品成人片公司| 精品无码久久久久久久久久| 国产精品毛片一区视频播| 国产乱子伦一区二区三区四区五区| 色综合色综合色综合久久| 亚洲精品麻豆一二三区| 日韩中文字幕人妻精品| 国产一区二区午夜福利久久| 国产性三级高清在线观看| 99国产精品白浆无码流出| 99在线精品免费视频| 亚洲国产av一区二区| 国产精品亚洲二区在线播放| 中文字幕日韩人妻一区| 色丁香一区二区黑人巨大| 亚洲第一香蕉视频啪啪爽| 欧洲美熟女乱又伦免费视频| 精品久久久久国产免费| 一区二区三区在线色视频| 国产精品大片中文字幕| 国内永久福利在线视频图片 | 综合激情网一区二区三区| 色老头在线一区二区三区| 国产成人精品aa毛片| 性色av一区二区三区精品| 澳门永久av免费网站| 国产日产精品系列| 亚洲一区二区国产av| 中文国产日韩欧美二视频| 国产老熟女一区二区三区| 中文 在线 日韩 亚洲 欧美 | 日本一区二区三区专线|