日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis入门详解

發布時間:2024/4/13 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis入门详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Redis簡介: Redis是一款開源的、高性能的鍵-值存儲(key-value store)。它常被稱作是一款數據結構服務器 (data structure server)。Redis的鍵值可以包括字符串(strings)類型,同時它還包括哈希(hashes)、列表(lists)、 集合(sets)和 有序集合(sorted sets)等數據類型。為了獲得優異的性能,Redis采用了內存中(in-memory)數據集(dataset)的方式。同時, Redis支持數據的持久化,你可以每隔一段時間將數據集轉存到磁盤上(snapshot), 或者在日志尾部追加每一條操作命令(append only file,aof)。Redis同樣支持主從復制(master-slave replication),網絡斷開自動重連等功能。 同時Redis還具有其簡單的事物支持、發布訂閱 ( pub/sub)等 。Redis具有豐富的客戶端, 支持現階段流行的大多數編程語言。Redis安裝: 下載最新穩定版 redis( http://redis.io/download )Redis配置: 1. Redis默認不是以守護進程的方式運行,可以通過該配置項修改,使用yes啟用守護進程 daemonize no 2. 指定Redis監聽端口,默認端口為6379,作者在自己的一篇博文中解釋了為什么選用6379作為默認端口, 因為6379在手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字 4. 綁定的主機地址 bind 127.0.0.1 5.當 客戶端閑置多長時間后關閉連接,如果指定為0,表示關閉該功能timeout 300 6. 指定日志記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning, 默認為verbose loglevel verbose 8. 設置數據庫的數量,默認數據庫為0,可以使用SELECT <dbid>命令在連接上指定數據庫id 9. 指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合save <seconds> <changes>Redis默認配置文件中提供了三個條件:save 900 1save 300 10save 60 10000分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。 12. 設置當本機為slav服務時,設置master服務的IP地址及端口,在Redis啟動時, 它會自動從master進行數據同步slaveof <masterip> <masterport> 14. 當master服務設置了密碼保護時,slav服務連接master的密碼masterauth <master-password> 15. 設置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時需要通過 AUTH <password>命令提供密碼,默認關閉requirepass foobared16. 設置同一時間最大客戶端連接數,默認無限制,Redis可以同時打開的客戶端連接數為Redis進程 可以打開的最大文件描述符數,如果設置 maxclients 0,表示不作限制。當客戶端連接數到達限制時, Redis會關閉新的連接并向客戶端返回max number of clients reached錯誤信息maxclients 128Redis的數據類型: Keys 非二進制安全的字符類型( not binary-safe strings )Values Strings Lists Sets Sorted sets HashKey: redis本質上一個key-value 數據庫,所以我們首先來看看他的key.首先key也是字符串類型, 由于key不是binary safe的字符串,所以像“my key”和“mykey\n”這樣包含空格和換行的key是不允許的。我們在使用的時候可以自己定義一個Key的格式。例如 object-type:id:field Key不要太長。占內存,查詢慢。key的相關命令: exits key 測試指定key是否存在,返回1表示存在,0不存在 del key1 key2 ....keyN 刪除給定key,返回刪除key的數目,0表示給定key都不存在 type key 返回給定key的value類型。返回 none 表示不存在,key有string字符類型, list 鏈表類型 set 無序集合類型等...randomkey 返回從當前數據庫中隨機選擇的一個key,如果當前數據庫是空的,返回空串 rename oldkey newkey 原子的重命名一個key,如果newkey存在,將會被覆蓋,返回1表示成功,0失敗。 失敗可能是oldkey不存在或者和newkey相同 renamenx oldkey newkey 同上,但是如果newkey存在返回失敗 dbsize 返回當前數據庫的key數量 expire key seconds 為key指定過期時間,單位是秒。返回1成功,0表示key已經設置過 過期時間或者不存在 ttl key 返回設置了過期時間的key的剩余過期秒數, -1表示key不存在或者沒有設置過過期時間 select db-index 通過索引選擇數據庫,默認連接的數據庫所有是0,默認數據庫數是16個。 返回1表示成功,0失敗 move key db-index 將key從當前數據庫移動到指定數據庫。返回1成功。0 如果key不存在, 或者已經在指定數據庫中 flushdb 刪除當前數據庫中所有key,此方法不會失敗。慎用 flushall 刪除所有數據庫中的所有key,此方法不會失敗。更加慎用String類型: string是redis最基本的類型,而且string類型是二進制安全的。 redis的string可以包含任何數據。包括jpg圖片或者序列化的對象。 最大上限是1G字節。 如果只用string類型,redis就可以被看作加上持久化特性的memcachedString相關命令: set key value 設置key對應的值為string類型的value,返回1表示成功,0失敗 setnx key value 同上,如果key已經存在,返回0 。nx 是not exist的意思 get key 獲取key對應的string值,如果key不存在返回nil getset key value 設置key的值,并返回key的舊值。如果key不存在返回nil mget key1 key2 ... keyN 一次獲取多個key的值,如果對應key不存在,則對應返回nil。 下面是個實驗, nonexisting不存在,對應返回nilmset key1 value1 ... keyN valueN 一次設置多個key的值,成功返回1表示所有的值都設置了, 失敗返回0表示沒有任何值被設置 msetnx key1 value1 ... keyN valueN 同上,但是不會覆蓋已經存在的key incr key 對key的值做加加操作,并返回新的值。注意incr一個不是int的value會返回錯誤, incr一個不存在的key,則設置key為1 decr key 同上,但是做的是減減操作,decr一個不存在key,則設置key為-1 incrby key integer 同incr,加指定值 ,key不存在時候會設置key,并認為原來的value是 0 decrby key integer 同decr,減指定值。decrby完全是為了可讀性,我們完全可以通過incrby 一個負值來實現同樣效果,反之一樣。List類型: redis的list類型其實就是一個每個子元素都是string類型的雙向鏈表。我們可以通過push,pop 操作從鏈表的頭部或者尾部添加刪除元素。這使得list既可以用作棧,也可以用作隊列。List的相關命令: lpush key string 在key對應list的頭部添加字符串元素,返回1表示成功,0表示key存在 且不是list類型 rpush key string 同上,在尾部添加 llen key 返回key對應list的長度,key不存在返回0,如果key對應類型不是list返回錯誤 lrange key start end 返回指定區間內的元素,下標從0開始,負值表示從后面計算, -1表示倒數第一個元素 ,key不存在返回空列表 ltrim key start end 截取list,保留指定區間內元素,成功返回1,key不存在返回錯誤 lset key index value 設置list中指定下標的元素值,成功返回1,key或者下標不存在返回錯誤 lrem key count value 從key對應list中刪除count個和value相同的元素。count為0時候刪除全部 lpop key 從list的頭部刪除元素,并返回刪除元素。如果key對應list不存在或者是空返回nil, 如果key對應值不是list返回錯誤 rpop 同上,但是從尾部刪除 brpop 同blpop,一個是從頭部刪除一個是從尾部刪除Set類型: redis的set是string類型的無序集合。 set元素最大可以包含(2的32次方-1)個元素。 set的是通過hash table實現的,hash table會隨著添加或者刪除自動的調整大小 關于set集合類型除了基本的添加刪除操作,其他有用的操作還包含集合的取并集(union), 交集(intersection),差集(difference)。Set的相關命令: sadd key member 添加一個string元素到,key對應的set集合中,成功返回1, 如果元素以及在集合中返回0,key對應的set不存在返回錯誤Sorted Set類型: 和set一樣sorted set也是string類型元素的集合,不同的是每個元素都會關聯一個double類型的score。Hash類型: redis hash是一個string類型的field和value的映射表。 hash特別適合用于存儲對象。相較于將對象的每個字段存成單個string類型。 將一個對象存儲在hash類型中會占用更少的內存,并且可以更方便的存取整個對象。Redis功能: 持久化: redis是一個支持持久化的內存數據庫,也就是說redis需要經常將內存中的數據同步到磁盤來保證持久化, 這是相對memcache來說的一個大的優勢。redis支持兩種持久化方式,一種是 Snapshotting(快照) 也是默認方式,另一種是Append-only file(縮寫aof)的方式。 Snapshotting 快照是默認的持久化方式。這種方式將內存中數據以快照的方式寫入到二進制文件中,默認的文件名 為dump.rdb。可以配置自動做快照持久 化的方式。我們可以配置redis在n秒內如果超過m個key被修改 就自動做快照,下面是默認的快照保存配置 save 900 1 #900秒內如果超過1個key被修改,則發起快照保存 save 300 10 #300秒內容如超過10個key被修改,則發起快照保存Append-only file aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式時,redis會將每一個收到的寫命令 都通過write函數追加到文件中(默認是 appendonly.aof)。當redis重啟時會通過重新執行文件中 保存的寫命令來在內存中重建整個數據庫的內容。當然由于os會在內核中緩存 write做的修改, 所以可能不是立即寫到磁盤上。這樣aof方式的持久化也還是有可能會丟失部分修改。 有三種方式如下(默認是:每秒fsync一次) appendonly yes //啟用aof持久化方式appendfsync always //每次收到寫命令就立即強制寫入磁盤,最慢的,但是保證完全的持久化, 不推薦使用 appendfsync everysec //每秒鐘強制寫入磁盤一次,在性能和持久化方面做了很好的折中,推薦 appendfsync no //完全依賴os,性能最好,持久化沒保證主從復制: 主從復制允許多個slave server擁有和master server相同的數據庫副本。 下面是關于redis主從復制的一些特點 1.master可以有多個slave 2.除了多個slave連到相同的master外,slave也可以連接其他slave形成圖狀結構 3.主從復制不會阻塞master。也就是說當一個或多個slave與master進行初次同步數據時, master可以繼續處理client發來的請求。相反slave在初次同步數據時則會阻塞,不能處理client的請求。 4.主從復制可以用來提高系統的可伸縮性(我們可以用多個slave 專門用于client的讀請求, 比如sort操作可以使用slave來處理),也可以用來做簡單的數據冗余。 5.可以在master禁用數據持久化,只需要注釋掉master 配置文件中的所有save配置, 然后只在slave上配置數據持久化。發布訂閱: 發布訂閱(pub/sub)是一種消息通信模式。訂閱者可以通過subscribe和psubscribe命令向redis server 訂閱自己感興趣的消息類型,redis將消息類型稱為通道(channel)。虛擬內存: redis沒有使用os提供的虛擬內存機制而是自己實現了自己的虛擬內存機制 ,但是思路和目的都是相同的。redis沒有使用os提供的虛擬內存機制而是自己實現了自己的虛擬內存機制 ,但是思路和目的都是相同的。 就是暫時把不經常訪問的數據從內存交換到磁盤中,從而騰出內存空間用于其他需要訪問的數據。 尤其是對于redis這樣的內存數據庫,內存總是不夠用的。Redis應用場景:1.取最新N個數據的操作 比如典型的取你網站的最新文章,通過下面方式,我們可以將最新的5000條評論的ID放在Redis的List 集合中,并將超出集合部分從數據庫獲取使用LPUSH latest.comments<ID>命令,向list集合中 插入數據插入完成后再用LTRIM latest.comments 0 5000命令使其永遠只保存最近5000個ID 然后我們在客戶端獲取某一頁評論時可以用下面的邏輯(偽代碼)4.計數器應用 Redis的命令都是原子性的,你可以輕松地利用INCR,DECR命令來構建計數器系統。5.Uniq操作,獲取某段時間所有數據排重值 這個使用Redis的set數據結構最合適了,只需要不斷地將數據往set中扔就行了,set意為集合, 所以會自動排重。9.緩存 這個不必說了,性能優于Memcached(在某些方面,并不是全面優于),數據結構更多樣化。Redis總結: Redis使用最佳方式是全部數據in-memory。 Redis更多場景是作為Memcached的替代者來使用。 當需要除key/value之外的更多數據類型支持時,使用Redis更合適。 對數據高并發讀寫 對海量數據的高效率存儲和訪問

Redis 總結精講?

1、為什么使用redis 主要是從兩個角度去考慮:性能和并發。redis還具備可以做分布式鎖等其他功能,但是如果只是為了分布式鎖 這些其他功能,完全還有其他中間件(如zookpeer等)代替,并不是非要使用redis。(一)性能 需要執行耗時特別久,且結果不頻繁變動的SQL,就特別適合將運行結果放入緩存。這樣,后面的請求就去 緩存中讀取,使得請求能夠迅速響應。經過周密的計算,一瞬間為0.36 秒,一剎那有 0.018 秒.一彈指長達 7.2 秒。(二)并發 在大并發的情況下,所有的請求直接訪問數據庫,數據庫會出現連接異常。這個時候,就需要使用redis 做一個緩沖操作,讓請求先訪問到redis,而不是直接訪問數據庫。2、使用redis有什么缺點 回答:主要是四個問題 (一)緩存和數據庫雙寫一致性問題 (二)緩存雪崩問題 (三)緩存擊穿問題 (四)緩存的并發競爭問題3、單線程的redis為什么這么快 (一)純內存操作 (二)單線程操作,避免了頻繁的上下文切換 (三)采用了非阻塞I/O多路復用機制1、經營方式一就是傳統的并發模型,每個I/O流(快遞)都有一個新的線程(快遞員)管理。 2、經營方式二就是I/O多路復用。只有單個線程(一個快遞員),通過跟蹤每個I/O流的狀態 (每個快遞的送達地點),來管理多個I/O流。4、redis的數據類型,以及每種數據類型的使用場景 (一)String 最常規的set/get操作,value可以是String也可以是數字。一般做一些復雜的計數功能的緩存。 (二)hash 這里value存放的是結構化的對象,比較方便的就是操作其中的某個字段。博主在做單點登錄的時候, 就是用這種數據結構存儲用戶信息,以cookieId作為key,設置30分鐘為緩存過期時間,能很好的 模擬出類似session的效果。 (三)list 使用List的數據結構,可以做簡單的消息隊列的功能。另外還有一個就是,可以利用lrange命令, 做基于redis的分頁功能,性能極佳,用戶體驗好。本人還用一個場景,很合適---取行情信息。 就也是個生產者和消費者的場景。LIST可以很好的完成排隊,先進先出的原則。 (四)set 因為set堆放的是一堆不重復值的集合。所以可以做全局去重的功能。為什么不用JVM自帶的Set進行去重? 因為我們的系統一般都是集群部署,使用JVM自帶的Set,比較麻煩,難道為了一個做一個全局去重, 再起一個公共服務,太麻煩了。 (五)sorted set sorted set多了一個權重參數score,集合中的元素能夠按score進行排列。可以做排行榜應用, 取TOP N操作。5、redis的過期策略以及內存淘汰機制 redis采用的是定期刪除+惰性刪除策略。 為什么不用定時刪除策略? 定時刪除,用一個定時器來負責監視key,過期則自動刪除。雖然內存及時釋放,但是十分消耗CPU資源。 在大并發請求下,CPU要將時間應用在處理請求,而不是刪除key,因此沒有采用這一策略.定期刪除,redis默認每個100ms檢查,是否有過期的key,有過期key則刪除。需要說明的是, redis不是每個100ms將所有的key檢查一次,而是隨機抽取進行檢查(如果每隔100ms, 全部key進行檢查,redis豈不是卡死)。因此,如果只采用定期刪除策略,會導致很多key到時間沒有刪除。于是,惰性刪除派上用場。也就是說在你獲取某個key的時候,redis會檢查一下,這個key 如果設置了過期時間那么是否過期了?如果過期了此時就會刪除。不是的,如果定期刪除沒刪除key。然后你也沒即時去請求key,也就是說惰性刪除也沒生效。這樣, redis的內存會越來越高。那么就應該采用內存淘汰機制。在redis.conf中有一行配置 maxmemory-policy volatile-lru該配置就是配內存淘汰策略的(什么,你沒配過?好好反省一下自己) 1)noeviction:當內存不足以容納新寫入數據時,新寫入操作會報錯。應該沒人用吧。 2)allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的key。推薦使用, 目前項目在用這種。 3)allkeys-random:當內存不足以容納新寫入數據時,在鍵空間中,隨機移除某個key。 應該也沒人用吧,你不刪最少使用Key,去隨機刪。 4)volatile-lru:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,移除最近最少使用的key。這種情況一般是把redis既當緩存,又做持久化存儲的時候才用。不推薦 5)volatile-random:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中, 隨機移除某個key。依然不推薦 6)volatile-ttl:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中, 有更早過期時間的key優先移除。不推薦 ps:如果沒有設置 expire 的key, 不滿足先決條件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行為, 和 noeviction(不刪除) 基本上一致。6、redis和數據庫雙寫一致性問題 一致性問題是分布式常見問題,還可以再分為最終一致性和強一致性。數據庫和緩存雙寫, 就必然會存在不一致的問題。就是如果對數據有強一致性要求,不能放緩存。我們所做的一切, 只能保證最終一致性。另外,我們所做的方案其實從根本上來說,只能說降低不一致發生的概率, 無法完全避免。因此,有強一致性要求的數據,不能放緩存。首先,采取正確更新策略,先更新數據庫,再刪緩存。其次,因為可能存在刪除緩存失敗的問題, 提供一個補償措施即可,例如利用消息隊列。7、如何應對緩存穿透和緩存雪崩問題 緩存穿透,即黑客故意去請求緩存中不存在的數據,導致所有的請求都懟到數據庫上,從而數據庫連接異常。 解決方案: (一)利用互斥鎖,緩存失效的時候,先去獲得鎖,得到鎖了,再去請求數據庫。沒得到鎖, 則休眠一段時間重試 (二)采用異步更新策略,無論key是否取到值,都直接返回。value值中維護一個緩存失效時間,緩存 如果過期,異步起一個線程去讀數據庫,更新緩存。需要做緩存預熱(項目啟動前,先加載緩存)操作。 (三)提供一個能迅速判斷請求是否有效的攔截機制,比如,利用布隆過濾器,內部維護一系列合法有效的key。迅速判斷出,請求所攜帶的Key是否合法有效。如果不合法,則直接返回。緩存雪崩,即緩存同一時間大面積的失效,這個時候又來了一波請求,結果請求都懟到數據庫上, 從而導致數據庫連接異常。8、如何解決redis的并發競爭key問題 (1)如果對這個key操作,不要求順序 這種情況下,準備一個分布式鎖,大家去搶鎖,搶到鎖就做set操作即可,比較簡單。 (2)如果對這個key操作,要求順序

?

總結

以上是生活随笔為你收集整理的Redis入门详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。