redis初識

第一步:下載redis
ttps://github.com/MSOpenTech/redis/releases
下載後解壓就可以使用
第二步:啓動
打開一個控制檯窗口,執行redis-server.exe
打開另一個控制檯窗口,執行redis-cli.exe -h 127.0.0.1 -p 6379 //初始無密碼無需添加密碼參數

設置密碼:
1)
config set requirepass "密碼"
2)配置文件修改
打開redis.conf ,找到requirepass
#requirepass foobared
requirepass 密碼
獲取密碼:
config get requirepass

Redis常用命令整理

doc 環境下使用命令:

keys 命令
? 匹配一個字符
* 匹配任意個(包括0個)字符
[] 匹配括號間的任一個字符,可以使用 "-" 符號表示一個範圍,如 a[b-d] 可以匹配 "ab","ac","ad"
\x 匹配字符x,用於轉義符號,如果要匹配 "?" 就需要使用 \?

判斷一個鍵值是否存在
exists key
如果存在,返回整數類型 1 ,否則返回 0

刪除鍵
del key [key.....]
可以刪除一個或多個鍵,返回值是刪除的鍵的個數
注意:不支持通配符刪除

獲得鍵值的數據類型
type key
返回值可能是 string(字符串類型) hash(散列類型) list(列表類型) set(集合類型) zset(有序集合類型)


賦值與取值
set key value 賦值
get key 取值

遞增數字
incr key
當存儲的字符串是整數形式時,redis提供了一個使用的命令 incr 作用是讓當前的鍵值遞增,並返回遞增後的值
incr num
當要操作的鍵不存在時會默認鍵值爲 0 ,所以第一次遞增後的結果是 1 ,當鍵值不是整數時 redis會提示錯誤

增加指定的整數
incrby key increment
incrby 命令與 incr 命令基本一樣,只不過前者可以通過 increment 參數指定一次增加的數值如:
incrby num 2
incrby num 3

減少指定的整數
decr key
decrby key increment
desc 命令與incr 命令用法相同,只不過是讓鍵值遞減
decrby 命令與 incrby命令用法相同

增加指定浮點數
incrbyfloat key increment
incrbyfloat 命令類似 incrby 命令,差別是前者可以遞增一個雙精度浮點數,如:
incrbyfloat num 2.7
注意: ( 受reids 版本限制,版本需要大於 2.6 版本)

向尾部追加值
append key value
作用是向鍵值的末尾追加 value ,如果鍵不存在則將改鍵的值設置爲 value,即相當於 set key value。返回值是追加後字符串的長度
如:append foo " hello word!"

獲取字符串長度
strlen key
返回鍵值的長度,如果鍵不存在則返回0

同時 獲得/設置 多個鍵值
mget key [key.....]
mset key value [key value .......]

位操作
getbit key offset
setbit key offset value
bitcount key [strart] [end]
bitop operation destkey key [key .....]
一個字節由8個二進制位組成,redis 提供了4個命令直接對二進制位進行操作
getbit 命令可以獲得一個字符串類型鍵指定位置的二進制位的值(0 或 1),索引從 0 開始,如果需要獲取的二進制位的索引超出了鍵值
的二進制位的實際長度則默認位值是 0
setbit 命令可以設置字符串類型鍵指定位置的二進制位的值,返回值是該位置的舊值,如果需要設置的位置超過了鍵值的二進制位的長
度,setbit 命令會自動將中間的二進制位設置爲0,同理設置一個不存在的鍵的指定二進制位的值會自動將其前面的位賦值爲 0
bitcount 命令可以獲得字符串類型鍵中值是1的二進制位個數,可以通過參數來限制統計的字節範圍,如我們希望統計前兩個字節(即
"aa") 命令:bitcount foo 0 1 注意: ( 受reids 版本限制,版本需要大於 2.6 版本)
bittop 命令可以對多個字符串類型鍵進行位運算,並將結果存儲在destkey參數指定的鍵中。該命令支持的運算操作有 AND、 OR、
XOR、 NOT,
如我們對bar 和 aar 進行 OR 運算操作:
set foo1 bar
set foo2 aar
bitop OR res foo1 foo2
get res
注: ( 受reids 版本限制,版本需要大於 2.6 版本)


散列類型

賦值與取值
hset key field value
hget key field
hmset key field value [ field value ...... ]
hmget key field [ field ...... ]
hgetall key
hset 命令用來給字段賦值,而hget命令用來獲得字段的值
hset 命令的方便之處在於不區分插入和更新操作,這意味着修改數據時不用事先判斷字段是否存在來決定要執行的是插入操作還是更新操
作,當執行的是插入操作時, hset 命令返回 1 ,當執行的是更新操作時,hset 命令返回的是 0 ,當鍵本身不存在時, hset 命令還會
自動建立他
hmset 設置多個鍵值
hmget 獲得多個鍵值
hgetall 獲取鍵中所有字段和字段值卻不知道鍵中有哪些字段時使用,返回的結果是字段和字段值組成的列表

判斷字段是否存在
hexists key field
存在返回 1 ,否則返回 0

當字段不存在時賦值
hsetnx key field value
hsetnx 命令與hset 命令類似,區別在於如果字段已經存在,hsetnx 命令將不執行任何操作

增加數字
hincrby key field increment
使字段值增加指定的整數

刪除字段
hdel key field [ field .....]
刪除一個或多個字段,返回值是被刪除的字段個數

只獲取字段名或字段值
hkeys key
hvals key
hkeys 獲取所有字段的名字
hvals 獲得鍵中所有字段的值

獲得字段數量
hlen key


列表類型

向列表兩端增加元素
lpush key value [ value ....... ]
rpush key value [ value ....... ]
lpush 命令用來向列表左邊增加元素,返回表示增加元素後列表的長度
rpush 命令用來向列表右邊增加元素,返回表示增加元素後列表的長度

從列表兩端彈出元素
lpop key
rpop key
lpop 命令可以從列表左邊彈出一個元素,lpop 命令執行兩步操作,1:將列表左邊的元素從列表中移除,2:返回被移除元素值
rpop 命令可以從列表右邊彈出一個元素

獲取列表中元素個數
llen key
當鍵不存在時,llen 返回 0

獲得列表片段
lrange key start stop
獲得列表中的某一片段,返回索引從 start 到 stop 之間的所有元素(包括兩端的元素) 索引開始爲 0
注:lrange 與很多語言中用來截取數組片段的方法有一點區別是 lrange 返回的值包含最右邊的元素
lrange 命令也支持負索引,表是從右邊開始計算序數,如 ' -1 ' 表示最右邊第一個元素, ' -2 ' 表示最右邊第二個元素,一次類推

刪除列表中指定的值
lrem key count value
lrem 命令會刪除列表中前 count 個值爲 value 的元素,返回值是實際刪除的元素個數。根據count 值的不同,lrem 命令執行的方式會
略有差異
當 count > 0 時,lrem 命令會從列表左邊開始刪除前 count 個值爲 value 的元素
當 count < 0 時,lrem 命令會從列表右邊開始刪除前count 個值爲 value 的元素
當 count = 0 時,lrem 命令會刪除所有值爲value的元素

獲得 / 設置 指定索引的元素值
lindex key index
lset key index value
lindex 命令用來返回指定索引的元素,索引從 0 開始 ,如果 index 是負數則表示從右邊開始計算的索引,最右邊元素的索引是 -1
lset 是通過索引操作列表的命令,它會將索引爲 index 的元素賦值爲 value

只保留列表指定片段
ltrim key start end
ltrim 命令可以刪除指定索引範圍之外的所有元素,其指定列表範圍的方法和 lrange 命令相同
ltrim 命令常和 lpush 命令一起使用來限制列表中元素的數量,比如記錄日誌時我們希望只保留最近的 100 條日誌,則每次加入新元素時
調用一次ltrim 命令即可;

向列表中插入元素
linsert key before | after pivot value
linsert 命令首先會在列表中從左到右查找值爲 pivot 的元素,然後根據第二個參數是 before 還是 after 來決定將 value 插入到該元素的
前面還是後面,如果命令執行成功,返回插入操作完成之後列表的長度。如果沒有找到 pivot 返回 -1 如果key 不存在或爲空,返回 0

將元素從一個列表轉到另一個列表R
rpoplpush source destination
rpoplpush 先執行 rpop 命令在執行 lpush 命令。rpoplpush 命令先會從source 列表類型鍵的右邊彈出一個元素,然後將其加入到 destination 列表類型鍵的左邊,並返回這個元素的值,整個過程是原子的



集合類型
增加刪除命令
sadd key member [ member .... ]
srem key member [ member .... ]
sadd 命令用來向集合中增加一個或多個元素,如果鍵不存在則會自動創建。因爲在一個集合中不能有相同的元素,所以如果要加入的元
素已經存在與集合中就會忽略這個元素。返回值是成功加入的元素數量(忽略的元素不計算在內)
srem 命令用來從集合中刪除一個或多個元素,並返回刪除成功的個數

獲得集合中的所有元素
smembers key
返回集合中的所有元素

判斷元素是否在集合中
sismember key member
判斷一個元素是否在集合中是一個時間複雜度爲 0(1) 的操作,無論集合中有多少個元素, sismember 命令始終可以極快的返回結果。當
值存在時 sismember 命令返回 1 ,當值不存在或者鍵不存在時返回 0

集合間運算
sdiff key [ key ...... ]
sdiff 命令用來對多個集合執行差集運算。集合 A 與集合 B 的差集表示爲 A- B ,代表所有屬於 A 且不屬於 B 的元素構成的集合,即
A - B = { x| x∈A 且 x ∈/B }

命令使用方法:
sadd seta 1 2 3 4 6 7 8
sadd setb 2 3 4
sdiff seta setb
該命令支持同時傳入多個鍵, 計算順序是先計算 seta 和 setb 在計算結果與 setc 的差集
sadd setc 2 3 4
sdiff seta setb setc

sinter key [ key ..... ]
該命令用來對多個集合執行交集運算。集合 A 與集合 B 的交集表示爲 A∩B,代表所有屬於 A 且屬於 B 的元素構成的集合
即 A∩B = { x| x∈A 且 x ∈B }

命令使用方法:
sinter seta setb
該命令同樣支持同時傳入多個鍵

sunion key [ key ...... ]
該命令用來對多個集合執行並集運算。集合 A 與集合 B的並集表示爲 A∪B ,代表所有屬於A或所有屬於B的元素構成的集合
即 A∪B = { x| x∈A 或 x ∈B }

命令使用方法:
sunion seta setb
該命令同樣支持同時傳入多個鍵

獲得集合中元素的個數
scard key

進行集合運算並將結果存儲
sdiffstore destination key [ key ...... ]
sinterstore destination key [ key ...... ]
sunionstore destination key [ key ...... ]
sdiffstore 命令和 sdiff 命令功能一樣,唯一的區別就是前者不會直接返回運算的結果,而是將結果存在 destination 鍵中
sinterstore 這個命令類似於 sinter 命令,但它將結果保存到 destination 集合,而不是簡單地返回結果集。
sunionstore 這個命令類似於 sunion 命令,但它將結果保存到 destination 集合,而不是簡單地返回結果集。

隨機獲得集合中的元素
srandmember key [ count ]
該命令用來隨機從集合中獲取一個元素
還可以傳遞 count 參數來一次隨機獲得多個元素,根據 count 的正負不同,具體表現也不同
當count 爲正數時,srandmember 會隨機獲取從集合裏獲得 count 個不重複的元素。如果 count 的值大於集合中的元素個數,則
srandmember 會返回集合中的全部元素
當 count 爲負數時,srandmember 會隨機從集合中獲得 |count| 個的元素,這些元素有可能相同
注:當傳遞count 參數時,在windows環境下提示命令參數錯誤

從集合中彈出一個元素
spop key
由於集合類型的元素是無序的,所以 spop 命令會從集合中隨機選擇一個元素彈出,返回值爲被移除的隨機元素,如果 key 不存在或者
key 爲空集時,返回 nil


有序集合類型(sorted set)
增加元素
zadd key score member [ score member ...... ]
zadd 命令用來向有序集合中加入一個元素和該元素的分數,如果該元素已經存在,則會用新的分數替換原有的分數。zadd命令的返回
值是新加入到集合中的元素個數(不包含之前已經存在的元素)

獲得元素的分數
zscore key member

獲得排名在某個範圍的元素列表
zrange key start stop [ withscores ]
zrevrange key start stop [ withscores ]
zrange 命令會按照元素分數從小到大的順序返回索引從 start 到 stop 之間的所有元素(包含兩端的元素)。zrange 命令和 lrange 命
令十分相似,如索引都是從0開始,負數代表從後向前查找(-1 表示最後一個元素)。如果需要同時獲得元素的分數的話,可以在
zrange 命令的尾部加上 widthscores 參數
注:如果兩個元素的分數相同,redis會按照字典順序(即 0<9<A<Z<a<z 這樣的順序)來進行排列。如果元素的值是中文,則取決於
中文的編碼方式,如圖:

zrevrange 命令和 zrange 的唯一不同在於 zrevrange 是按照元素分數從大到小的順序給定結果的

獲得指定分數範圍內的元素
zrangebyscore key min max [ withscores ] [ limit offset count ]
該命令按照元素分數從小到大的順序返回分數在 min 到 max 之間(包含 min 和max 的元素)
如果希望分數範圍不包含端點值,可以在分數前加上 "(" 符號,例如:希望返回80分到100分的的數據,可以包含80分單不包含100分
命令:zrangebyscore scoreboard 80 (100 widthscores

min 和 max 還支持無窮大,同 zadd 命令一樣,-inf 和 +inf 分別表示負無窮大和正無窮大。比如希望得到所有分數高於 80分(不
包含80分)的人的名單,但是卻不知道最高分是多少,這是就可以使用 +inf
zrangebyscore scoreboard (80 +inf

命令 limit offset count 與 SQL 中的用法基本相同,即在獲得的元素列表的基礎上向後偏移 offset 個元素並且只獲取前count個元



zrevrangebyscore 不僅是按照元素分數從大往小的順序給出結果,而且他的 min 和max 的參數的順序和 zrangebyscore 命令是相
反的


增加某個元素的分數
zincrby key increment member
zincrby 命令可以增加一個元素的分數,返回值是更改後的分數,例如想給peter 加 4 分
zincrby scoreborder 4 peter
increment 也可以是負數表示減分
zincrby scoreborder -4 peter
如果指定元素不存在,redis 在執行命令前會先建立它並將他的值賦爲0在執行操作

獲得集合中元素的數量
zcard key
獲得指定分數範圍內的元素個數
zcount key min max
zcount 命令的 min max 參數的特性與 zrangebyscore 命令中的一樣


刪除一個或多個元素
zrem key member [ member .... ]
zrem 命令的返回值是成功刪除的元素數量(不包含本來就不存在的元素)

按照排名範圍刪除元素
zremrangebyrank key start stop
按照元素分數從小到大的順序(即索引 0 表示最小的值)刪除在指定排名範圍內的所有元素,並返回刪除元素的數量


按照分數範圍刪除元素
zremrangebyscore key min max
zremrangebyscore 命令刪除指定分數範圍內的所有元素,參數 min 和 max 的特性和 zrangebyscore 命令中的一樣,返回值是刪除
元素的個數


獲得元素的排名
zrank key member
zrevrank key member
zrank 命令會按照元素分數從小到大的順序獲得指定的元素排名(從 0 開始,即分數最小的元素排名爲0)

zrebrank 命令則正好相反,分數最大的元素排名爲0

計算有序集合的交集
zinterstore destination numkeys key [ key ... ] [ weights weight [ weight ... ] ] [ aggregate SUM | MIN | MAX ]
zinterstore 命令用來計算多個有序集合的交集病將結果存儲在 destination 鍵中(同樣以有序集合類型存儲),返回值爲 destination
鍵中元素的個數,destination 鍵中元素的分數是由 aggregate 參數決定的
1. 當 aggregate 是 SUM (也就是默認值),destination 鍵中元素的分數是每個參與計算的集合中該元素分數的和

2.當 aggregate 是 MIN 時,destination 鍵中元素的分數是參與計算的集合中該元素分數最小值

3.當 aggregate 是 MAX 是,destination 鍵中元素的分數是參與計算的集合中該元素分數最大值

zinterstore 命令還能通過 weights 參數設置每個集合的權重,每個集合在參與計算時元素的分數會被乘上該集合的權重
如:


計算集合間的並集
zunionstore
用法與 zinterstore 命令的用法一樣


事務
事務的原理是先將屬於一個事務的命令發送給redis ,然後再讓 redis 依次執行這些命令


錯誤處理
(1)語法錯誤。語法錯誤指命令不存在或者命令參數個數不對。這種情況下,事務中只要有一個命令有語法錯誤,執行exec命令後redis
就會直接返回錯誤,連語法正確的命令也不會執行
注:redis 2.6.5 之前的版本會忽略有語法錯誤的命令,然後執行事務中其他語法正確的命令。
(2)運行錯誤。運行錯誤指在命令執行時出現的錯誤,比如使用散列類型的命令操作集合類型的鍵,這種錯誤在實際執行之前redis是無
法發現的,所以在事務裏這樣的命令是會被redis接受並執行的,如果事務裏的一條命令出現運行錯誤,事務裏其他的命令依然會繼
續執行(包含出錯命令之後的命令)

reids的事務沒有關係數據庫事務提供的回滾功能,爲此開發者必須在事務執行出錯之後自己收拾剩下的攤子

watch 命令
watch key [ key ... ]
監視一個或多個 key ,如果在事務執行之前這個或這些 key 被其他命令所改動,那麼事務將被打斷,監控一直持續到exec命令


unwatch
取消 watch 命令對所有 key 的監視


生存時間
expire
expire 命令的使用方法爲 expire key seconds ,其中 seconds 參數表示鍵的生存時間,單位是秒,該參數必須是整數

命令返回 1表示設置成功,返回 0 則表示鍵不存在或設置失敗

如果想知道一個鍵還有多久會被刪除,可以使用 ttl 命令。返回值是鍵的剩餘時間(單位是秒),

如果想取消鍵的生存時間設置(即將鍵恢復成爲永久的),可以使用 persist 命令。如果生存時間被成功清除則返回 1 。否則返回 0


除了 persist 命令之外,使用 set 、getset 命令爲鍵賦值也同時會清楚鍵的生存時間
注: incr 、lpush、hset、zrem 命令均不會影像鍵的生存時間

精確控制鍵的生存時間應該使用 pexpire 命令。該命令的單位是毫秒
可以使用 pttl 命令以毫秒爲單位返回鍵的剩餘時間
另外不太常用命令:expireat 和 pexpireat,該命令第二個參數表示鍵的生存時間的截至時間,expireat 單位秒 pexpireat 單位毫秒

sort
該命令可以對列表類型,集合類型,和有序集合類型鍵進行排序
列表類型:


有序集合類型排序時,會忽略元素的分數,只針對元素的自身的值進行排序


除了可以排列數字外,sort 命令還可以通過 alpha 參數實現按照字典順序排列非數字元素


sort 命令的 desc 參數可以實現將元素按照從大到小的順序排列
sort 命令還支持 limit 參數來返回指定範圍的結果,用法和sql 語句一樣 limit offset count ,表示跳過前 offset 個元素並獲取之後的
count 個元素


sort 命令 by 參數,默認情況下, sort uid 直接按照 uid 中的值排序,通過 by 參數,可以讓 uid 按照其他鍵的元素來排序

user_level_* 是一個佔位符,他先取出 uid 中的值,然後在用這個值來查找相應的鍵
比如在對 uid 列表進行排序時, 程序就會先取出 uid 的值 1 、 2 、 3 、 4 , 然後使用 user_level_1 、 user_level_2 、 user_level_3
和 user_level_4 的值作爲排序 uid 的權重。

使用 get 選項,可以根據排序的結果來取出相應的鍵值


一個sort 命令中可以有多個 get 參數(而 by 參數只能有一個)


默認情況下 sort 命令會直接返回排序結果,如果希望保存排序結果,可以使用 store 參數,保存後鍵的類型爲列表類型

編輯配置

你可以通過修改 redis.conf 文件或使用 CONFIG set 命令來修改配置。

語法
CONFIG SET 命令基本語法:

redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
實例
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
redis 127.0.0.1:6379> CONFIG GET loglevel

1) "loglevel"
2) "notice"
參數說明
/////////////////////////////////////////////////////////////////////
redis.conf 配置項說明如下:

1. Redis默認不是以守護進程的方式運行,可以通過該配置項修改,使用yes啓用守護進程

daemonize no

2. 當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,可以通過pidfile指定

pidfile /var/run/redis.pid

3. 指定Redis監聽端口,默認端口爲6379,作者在自己的一篇博文中解釋了爲什麼選用6379作爲默認端口,因爲6379在手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字

port 6379

4. 綁定的主機地址

bind 127.0.0.1

5.當 客戶端閒置多長時間後關閉連接,如果指定爲0,表示關閉該功能

timeout 300

6. 指定日誌記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認爲verbose

loglevel verbose

7. 日誌記錄方式,默認爲標準輸出,如果配置Redis爲守護進程方式運行,而這裏又配置爲日誌記錄方式爲標準輸出,則日誌將會發送給/dev/null

logfile stdout

8. 設置數據庫的數量,默認數據庫爲0,可以使用SELECT 命令在連接上指定數據庫id

databases 16

9. 指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合

save

Redis默認配置文件中提供了三個條件:

save 900 1

save 300 10

save 60 10000

分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。

10. 指定存儲至本地數據庫時是否壓縮數據,默認爲yes,Redis採用LZF壓縮,如果爲了節省CPU時間,可以關閉該選項,但會導致數據庫文件變的巨大

rdbcompression yes

11. 指定本地數據庫文件名,默認值爲dump.rdb

dbfilename dump.rdb

12. 指定本地數據庫存放目錄

dir ./

13. 設置當本機爲slav服務時,設置master服務的IP地址及端口,在Redis啓動時,它會自動從master進行數據同步

slaveof

14. 當master服務設置了密碼保護時,slav服務連接master的密碼

masterauth

15. 設置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時需要通過AUTH 命令提供密碼,默認關閉

requirepass foobared

16. 設置同一時間最大客戶端連接數,默認無限制,Redis可以同時打開的客戶端連接數爲Redis進程可以打開的最大文件描述符數,如果設置 maxclients 0,表示不作限制。當客戶端連接數到達限制時,Redis會關閉新的連接並向客戶端返回max number of clients reached錯誤信息

maxclients 128

17. 指定Redis最大內存限制,Redis在啓動時會把數據加載到內存中,達到最大內存後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大內存設置,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放內存,Value會存放在swap區

maxmemory

18. 指定是否在每次更新操作後進行日誌記錄,Redis在默認情況下是異步的把數據寫入磁盤,如果不開啓,可能會在斷電時導致一段時間內的數據丟失。因爲 redis本身同步數據文件是按上面save條件來同步的,所以有的數據會在一段時間內只存在於內存中。默認爲no

appendonly no

19. 指定更新日誌文件名,默認爲appendonly.aof

appendfilename appendonly.aof

20. 指定更新日誌條件,共有3個可選值:

no:表示等操作系統進行數據緩存同步到磁盤(快)

always:表示每次更新操作後手動調用fsync()將數據寫到磁盤(慢,安全)

everysec:表示每秒同步一次(折衷,默認值)

appendfsync everysec

21. 指定是否啓用虛擬內存機制,默認值爲no,簡單的介紹一下,VM機制將數據分頁存放,由Redis將訪問量較少的頁即冷數據swap到磁盤上,訪問多的頁面由磁盤自動換出到內存中(在後面的文章我會仔細分析Redis的VM機制)

vm-enabled no

22. 虛擬內存文件路徑,默認值爲/tmp/redis.swap,不可多個Redis實例共享

vm-swap-file /tmp/redis.swap

23. 將所有大於vm-max-memory的數據存入虛擬內存,無論vm-max-memory設置多小,所有索引數據都是內存存儲的(Redis的索引數據 就是keys),也就是說,當vm-max-memory設置爲0的時候,其實是所有value都存在於磁盤。默認值爲0

vm-max-memory 0

24. Redis swap文件分成了很多的page,一個對象可以保存在多個page上面,但一個page上不能被多個對象共享,vm-page-size是要根據存儲的 數據大小來設定的,作者建議如果存儲很多小對象,page大小最好設置爲32或者64bytes;如果存儲很大大對象,則可以使用更大的page,如果不 確定,就使用默認值

vm-page-size 32

25. 設置swap文件中的page數量,由於頁表(一種表示頁面空閒或使用的bitmap)是在放在內存中的,,在磁盤上每8個pages將消耗1byte的內存。

vm-pages 134217728

26. 設置訪問swap文件的線程數,最好不要超過機器的核數,如果設置爲0,那麼所有對swap文件的操作都是串行的,可能會造成比較長時間的延遲。默認值爲4

vm-max-threads 4

27. 設置在向客戶端應答時,是否把較小的包合併爲一個包發送,默認爲開啓

glueoutputbuf yes

28. 指定在超過一定的數量或者最大的元素超過某一臨界值時,採用一種特殊的哈希算法

hash-max-zipmap-entries 64

hash-max-zipmap-value 512

29. 指定是否激活重置哈希,默認爲開啓(後面在介紹Redis的哈希算法時具體介紹)

activerehashing yes

30. 指定包含其它的配置文件,可以在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有自己的特定配置文件

include /path/to/local.conf

Redis 安裝 Redis 數據類型
//////////////////////////////////////////////////////////////////////////////////
Redis的7個應用場景

一:緩存——熱數據

熱點數據(經常會被查詢,但是不經常被修改或者刪除的數據),首選是使用redis緩存,畢竟強大到冒泡的QPS和極強的穩定性不是所有類似工具都有的,而且相比於memcached還提供了豐富的數據類型可以使用,另外,內存中的數據也提供了AOF和RDB等持久化機制可以選擇,要冷、熱的還是忽冷忽熱的都可選。

結合具體應用需要注意一下:很多人用spring的AOP來構建redis緩存的自動生產和清除,過程可能如下:

Select 數據庫前查詢redis,有的話使用redis數據,放棄select 數據庫,沒有的話,select 數據庫,然後將數據插入redis

update或者delete數據庫錢,查詢redis是否存在該數據,存在的話先刪除redis中數據,然後再update或者delete數據庫中的數據

上面這種操作,如果併發量很小的情況下基本沒問題,但是高併發的情況請注意下面場景:

爲了update先刪掉了redis中的該數據,這時候另一個線程執行查詢,發現redis中沒有,瞬間執行了查詢SQL,並且插入到redis中一條數據,回到剛纔那個update語句,這個悲催的線程壓根不知道剛纔那個該死的select線程犯了一個彌天大錯!於是這個redis中的錯誤數據就永遠的存在了下去,直到下一個update或者delete。

二:計數器

諸如統計點擊數等應用。由於單線程,可以避免併發問題,保證不會出錯,而且100%毫秒級性能!爽。

命令:INCRBY

當然爽完了,別忘記持久化,畢竟是redis只是存了內存!

三:隊列

相當於消息系統,ActiveMQ,RocketMQ等工具類似,但是個人覺得簡單用一下還行,如果對於數據一致性要求高的話還是用RocketMQ等專業系統。

由於redis把數據添加到隊列是返回添加元素在隊列的第幾位,所以可以做判斷用戶是第幾個訪問這種業務

隊列不僅可以把併發請求變成串行,並且還可以做隊列或者棧使用

四:位操作(大數據處理)

用於數據量上億的場景下,例如幾億用戶系統的簽到,去重登錄次數統計,某用戶是否在線狀態等等。

想想一下騰訊10億用戶,要幾個毫秒內查詢到某個用戶是否在線,你能怎麼做?千萬別說給每個用戶建立一個key,然後挨個記(你可以算一下需要的內存會很恐怖,而且這種類似的需求很多,騰訊光這個得多花多少錢。。)好吧。這裏要用到位操作——使用setbit、getbit、bitcount命令。

原理是:

redis內構建一個足夠長的數組,每個數組元素只能是0和1兩個值,然後這個數組的下標index用來表示我們上面例子裏面的用戶id(必須是數字哈),那麼很顯然,這個幾億長的大數組就能通過下標和元素值(0和1)來構建一個記憶系統,上面我說的幾個場景也就能夠實現。用到的命令是:setbit、getbit、bitcount

五:分佈式鎖與單線程機制

驗證前端的重複請求(可以自由擴展類似情況),可以通過redis進行過濾:每次請求將request Ip、參數、接口等hash作爲key存儲redis(冪等性請求),設置多長時間有效期,然後下次請求過來的時候先在redis中檢索有沒有這個key,進而驗證是不是一定時間內過來的重複提交

秒殺系統,基於redis是單線程特徵,防止出現數據庫“爆破”

全局增量ID生成,類似“秒殺”

六:最新列表

例如新聞列表頁面最新的新聞列表,如果總數量很大的情況下,儘量不要使用select a from A limit 10這種low貨,嘗試redis的 LPUSH命令構建List,一個個順序都塞進去就可以啦。不過萬一內存清掉了咋辦?也簡單,查詢不到存儲key的話,用mysql查詢並且初始化一個List到redis中就好了。

七:排行榜

誰得分高誰排名往上。命令:ZADD(有續集,sorted set)

最近在研究股票,發現量化交易是個非常好的辦法,通過臆想出來規律,用程序對歷史數據進行驗證,來判斷這個臆想出來的規律是否有效,這玩意真牛!有沒有哪位玩這個的給我留個言,交流一下唄。

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