摘要:收到后則會(huì)調(diào)用指令一個(gè)子進(jìn)程來(lái)持久化存儲(chǔ)的數(shù)據(jù),在的持久化的這個(gè)短短期間內(nèi),的指令則存儲(chǔ)到內(nèi)存中。經(jīng)過(guò)官網(wǎng)的測(cè)試性能結(jié)果達(dá)到的。
HotFrameLearning Redis_01_簡(jiǎn)介
-
一、大致介紹1、介紹Redis之前,我有一堆的疑問(wèn),Redis是什么?有什么用?它能干什么?有什么特性?能解決我們?nèi)粘5哪男﹩?wèn)題? 為什么要用Redis?Redis好在哪里?除了Redis外還有其他替代方案么? 2、對(duì)于還沒(méi)了解過(guò)Redis的童鞋,可以帶著這些疑問(wèn)往下看,而對(duì)于了解過(guò)Redis的童鞋那就走過(guò)路過(guò)不要錯(cuò)過(guò)^_^。 3、另外目前討論的版本也是比較新的版本3.x版本;二、簡(jiǎn)單認(rèn)識(shí)Redis 2.1 何為Redis?
Redis 是一個(gè)開(kāi)源的基于內(nèi)存的數(shù)據(jù)結(jié)構(gòu)化存儲(chǔ)媒介,多用于數(shù)據(jù)庫(kù)、緩存以及消息代理。 再簡(jiǎn)言之,Redis 是一個(gè)基于內(nèi)存的 key-value 數(shù)據(jù)庫(kù)。2.2 原滋原味解釋
原文地址:https://redis.io/topics/introduction Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster. You can run atomic operations on these types, like appending to a string; incrementing the value in a hash; pushing an element to a list; computing set intersection, union and difference; or getting the member with highest ranking in a sorted set. In order to achieve its outstanding performance, Redis works with an in-memory dataset. Depending on your use case, you can persist it either by dumping the dataset to disk every once in a while, or by appending each command to a log. Persistence can be optionally disabled, if you just need a feature-rich, networked, in-memory cache. Redis also supports trivial-to-setup master-slave asynchronous replication, with very fast non-blocking first synchronization, auto-reconnection with partial resynchronization on net split. Other features include: Transactions - Pub/Sub - Lua scripting - Keys with a limited time-to-live - LRU eviction of keys - Automatic failover You can use Redis from most programming languages out there. Redis is written in ANSI C and works in most POSIX systems like Linux, *BSD, OS X without external dependencies. Linux and OS X are the two operating systems where Redis is developed and more tested, and we recommend using Linux for deploying. Redis may work in Solaris-derived systems like SmartOS, but the support is best effort. There is no official support for Windows builds, but Microsoft develops and maintains a Win-64 port of Redis.三、Redis的一些特性 3.1 數(shù)據(jù)類型
Redis支持多種數(shù)據(jù)結(jié)構(gòu),這也是它的亮點(diǎn)所在,除外Redis的單個(gè)Value最大限制為1GB,已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)memcached的 1MB的大小限制。下面我們看看它有哪些數(shù)據(jù)類型,能干什么用,內(nèi)部結(jié)構(gòu)是怎么樣的。 ? strings:字符串類型,最基本的數(shù)據(jù)類型,通常來(lái)存儲(chǔ)基本的字段值; ? hash:是一個(gè)string類型的Field和Value之間的映射表,通常用來(lái)存儲(chǔ)一個(gè)對(duì)象中各個(gè)Key與Value信息的映射; ? lists:元素都是string類型的雙向鏈表,通常用來(lái)存儲(chǔ)好友列表,粉絲列表,前十首熱門歌曲,最新消息排行等; ? set:是一個(gè)無(wú)序的string類型數(shù)據(jù)的集合,其內(nèi)部用的是HashMap實(shí)現(xiàn),只是Value都是空的而已,通常用來(lái)對(duì)數(shù)據(jù) 做交集、并集、差集等操作,因此就有類似共同好友,共同興趣等業(yè)務(wù)數(shù)據(jù)應(yīng)運(yùn)而生; ? sortset:有序set,其內(nèi)部?jī)H僅只是在set基礎(chǔ)上新增了一個(gè)排序score字段,通常用于具有排序功能的業(yè)務(wù)數(shù)據(jù)展示;3.2 持久化
Redis 提供了兩種持久化方式,一個(gè)是RDB(Redis DataBase),另一個(gè)是AOF(Append Only File),至于說(shuō)誰(shuí)好誰(shuí)差 呢?應(yīng)該說(shuō)各有所長(zhǎng),然而官網(wǎng)卻建議我們兩者結(jié)合使用,雙保險(xiǎn)嘛。 ? RDB:就是在不同的時(shí)間點(diǎn)生成的快照文件并存儲(chǔ)到硬盤上; ? AOF:就是將redis的那些寫指令記錄下來(lái),目的就是為了下次redis重啟時(shí)可以快速執(zhí)行這些指令恢復(fù)數(shù)據(jù); 不過(guò)既然用到Redis存儲(chǔ),個(gè)人建議如果大家沒(méi)有什么特殊的持久化需求的話,完全不用理會(huì)這兩種持久化的方式,直接 關(guān)閉即可,因?yàn)閞edis本來(lái)擅長(zhǎng)的領(lǐng)域就是內(nèi)存數(shù)據(jù)庫(kù),對(duì)于持久化存儲(chǔ)方面不擅長(zhǎng)。3.3 主從同步
Redis 所謂的主從一方面可是一主有多從,但是另外一方面每個(gè)從節(jié)點(diǎn)也可以有多個(gè)從節(jié)點(diǎn)。而這樣做的目的其實(shí)很簡(jiǎn) 單,一來(lái)是為了提升讀的性能,二來(lái)也是為了去中心化增加數(shù)據(jù)冗余備份。一旦主節(jié)點(diǎn)掛了,從節(jié)點(diǎn)就得立馬頂上去。 然而主從之間的同步的思路也是挺簡(jiǎn)單的,都是slave主動(dòng)向master發(fā)出sync指令,意思就是告訴master,slave需要同 步數(shù)據(jù)啦。master收到sync后則會(huì)調(diào)用bgsave指令fork一個(gè)子進(jìn)程來(lái)持久化存儲(chǔ)master的數(shù)據(jù),在master的持久化的這個(gè) 短短期間內(nèi),master的write指令則存儲(chǔ)到內(nèi)存中。待master的子進(jìn)程持久化完成后則將持久化的這個(gè)文件發(fā)送給slave節(jié)點(diǎn), 待slave接收完成并將數(shù)據(jù)加載到slave內(nèi)存中,然后master節(jié)點(diǎn)還會(huì)將持久化期間緩存的write指令再次發(fā)給slave節(jié)點(diǎn)。3.4 發(fā)布訂閱
該發(fā)布訂閱,和我們常用的MQ發(fā)送訂閱的模式是一樣的,支持訂閱單個(gè)頻道,也支持訂閱多個(gè)頻道,還支持類似正則表 達(dá)式一樣的模式匹配。3.5 事務(wù)
Redis 也擁有自己的一套事務(wù)機(jī)制,只是這個(gè)所謂的事務(wù)機(jī)制沒(méi)有關(guān)系型數(shù)據(jù)庫(kù)那么強(qiáng)大,但是還是勉強(qiáng)夠用,其實(shí)Redis 的事務(wù),就是一組命令的集合,MULTI、EXEC、DISCARD 和 WATCH 是 Redis 事務(wù)相關(guān)的命令。既然是一組命令的執(zhí)行,那么 Redis給了我們什么樣的保證呢?來(lái)保證執(zhí)行不被其他命令打斷或篡改呢? ? 保證一:事務(wù)是一個(gè)多帶帶的隔離操作,所有命令被序列號(hào)有序執(zhí)行; ? 保證二:事務(wù)是一個(gè)原子操作,要么全部執(zhí)行,要么全部不執(zhí)行; 然而在實(shí)際應(yīng)用中總是那么差強(qiáng)人意,事務(wù)中如果是因?yàn)檎Z(yǔ)法錯(cuò)誤的話,則是不會(huì)提交事務(wù),但是如果是運(yùn)行時(shí)錯(cuò)誤的 話,那就完蛋了,所有命令都會(huì)被執(zhí)行,沒(méi)有回滾機(jī)制,難道就沒(méi)有解救措施了么,這個(gè)還真沒(méi)有,運(yùn)行時(shí)錯(cuò)誤是編程時(shí) 需要杜絕的,這樣的話其實(shí)也不存在需要什么回滾操作,一切順其自然一氣呵成。 當(dāng)然Redis還提供一個(gè)WATCH命令,來(lái)防止EXEC執(zhí)行后發(fā)現(xiàn)值被篡改的話,則EXEC也照樣返回失敗處理;3.6 Lua腳本
Lua腳本功能是Reids 2.6版本的最大亮點(diǎn),通過(guò)內(nèi)嵌對(duì)Lua環(huán)境的支持,解決了長(zhǎng)久以來(lái)不能高效地處理CAS命令的缺點(diǎn), 并且可以通過(guò)組合使用多個(gè)命令, 輕松實(shí)現(xiàn)以前很難實(shí)現(xiàn)或者不能高效實(shí)現(xiàn)的模式。3.7 回收策略
回收策略,還有一個(gè){{BANNED}}的輔助幫手,就是客戶端每執(zhí)行一個(gè)命令,都會(huì)檢測(cè)內(nèi)存是否超標(biāo),如果超標(biāo),果斷淘汰。 六種回收策略如下: ? noeviction 不回收; ? allkeys-lru 從所有鍵中刪除最近最少使用的鍵; ? volatile-lru 從設(shè)置了過(guò)期時(shí)間的鍵中刪除最近最少使用的鍵; ? allkeys-random 從所有鍵中隨機(jī)刪除; ? volatile-random 從設(shè)置了過(guò)期時(shí)間的鍵中隨機(jī)刪除; ? volatile-ttl 從設(shè)置了過(guò)期時(shí)間的鍵中選擇存活時(shí)間最短的鍵刪除;3.8 線程模型
Redis 之所以有著飛一樣的讀寫速度,這還得得益于它的單進(jìn)程單線程模樣的線程模型。經(jīng)過(guò)Redis官網(wǎng)的測(cè)試性能結(jié) 果達(dá)到10W+的QPS。 優(yōu)秀的線程模型不但簡(jiǎn)化了代碼邏輯,而且也不用考慮并發(fā),也不用考慮各種鎖的問(wèn)題,更不存在多線程切換消耗CPU 的問(wèn)題了,一切的一切,就是單線程挨個(gè)挨個(gè)執(zhí)行。 但是這種線程模型架構(gòu)也帶來(lái)一定的問(wèn)題,犧牲了多核CPU性能,視多核CPU如無(wú)物,簡(jiǎn)直暴殄天物,反過(guò)來(lái)講,目前 得到大家的方響,也沒(méi)說(shuō)redis十分慢,若如果真的遇到了redis十分慢的話,那很有可能是開(kāi)發(fā)者的姿勢(shì)不對(duì),說(shuō)不定又 在哪里進(jìn)行了耗時(shí)的操作。四、Redis優(yōu)缺點(diǎn) 4.1 優(yōu)點(diǎn)
? 速度快,10W+的QPS,而且數(shù)據(jù)結(jié)構(gòu)類似HashMap查詢復(fù)雜度低; ? 數(shù)據(jù)結(jié)構(gòu)相對(duì)比較豐富,而且存儲(chǔ)的Value也相對(duì)足夠大; ? 支持事務(wù),而且還支持Lua腳本進(jìn)行CAS操作; ? 主從復(fù)制,支持讀寫分離,而且還支持RDB與AOF兩種持久化方式;4.2 缺點(diǎn)
? 不能充分利用多核CPU的硬件優(yōu)勢(shì); ? 多主多從模式中,如果某一區(qū)域獨(dú)立的主從同時(shí)掛掉且造成哈希槽的部分不可用,那么整個(gè)集群將會(huì)導(dǎo)致不可用; ? 網(wǎng)絡(luò)波動(dòng)會(huì)造成主從之間會(huì)進(jìn)行全量數(shù)據(jù)復(fù)制,如果快照文件過(guò)大,則會(huì)給內(nèi)存帶來(lái)非常大的壓力; ? 主從復(fù)制如果不在同一局域網(wǎng),則會(huì)給主從復(fù)制的性能帶來(lái)很大的損傷;4.3 對(duì)比memcached
? 數(shù)據(jù)類型:Redis不僅支持簡(jiǎn)單的k/v類型,還支持list,set.zset,hash等數(shù)據(jù)結(jié)構(gòu),但memcached支持圖片視頻緩存; ? 存儲(chǔ)方式:Redis在物理內(nèi)存用完時(shí)還能將很少用的Value進(jìn)行磁盤存儲(chǔ),有AOF與RDB兩種持久化存儲(chǔ)方式; ? 主從模式:Redis支持一主多從,也可以支持多主多從,但memcached利用magent適用于一主多從; ? 災(zāi)難恢復(fù):Redis可以通過(guò)從AOF或RDB方式恢復(fù)數(shù)據(jù),而memcached則不可恢復(fù); ? 數(shù)據(jù)大小:Redis的Value最大能支撐1G大小,而memcached最大支撐只有1M; ? 內(nèi)存分配:Redis會(huì)浪費(fèi)一定時(shí)間去分配內(nèi)存空間,而memcached則事先就分配好了一定的Page、Slab、Chunk空間; ? 等等還有很多,就不一一列舉了,想了解的更多跟詳細(xì),大家可以自行約會(huì)度娘問(wèn)個(gè)究竟。五、下載地址
https://gitee.com/ylimhhmily/HotFrameLearning.git
HotFrameLearning交流QQ群: 235322432
HotFrameLearning交流微信群: 微信溝通群二維碼圖片鏈接
歡迎關(guān)注,您的肯定是對(duì)我最大的支持!!!
-
<上一篇????????首頁(yè)????????下一篇>
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71450.html
摘要:熱門框架學(xué)習(xí)目錄項(xiàng)目介紹專輯欄目一簡(jiǎn)介環(huán)境安裝配置客戶端連接常用命令集群搭建分布式鎖二簡(jiǎn)介環(huán)境安裝配置基本特性啟動(dòng)過(guò)程分析選舉過(guò)程主從數(shù)據(jù)同步過(guò)程分析集群搭建分布式鎖三簡(jiǎn)介環(huán)境安裝配置基本特性基本概念和模型收發(fā)消息案例架構(gòu)初識(shí)收發(fā)消息原 HotFrameLearning 熱門框架學(xué)習(xí)(目錄) - I、項(xiàng)目介紹 - II、專輯欄目 一、Redis Redis 簡(jiǎn)介 Redis 環(huán)境安裝...
摘要:熱門框架學(xué)習(xí)前言一初衷知識(shí)是共享的,知識(shí)是大家的,本人也只是盡人事,幫助能幫助的人,將知識(shí)取之于民,用之于民。但游戲規(guī)則是需要服務(wù)于游戲服務(wù)于大眾的,脫離了這些,游戲規(guī)則僅僅只是一堆文字描述而已。 HotFrameLearning 熱門框架學(xué)習(xí)(前言) - 一、初衷 知識(shí)是共享的,知識(shí)是大家的,本人也只是盡人事,幫助能幫助的人,將知識(shí)取之于民,用之于民。 原本...
閱讀 1422·2023-04-26 01:58
閱讀 2297·2021-11-04 16:04
閱讀 1789·2021-08-31 09:42
閱讀 1776·2021-07-25 21:37
閱讀 1075·2019-08-30 15:54
閱讀 2083·2019-08-30 15:53
閱讀 3059·2019-08-29 13:28
閱讀 2700·2019-08-29 10:56