成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談Redis中的全局命令

數據庫 Redis
在上一篇中我們已經介紹過了Redis有5種數據類型,但每一種數據類型底層的實現都是不同的,在學習Redis時,我們除了要掌握這5種數據類型外,還要了解它們具體的底層實現,這有助于我們更好的掌握Redis的,在遇到問題時,可以方便快速的解決問題,在這篇,我們主要了解全局命令、數據結構及內部編碼等方面的知識。

 在上一篇中我們已經介紹過了Redis有5種數據類型,但每一種數據類型底層的實現都是不同的,在學習Redis時,我們除了要掌握這5種數據類型外,還要了解它們具體的底層實現,這有助于我們更好的掌握Redis的,在遇到問題時,可以方便快速的解決問題,在這篇,我們主要了解全局命令、數據結構及內部編碼等方面的知識。

[[277743]]

  • 全局命令
  • Redis有5種數據結構,雖然它們底層不同,但還是有一些通用的命令是相同的。

1.查看所有鍵(返回所有的鍵,并它具體的鍵輸出出來)

  1. keys * 
Redis中的全局命令

2.查看鍵總數(返回當前數據庫中的鍵的個數)

  1. dbsize 
Redis中的全局命令

備注:dbsize命令在計算鍵總數時不會遍歷所有的鍵,而是直接獲Redis內置的鍵總數變量,所以dbsize命令的時間復雜度是O(1)。而keys命令則會遍歷所有鍵,所以它的時間復雜度是O(n),所以如果Redis中保存了大量的鍵時,keys命令要慎用。

3.檢查鍵是否存在

  1. exists key 
Redis中的全局命令

我們看exists命令是有返回值的當鍵存在時則返回值為1,當然鍵不存時返回值則為0。

4.刪除鍵

  1. del key 
Redis中的全局命令

 

Redis中的全局命令

我們知道在Redis中有5種數據結構,但del命令可以直接刪除任意類型的數據結構,而不用擔心它底層的實現。

我們看del命令和exists命令一樣,都是有返回值的。只不過不同的是del命令返回的時成功刪除鍵的個數。如果返回的是0,說明該鍵沒有被成功刪除,也就說明該鍵不存在。如果返回的是大于0的數,是表示多個鍵被刪除了。下面我們看一下刪除多個鍵的操作。

5.鍵過期

  1. expire key seconds 
Redis中的全局命令

 

Redis支持對鍵添加過期時間,當超過這個過期時間時,Redis會自動將鍵刪除。

當我們通過expire命令設置鍵的過期時間后,我們可以使用

  1. ttl key 

命令查看該鍵的剩余過期時間,所以ttl命令是有返回值的,也就是該鍵的剩余時間,單位是秒。除此之外,ttl命令有3種類型的返回值。下面我們看一下這3種返回值的區別。

  1. >=0:表示剩余的過期時間 
  2. -1:鍵沒設置過期時間 
  3. -2:鍵不存在 

6.鍵的數據結構類型

  1. type key 

Redis中的全局命令

如果鍵是字符串則type命令返回的就是字符串,如果是其它的數據類型則會返回其它的數據類型(因為我們還沒有學習其它的類型,這里暫時只考慮字符串),如果鍵不存在時,在返回none。

  • 數據結構和內部編碼

上面我們知道type命令會返回Redis中鍵的數據類型,也就是string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)等。但這些只是對外的數據結構,實際上在Redis的內部不同的數據結構有不同的底層的內部編碼。不同內部編碼在Redis中有些不同的性能,并且在Redis中會自動判斷應該用哪種編碼來存儲數據,已保證Redis的性能。我們可以通過下面的命令來查看鍵的內部編碼。

  1. object encoding key 
Redis中的全局命令

 

Redis中的全局命令

我們可以看出,上面保存的jilinwula這個鍵的內部編碼就是embstr。下面我們看一下在Redis中所有的數據結構所對應的內部編碼。

下面我們分析一下,為什么Redis要這樣設計數據結構及底層編碼呢。首先第一個好處就是可以改進內部編碼。當這樣做時,而不需要改變內部的數據結構,也就無需修改外部結構及命令了。第二個好處就是,我們知道不同的內部編碼有著不同的性能,當這樣設計時,如果我們要改變底層的內部編碼時,我們只需要根據Redis配置選項就可以,將我們曾經存儲過的key的底層編碼更改,這樣就可以針對不同的業務場景,個性化配置,進而提升性能。

  • 單線程架構

我們知道Redis使用了單線程架構和I/O多路復用模型來實現高性能的內存服務。

  • 單線程模型

每當客戶端調用命令時都會經歷3個步驟:發送命令、執行命令、返回結果3個過程。我們之前介紹過Redis是單線程的,所以每一條命令從客戶端發送到服務端,命令不會立即執行,而是將所有的命令都會進入一個隊列中,然后在順序執行。這樣,當我們客戶端啟動多個時執行命令時,不用考慮并發的問題,因為它們都會進入隊列,順序執行。

  1. 為什么單線程處理速度這么快 第一,我們知道Redis是將數據都存儲到內存中的,內存的處理速度,要比純硬盤IO的速度要快的多。
  2. 第二,非阻塞I/O,Redis使用epoll作為I/O多路復用技術實現的,在加上Redis自身的事件處理模型將epoll中的連接、讀寫、關閉都轉換為事件,不在網絡I/O上浪費過多的時間。
  3. 單線程避免線程切換等消耗

第一,我們知道做項目開發時,如果要對多線程做兼容,那么它要比單線程要復雜多了,代碼變復雜了,出現BUG的可能性也就多了。

Redis中的全局命令

第二,在開發多種線程時,我們知道線程間的切換,是很耗資源的,并且對服務端來說,對線程添加鎖,每次執行時都會判斷鎖,是很費時間的。

雖然Redis的單線程架構是有好處的,但是這也是它的弊端,我們知道,在執行命令時是順序執行的,如果上一個命令沒有執行完,那么剩下的命令是不會執行的,這也就造成了命令的阻塞。這對于Redis這種內存數據庫來說,如果發生了阻塞,那么后果,可想而知,所以,我們在執行相關命令時,一定要慎重。

責任編輯:華軒 來源: 今日頭條
相關推薦

2010-07-20 14:50:05

telnet端口

2013-12-26 16:55:56

manman命令

2009-11-12 15:41:06

VS Ribbon命令

2009-06-03 10:24:11

LoadMaskSilverlight

2009-05-05 09:46:18

Java編碼理論字符

2009-05-06 11:09:10

Oracle物化視圖數據庫

2017-08-28 15:21:29

異步處理回調函數異步編程

2009-06-26 14:04:15

Quartz配置

2009-03-11 15:30:05

evalwithJavascript

2011-06-28 09:51:08

.NET對象相等

2009-07-15 09:59:11

Metal觀感Swing

2012-01-04 10:07:56

Delphi

2009-09-22 17:38:25

Jobs框架

2009-12-01 15:56:17

SUSE Linux

2009-07-27 13:01:28

TreeViewASP.NET

2014-08-22 10:06:46

機器學習

2012-04-09 11:23:20

ibmdw

2009-06-22 10:34:43

Boost庫lambda

2009-02-05 15:32:23

接口委托

2011-05-18 16:02:08

XML
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美男人天堂 | 1204国产成人精品视频 | 97在线播放 | 国产乱码精品一区二区三区五月婷 | 特黄一级| 99视频在线免费观看 | 亚洲免费一区二区 | 精品自拍视频在线观看 | 久久精品日产第一区二区三区 | 亚洲精品乱码久久久久久蜜桃91 | 求毛片 | 久久香焦 | 中文字幕久久久 | 人成久久| 日韩精品成人av | 日韩精品一区二区三区在线观看 | 欧美日韩综合视频 | 中文字幕在线电影观看 | 黄色国产视频 | 9久9久9久女女女九九九一九 | 久久一 | 黄视频免费 | av在线二区 | 成人在线观看中文字幕 | 91精品国产99| 天天影视综合 | 国产成人精品一区二区三区在线 | 国产精品一区三区 | 九色国产 | 免费一区 | 九九亚洲精品 | 日韩在线观看一区二区三区 | 亚洲精品成人在线 | 日韩精品在线一区二区 | 成人午夜影院 | 日韩不卡一区二区三区 | 久久天堂 | 日韩看片| 欧美精品久久 | 国产精品一区二区三区在线 | 99国产精品久久久久久久 |