第一章 NoSQL數據庫簡介
1.1 技術發展
技術的分類
1、解決功能性的問題:Java、Jsp、RDBMS、Tomcat、HTML、Linux、JDBC、SVN
2、解決擴展性的問題:Struts、Spring、SpringMVC、Hibernate、Mybatis
3、解決性能的問題:NoSQL、Java線程、Hadoop、Nginx、MQ、ElasticSearch
Web1.0時代
Web1.0的時代,數據訪問量很有限,用一夫當關的高性能的單點服務器可以解決大部分問題。
Web2.0時代
隨着Web2.0的時代的到來,用戶訪問量大幅度提升,同時產生了大量的用戶數據。加上後來的智能移動設備的普及,所有的互聯網平臺都面臨了巨大的性能挑戰。
解決CPU及內存壓力
用nosql方式
Session:在計算機中,尤其是在網絡應用中,稱爲“會話控制”。Session對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的Web頁之間跳轉時,存儲在Session對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程序的 Web頁時,如果該用戶還沒有會話,則Web服務器將自動創建一個 Session對象。當會話過期或被放棄後,服務器將終止該會話。
Cookie,有時也用其複數形式 Cookies。類型爲“小型文本文件”,是某些網站爲了辨別用戶身份,進行Session跟蹤而儲存在用戶本地終端上的數據(通常經過加密),由用戶客戶端計算機暫時或永久保存的信息。
解決IO壓力
用緩存數據庫進行存儲
把一些專門的方式用特點的方法進行存儲
1.2 NoSQL數據庫
NoSQL數據庫概述
NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,泛指非關係型的數據庫。
NoSQL 不依賴業務邏輯方式存儲,而以簡單的key-value模式存儲。因此大大的增加了數據庫的擴展能力。
- 不遵循SQL標準。
- 不支持ACID。
- 遠超於SQL的性能。
NoSQL適用場景
- 對數據高併發的讀寫
- 海量數據的讀寫
- 對數據高可擴展性的
NoSQL不適用場景
- 需要事務支持
- 基於sql的結構化查詢存儲,處理複雜的關係,需要即席查詢。
- (用不着sql的和用了sql也不行的情況,請考慮用NoSql)
幾種常見的NoSQL數據庫
Memcache |
|
Redis |
|
MongoDB |
|
HBase |
HBase是Hadoop項目中的數據庫。它用於需要對大量的數據進行隨機、實時的讀寫操作的場景中。 |
Cassandra |
Apache Cassandra是一款免費的開源NoSQL數據庫,其設計目的在於管理由大量商用服務器構建起來的龐大集羣上的海量數據集(數據量通常達到PB級別)。在衆多顯著特性當中,Cassandra最爲卓越的長處是對寫入及讀取操作進行規模調整,而且其不強調主集羣的設計思路能夠以相對直觀的方式簡化各集羣的創建與擴展流程。 |
Neo4j
|
主要應用:社會關係,公共交通網絡,地圖及網絡拓譜(n*(n-1)/2) |
DB-Engines 數據庫排名
http://db-engines.com/en/ranking
第二章 Redis概述安裝
-
Redis是一個開源的
key-value
存儲系統 -
和Memcached類似,它支持存儲的value類型相對更多,包括
string
(字符串)、list
(鏈表)、set
(集合)、zset
(sorted set --有序集合)和hash
(哈希類型)。 -
這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是
原子性
的。 -
在此基礎上,Redis支持各種不同方式的排序。
-
與memcached一樣,爲了保證效率,數據都是緩存在內存中。
-
區別的是Redis會
週期性
的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件。 -
並且在此基礎上實現了
master-slave
(主從)同步。
2.1 應用場景
配合關係型數據庫做高速緩存
- 高頻次,熱門訪問的數據,降低數據庫IO
- 分佈式架構,做session共享
多樣的數據結構存儲持久化數據
2.2 Redis安裝
Redis官方網站 |
Redis中文官方網站 |
http://redis.cn/ |
注意
:這裏都是Linux系統中的文件,我們以後使用也都是在Linux系統中
下載完成之後。
然後移動到Linux系統中。
準備工作:下載安裝最新版的gcc編譯器
安裝C語言的編譯環境
檢查linux中是否有gcc環境
gcc --version
我的linux就有,如果沒有就安裝
yum install gcc
進入文件目錄解壓
tar -zxvf xxx
編譯文件make
進入解壓後的文件,執行make
命令進行編譯
編譯中可能會遇見
如果沒有準備好C語言編譯環境,make會報錯—Jemalloc/jemalloc.h:沒有那個文件
解決方案:
查看gcc環境是否按照好。如果沒有就安裝
然後執行make distclean
清除才安裝的編譯文件
然後再次執行make
進行編譯
安裝redis
上面我們的步驟只是編譯完成了,並沒有安裝
接下來我們就安裝redis
直接跳過提示的make test
執行make install
安裝目錄:/usr/local/bin
查看默認安裝目錄:
redis-benchmark:性能測試工具,可以在自己本子運行,看看自己本子性能如何
redis-check-aof:修復有問題的AOF文件,rdb和aof後面講
redis-check-dump:修復有問題的dump.rdb文件
redis-sentinel:Redis集羣使用
redis-server:Redis服務器啓動命令
redis-cli:客戶端,操作入口
前臺啓動(不推薦)
redis-server
也可以不在bin目錄下執行
直接執行redis-server
就可以了。
注意:
但是前臺啓動的壞處就是,我們在前臺啓動了,那麼這個窗口就不能執行其他操作了。
退出操作:ctrl+c
後臺啓動(推薦)
後臺啓動好處:
比如我們把這個窗口關掉了,redis還在運行的。
注意:這裏我們redis都移動到/opt了
然後再進行我們的後臺啓動:
1、進入解壓文件並複製redis.conf
我們要redis.cong
複製到其他目錄下
2、更改redis.conf的配置
注意:
這裏我們改的是/etc下的redis.conf而不是它的源文件
更改內容如下:
將redis.conf裏的daempnize no改成yes
然後進行搜索關鍵字:這裏我們知道aio是插入
那麼搜索就是/
就直接/daemonize
然後插入,將no
改爲yes
在保存退出:wq
3、啓動redis
進入目錄/usr/local/bin
注意
:這裏也可以不用進入bin目錄就啓動redis。我親測有用。
4、通過客戶端連接redis
5、關閉redis
- 直接
shutdown
- 先退
exit
再找到它的進程然後殺掉進程kill -9 xxx
redis的相關知識介紹
端口6379從何而來?
6379在是手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字。MERZ長期以來被Redis作者antirez及其朋友當作愚蠢的代名詞。後來Redis作者在開發Redis時就選用了這個端口。
默認16個數據庫,類似數組下標從0開始,初始默認使用0號庫
- 使用命令 select <dbid>來切換數據庫 。如: select 8
- 統一密碼管理,所有庫同樣密碼
- dbsize查看當前數據庫的key的數量
- flushdb清空當前庫
- flushall通殺全部庫
Redis是單線程+多路IO複用技術
多路複用是指使用一個線程來檢查多個文件描述符(Socket)的就緒狀態,比如調用select和poll函數,傳入多個文件描述符,如果有一個文件描述符就緒,則返回,否則阻塞直到超時。得到就緒狀態後進行真正的操作可以在同一個線程裏執行,也可以啓動線程執行(比如使用線程池)
串行 vs 多線程+鎖(memcached) vs 單線程+多路IO複用(Redis)
(與Memcache三點不同: 支持多數據類型,支持持久化,單線程+多路IO複用)
第三章 常用五大數據類型
Redis有5種基礎數據結構,分別是string(字符串)、list(列表)、hash(字典)、set(集合)和zset(有序集合)。
哪裏去獲得redis常見數據類型操作命令http://www.redis.cn/commands.html
3.1 Redis鍵(key)
keys * | 查看當前庫所有key (匹配:keys *1) |
exists key | 判斷某個key是否存在 |
type key | 查看你的key是什麼類型 |
del key | 刪除某個鍵 |
unlink key | 根據value選擇非阻塞刪除 僅將keys從keyspace元數據中刪除,真正的刪除會在後續異步操作。 |
expire key 10 | 10秒鐘:爲給定的key設置過期時間 |
ttl key | 查看還有多少秒過期,-1表示永不過期,-2表示已過期 |
select | 命令切換數據庫 |
dbsize | 查看當前數據庫的key的數量 |
flushdb | 清空當前庫 |
flushall | 通殺全部庫 |
3.2 Redis字符串(String)
3.2.1 簡介
String是Redis最基本的類型,你可以理解成與Memcached一模一樣的類型,一個key對應一個value。
String類型是二進制安全的。意味着Redis的string可以包含任何數據。比如jpg圖片或者序列化的對象。
String類型是Redis最基本的數據類型,一個Redis中字符串value最多可以是512M
3.2.2 常用命令
set <key><value>添加鍵值對
*NX:當數據庫中key不存在時,可以將key-value添加數據庫
*XX:當數據庫中key存在時,可以將key-value添加數據庫,與NX參數互斥
*EX:key的超時秒數
*PX:key的超時毫秒數,與EX互斥
get <key> 查詢對應鍵值
append <key><value> 將給定的<value> 追加到原值的末尾
strlen <key> 獲得值的長度
setnx <key><value> 只有在 key 不存在時 設置 key 的值
incr <key>
- 將 key 中儲存的數字值增1
- 只能對數字值操作,如果爲空,新增值爲1
decr <key>
- 將 key 中儲存的數字值減1
- 只能對數字值操作,如果爲空,新增值爲-1
incrby / decrby <key><步長>將 key 中儲存的數字值增減。自定義步長。
INCR key對存儲在指定key的數值執行原子的加1操作
原子性
所謂原子操作是指不會被線程調度機制打斷的操作
這種操作一旦開始,就一直運行到結束,中間不會有任何 context switch (切換到另一個線程)。
(1)在單線程中, 能夠在單條指令中完成的操作都可以認爲是"原子操作",因爲中斷只能發生於指令之間。
(2)在多線程中,不能被其它進程(線程)打斷的操作就叫原子操作。
Redis單命令的原子性主要得益於Redis的單線程。
案例:
java中的i++是否是原子操作?不是
i=0;兩個線程分別對i進行++100次,值是多少?
mset <key1><value1><key2><value2> .....
同時設置一個或多個 key-value對
mget <key1><key2><key3> .....
同時獲取一個或多個 value
msetnx <key1><value1><key2><value2> .....
同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在。
原子性,有一個失敗則都失敗
getrange <key><起始位置><結束位置>
獲得值的範圍,類似java中的substring,前包,後包
setrange <key><起始位置><value>
用 <value> 覆寫<key>所儲存的字符串值,從<起始位置>開始(索引從0開始)。
setex <key><過期時間><value>
設置鍵值的同時,設置過期時間,單位秒。
getset <key><value>
以新換舊,設置了新值同時獲得舊值。
3.2.3 數據結構
String的數據結構爲簡單動態字符串(Simple Dynamic String,縮寫SDS)。是可以修改的字符串,內部結構實現上類似於Java的ArrayList,採用預分配冗餘空間的方式來減少內存的頻繁分配。
如圖中所示,內部爲當前字符串實際分配的空間capacity一般要高於實際字符串長度len。當字符串長度小於1M時,擴容都是加倍現有的空間,如果超過1M,擴容時一次只會多擴1M的空間。需要注意的是字符串最大長度爲512M。
3.3 Redis列表(List)
3.3.1 簡介
Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
它的底層實際是個雙向鏈表,對兩端的操作性能很高,通過索引下標的操作中間的節點性能會較差。
3.3.2 常用命令
lpush/rpush <key><value1><value2><value3> .... | 從左邊/右邊插入一個或多個值。 |
lpop/rpop <key> | 從左邊/右邊吐出一個值。值在鍵在,值光鍵亡。 |
rpoplpush <key1><key2> | 從<key1>列表右邊吐出一個值,插到<key2>列表左邊。 |
lrange <key><start><stop> | 按照索引下標獲得元素(從左到右) |
lrange mylist 0 -1 | 0左邊第一個,-1右邊第一個,(0-1表示獲取所有) |
lindex <key><index> | 按照索引下標獲得元素(從左到右) |
llen <key> | 獲得列表長度 |
linsert <key> before <value><newvalue> | 在<value>的後面插入<newvalue>插入值 |
ltrim <key> [索引1] [索引2] | 截取 [索引1, 索引2] 範圍的列表,重新賦值給 key |
lrem <key><n><value> |
刪除 n 個 value
|
lset<key><index><value> | 將列表key下標爲index的值替換成value |
3.3.3 數據結構
List的數據結構爲快速鏈表quickList。
首先在列表元素較少的情況下會使用一塊連續的內存存儲,這個結構是ziplist,也即是壓縮列表。
它將所有的元素緊挨着一起存儲,分配的是一塊連續的內存。
當數據量比較多的時候纔會改成quicklist。
因爲普通的鏈表需要的附加指針空間太大,會比較浪費空間。比如這個列表裏存的只是int類型的數據,結構上還需要兩個額外的指針prev和next。
Redis將鏈表和ziplist結合起來組成了quicklist。也就是將多個ziplist使用雙向指針串起來使用。這樣既滿足了快速的插入刪除性能,又不會出現太大的空間冗餘。
3.4.Redis集合(Set)
3.4.1.簡介
Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在於set是可以自動排重的,當你需要存儲一個列表數據,又不希望出現重複數據時,set是一個很好的選擇,並且set提供了判斷某個成員是否在一個set集合內的重要接口,這個也是list所不能提供的。
Redis的Set是string類型的無序集合。它底層其實是一個value爲null的hash表,所以添加,刪除,查找的複雜度都是O(1)。
一個算法,隨着數據的增加,執行時間的長短,如果是O(1),數據增加,查找數據的時間不變
3.4.2.常用命令
sadd <key><value1><value2> ..... | 將一個或多個 member 元素加入到集合 key 中,已經存在的 member 元素將被忽略 |
smembers <key> | 取出該集合的所有值。 |
sismember <key><value> | 判斷集合<key>是否爲含有該<value>值,有1,沒有0 |
scard<key> | 返回該集合的元素個數。 |
srem <key><value1><value2> | .... 刪除集合中的某個元素。 |
spop <key> | 隨機從該集合中吐出一個值。 |
srandmember <key><n> | 隨機從該集合中取出n個值。不會從集合中刪除 。 |
smove <source><destination>value | 把集合中一個值從一個集合移動到另一個集合 |
sinter <key1><key2> | 返回兩個集合的交集元素。 |
sunion <key1><key2> | 返回兩個集合的並集元素。 |
sdiff <key1><key2> |
返回兩個集合的差集元素(key1中的,不包含key2中的) |
3.4.3 數據結構
Redis 的集合相當於 Java 語言裏面的 HashSet,它內部的鍵值對是無序的唯一的。
它的內部實現相當於一個特殊的字典,字典中所有的 value 都是一個值 NULL。當集合中最後一個元素移除之後,數據結構自動刪除,內存被回收。
Java中HashSet的內部實現使用的是HashMap,只不過所有的value都指向同一個對象。
Redis的set結構也是一樣,它的內部也使用hash結構,所有的value都指向同一個內部值。
3.5 Redis字典(Hash)
3.5.1 簡介
Redis的字典相當於Java語言裏面的HashMap,它是無序字典,內部存儲了很多鍵值對。實現結構上與Java的HashMap也是一樣的,都是"數組+鏈表"二維結構。如圖所示,第一維hash的數組位置碰撞時,就會將碰撞的元素使用鏈表串接起來。
- Redis hash 是一個鍵值對集合。
- Redis hash是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
用戶ID爲查找的key,存儲的value用戶對象包含姓名,年齡,生日等信息,如果用普通的key/value結構來存儲,主要有以下2種存儲方式:
1. 用戶 ID 爲 key,value 爲 JavaBean 序列化後的字符串
缺點:每次修改用戶的某個屬性需要,先反序列化改好後再序列化回去。開銷較大。
2. {用戶ID + 屬性名} 作爲 key,屬性值作爲 value
缺點:用戶ID數據冗餘
3.通過 key(用戶ID) + field(屬性標籤) 就可以操作對應屬性數據了,既不需要重複存儲數據,也不會帶來序列化和併發修改控制的問題。
3.5.2 常用命令
hset <key><field><value> | 給<key>集合中的 <field>鍵賦值<value> |
hget <key1><field> | 從<key1>集合<field>取出 value |
hmset <key1><field1><value1><field2><value2>... | 批量設置hash的值 |
hexists<key1><field> | 查看哈希表 key 中,給定域 field 是否存在 |
hkeys <key> | 列出該hash集合的所有field |
hvals <key> | 列出該hash集合的所有value |
hincrby <key><field><increment> | 爲哈希表 key 中的域 field 的值加上增量 1 -1 |
hsetnx <key><field><value> | 將哈希表 key 中的域 field 的值設置爲 value ,當且僅當域 field 不存在 . |
3.5.3 數據結構
Hash類型對應的數據結構是兩種:ziplist(壓縮列表),hashtable(哈希表)。當field-value長度較短且個數較少時,使用ziplist,否則使用hashtable。
3.6 Redis有序集合Zset(sorted set)
3.6.1 簡介
Redis有序集合zset與普通集合set非常相似,是一個沒有重複元素的字符串集合。
不同之處是有序集合的每個成員都關聯了一個評分(score),這個評分(score)被用來按照從最低分到最高分的方式排序集合中的成員。集合的成員是唯一的,但是評分可以是重複了 。
因爲元素是有序的, 所以你也可以很快的根據評分(score)或者次序(position)來獲取一個範圍的元素。
訪問有序集合的中間元素也是非常快的,因此你能夠使用有序集合作爲一個沒有重複成員的智能列表。
3.6.2 常用命令
zadd <key><score1><value1><score2><value2>… | 將一個或多個 member 元素及其 score 值加入到有序集 key 當中 |
zrange <key><start><stop> [WITHSCORES] |
|
zrangebyscore key minmax [withscores] [limit offset count] | 返回有序集 key 中,所有 score 值介於 min 和 max 之間(包括等於 min 或 max )的成員。有序集成員按 score 值遞增(從小到大)次序排列 |
zrevrangebyscore key maxmin [withscores] [limit offset count] | 同上,改爲從大到小排列(降序) |
zincrby <key><increment><value> | 爲元素的score加上增量 |
zrem <key><value> | 刪除該集合下,指定值的元素 |
zcount <key><min><max> | 統計該集合,分數區間內的元素個數 |
zrank <key><value> | 返回該值在集合中的排名,從0開始 |
案例:如何利用zset實現一個文章訪問量的排行榜?
3.6.3 數據結構
SortedSet(zset)是Redis提供的一個非常特別的數據結構,一方面它等價於Java的數據結構Map<String, Double>,可以給每一個元素value賦予一個權重score,另一方面它又類似於TreeSet,內部的元素會按照權重score進行排序,可以得到每個元素的名次,還可以通過score的範圍來獲取元素的列表。
zset底層使用了兩個數據結構
(1)hash,hash的作用就是關聯元素value和權重score,保障元素value的唯一性,可以通過元素value找到相應的score值。
(2)跳躍表,跳躍表的目的在於給元素value排序,根據score的範圍獲取元素列表。
3.6.4.跳躍表(跳錶)
1、簡介
有序集合在生活中比較常見,例如根據成績對學生排名,根據得分對玩家排名等。對於有序集合的底層實現,可以用數組、平衡樹、鏈表等。數組不便元素的插入、刪除;平衡樹或紅黑樹雖然效率高但結構複雜;鏈表查詢需要遍歷所有效率低。Redis採用的是跳躍表。跳躍表效率堪比紅黑樹,實現遠比紅黑樹簡單。
2、實例
對比有序鏈表和跳躍表,從鏈表中查詢出51
(1)有序鏈表
要查找值爲51的元素,需要從第一個元素開始依次查找、比較才能找到。共需要6次比較。
(2)跳躍表
從第2層開始,1節點比51節點小,向後比較。
21節點比51節點小,繼續向後比較,後面就是NULL了,所以從21節點向下到第1層
在第1層,41節點比51節點小,繼續向後,61節點比51節點大,所以從41向下
在第0層,51節點爲要查找的節點,節點被找到,共查找4次。
從此可以看出跳躍表比有序鏈表效率要高
第四章 配置文件
4.1 Units單位
計量單位說明:只支持 bytes,不支持 bit;對大小寫不敏感。
4.2 Include包含
指定包含其他的配置文件,可以在同一主機上多個 Redis 實例之間使用同一份公共的配置文件,而同時各個實例又擁有自己的特定配置文件。
4.3 網絡相關
bind
- 默認情況
bind 127.0.0.1
只能接受本機的訪問請求 - 不配置的情況下,無限制接受任何 ip 地址的訪問
- 生產環境肯定要寫應用服務器的地址
- 如果開啓了
protected-mode
,就算沒有設定bind ip
且沒有設密碼的情況下,Redis 依舊只允許接受本機的響應,所以兩個都要搞
protected-mode
將本機訪問保護模式設置no
port
指定 Redis 監聽端口,默認 6379。
tcp-backlog
可以理解是一個請求到達後至到接受進程處理前的隊列,511 代表最大請求個數。
tcp-backlog 其實是一個連接隊列:backlog 隊列總和 = 未完成三次握手隊列 + 已經完成三次握手隊列
。
在高併發環境下你需要一個高 backlog 值來避免慢客戶端連接問題。注意 Linux 內核會將這個值減小到 /proc/sys/net/core/somaxconn
的值,所以需要確認增大 somaxconn 和 tcp_max_syn_backing 兩個值來達到想要的效果。
timeout
timeout:一個空閒的客戶端維持多少秒會關閉,0 爲永不關閉。
tcp-keepalive
對訪問客戶端的一種心跳檢測,每個 n 秒檢測一次。如果設置爲0,則不會進行 Keepalive 檢測。官方推薦設爲 60 秒。
4.4 Genernal通用
daemonize
以守護進程方式啓動(是否爲後臺進程)
pidfile
當 Redis 以守護進程方式運行時,Redis 默認會把 pid 寫入 /var/run/redis.pid 文件中,可以通過該配置指定存放 pid 文件的位置,每個實例會產生一個不同的 pid 文件。
log level
指定日誌記錄級別。4 個級別根據使用階段來選擇,生產環境選擇 notice 或者 warning。
logfile
日誌記錄方式,默認爲標準輸出;如果配置 Redis 爲守護進程方式運行,而這裏又配置日誌記錄方式爲標準輸出,則日誌將會發送給 /dev/null
syslog-*
databases
設定庫的數量
默認16,默認數據庫爲0,可以使用SELECT <dbid>命令在連接上指定數據庫id
4.5 Security安全
設置 Redis 連接密碼,如果配置了連接密碼,客戶端在連接 Redis 時需要通過 AUTH <password>
命令提供密碼,默認關閉。
在命令中設置密碼,只是臨時的。重啓redis服務器,密碼就還原了。
永久設置,需要再配置文件中進行設置。
4.6 Limit限制
maxclient
設置同一時間最大客戶端連接數max
默認情況下爲10000個客戶端
當客戶端連接數達到限制時,Redis 會關閉新的連接並向客戶端返回 max numbeR of clients reached 錯誤信息。如果設置 maxclients 爲 0,則表示不做限制。
maxmemory
- 設置 Redis 可以使用的最大內存限制。
- 建議必須設置,否則,將內存佔滿,造成服務器宕機
- 一旦到達內存使用上限,Redis 將會試圖移除內部數據,移除規則可以通過
maxmemory-policy
來指定。 - 如果 Redis 無法根據移除規則來移除內存中的數據或者設置了“不允許移除”,那麼 Redis 則會針對那些需要申請內存的指令返回錯誤信息,比如 SET、LPUSH 等。
- 但是對於無內存申請的指令,仍然會正常響應,比如GET等。如果你的redis是主redis(說明你的redis有從redis),那麼在設置內存使用上限時,需要在系統中留出一些內存空間給同步隊列緩存,只有在你設置的是“不移除”的情況下,纔不用考慮這個因素。
maxmemory-policy
- volatile-lru:使用LRU算法移除key,只對設置了過期時間的鍵;(最近最少使用)
- allkeys-lru:在所有集合key中,使用LRU算法移除key
- volatile-random:在過期集合中移除隨機的key,只對設置了過期時間的鍵
- allkeys-random:在所有集合key中,移除隨機的key
- volatile-ttl:移除那些TTL值最小的key,即那些最近要過期的key
- noeviction:不進行移除。針對寫操作,只是返回錯誤信息
maxmemory-samples
設置樣本數量,LRU 算法和最小 TTL 算法都並非是精確的算法,而是估算值,所以你可以設置樣本的大小。一般設置 3 到 7 的數字,數值越小樣本越不準確,但是性能消耗也越小。
第五章 發佈和訂閱
Redis 發佈訂閱 (pub/sub) 是一種消息通信模式:發送者 (pub) 發送消息,訂閱者 (sub) 接收消息。
Redis 客戶端可以訂閱任意數量的頻道。
1、客戶端可以訂閱頻道如下圖
2、當給這個頻道發佈消息後,消息就會發送給訂閱的客戶端
發佈訂閱命令行實現
1、 打開一個客戶端訂閱channel1
SUBSCRIBE channel1
2、打開另一個客戶端,給channel1發佈消息hello
publish channel1 hello
返回的1是訂閱者數量
3、打開第一個客戶端可以看到發送的消息
注:發佈的消息沒有持久化,如果在訂閱的客戶端收不到hello,只能收到訂閱後發佈的消息