Redis(一)NoSQL簡介、Redis安裝 、數據類型、配置文件、發佈訂閱

第一章 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

  • 很早出現的NoSql數據庫
  • 數據都在內存中,一般不持久化
  • 支持簡單的key-value模式,支持類型單一
  • 一般是作爲緩存數據庫輔助持久化的數據庫

Redis

  • 幾乎覆蓋了Memcached的絕大部分功能
  • 數據都在內存中,支持持久化,主要用作備份恢復
  • 除了支持簡單的key-value模式,還支持多種數據結構的存儲,比如 list、set、hash、zset等。
  • 一般是作爲緩存數據庫輔助持久化的數據庫

MongoDB

  • 高性能、開源、模式自由(schema  free)的文檔型數據庫
  • 數據都在內存中, 如果內存不足,把不常用的數據保存到硬盤
  • 雖然是key-value模式,但是對value(尤其是json)提供了豐富的查詢功能
  • 支持二進制數據及大型對象
  • 可以根據數據的特點替代RDBMS ,成爲獨立的數據庫。或者配合RDBMS,存儲特定的數據。

HBase

HBase是Hadoop項目中的數據庫。它用於需要對大量的數據進行隨機、實時的讀寫操作的場景中。
HBase的目標就是處理數據量非常龐大的表,可以用普通的計算機處理超過10億行數據,還可處理有數百萬列元素的數據表。

Cassandra

Apache Cassandra是一款免費的開源NoSQL數據庫,其設計目的在於管理由大量商用服務器構建起來的龐大集羣上的海量數據集(數據量通常達到PB級別)。在衆多顯著特性當中,Cassandra最爲卓越的長處是對寫入及讀取操作進行規模調整,而且其不強調主集羣的設計思路能夠以相對直觀的方式簡化各集羣的創建與擴展流程。

Neo4j

 

 

 主要應用:社會關係,公共交通網絡,地圖及網絡拓譜(n*(n-1)/2)

image-20210428153620379

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.io

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

  •   n > 0 從左往右刪 n 個
  •   n < 0 從右往左刪 n 個
  •   n = 0 刪除全部
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類型的fieldvalue的映射表,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]  
  • 返回有序集 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,只能收到訂閱後發佈的消息

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章