Redis是一個開源的記憶體資料庫,Redis提供了多種不同類型的資料結構,很多業務場景下的問題都可以很自然地映射到這些資料結構上。除此之外,通過複制、持久化和用戶端分片等特性,我們可以很友善地将Redis擴充成一個能夠包含數百GB資料、每秒處理上百萬次請求的系統。
Redis支援諸如字元串(strings)、哈希(hashes)、清單(lists)、集合(sets)、有序集合(sorted sets ) / ( zset)、位圖(bitmaps)、hyperloglogs、帶半徑查詢和流的地理空間索引等資料結構(geospatial indexes)。
資料類型
字元串String
String是Redis最基本的類型,你可以了解成與Memcached一模一樣的類型,一個key對應一個value。
String類型是二進制安全的。意味着Redis的string可以包含任何資料。比如jpg圖檔或者序列化的對象。
String類型是Redis最基本的資料類型,一個Redis中字元串value最多可以是512M
127.0.0.1:6379> set name lczmx
OK
127.0.0.1:6379> get name
"lczmx"
常用指令
指令 | 說明 |
---|---|
set key value | 設定指定 key 的值;NX:key不存在時添加;EX:key逾時秒數;PX:key逾時毫秒數,與EX互斥 |
get key | 擷取指定 key 的值。 |
append key value | 如果 key 已經存在并且是一個字元串, append 指令将指定的 value 追加到該 key 原來值(value)的末尾。 |
strlen key | 傳回 key 所儲存的字元串值的長度。 |
setnx key value | 隻有在 key 不存在時設定 key 的值。 |
incr key | 将 key 中儲存的數字值增一。 |
incrby key increment | 将 key 所儲存的值加上給定的增量值(increment) 。 |
decr key | 将 key 中儲存的數字值減一。 |
decrby key decrement | key 所儲存的值減去給定的減量值(decrement) 。 |
getrange key start end | 傳回 key 中字元串值的子字元 |
getset key value | 将給定 key 的值設為 value ,并傳回 key 的舊值(old value)。 |
setex key seconds value | 将值 value 關聯到 key ,并将 key 的過期時間設為 seconds (以秒為機關)。 |
getbit key offset | 對 key 所儲存的字元串值,擷取指定偏移量上的位(bit)。 |
mget key1 [key2..] | 擷取所有(一個或多個)給定 key 的值。 |
setbit key offset value | 對 key 所儲存的字元串值,設定或清除指定偏移量上的位(bit)。 |
setrange key offset value | 用 value 參數覆寫給定 key 所儲存的字元串值,從偏移量 offset 開始。 |
mset key value [key value ...] | 同時設定一個或多個 key-value 對。 |
msetnx key value [key value ...] | 同時設定一個或多個 key-value 對,當且僅當所有給定 key 都不存在。 |
psetex key milliseconds value | 這個指令和 setex 指令相似,但它以毫秒為機關設定 key 的生存時間,而不是像 setex 指令那樣,以秒為機關。 |
incrbyfloat key increment | 将 key 所儲存的值加上給定的浮點增量值(increment) 。 |
資料結構
String的資料結構為簡單動态字元串(Simple Dynamic String,縮寫SDS)。是可以修改的字元串,内部結構如下圖,采用預配置設定備援空間的方式來減少記憶體的頻繁配置設定。
- 内部為目前字元串實際配置設定的空間capacity一般要高于實際字元串長度len。
- 當字元串長度小于1M時,擴容都是加倍現有的空間,如果超過1M,擴容時一次隻會多擴1M的空間。
- 需要注意的是字元串最大長度為512M。
清單List
Redis 清單是簡單的字元串清單,按照插入順序排序。你可以添加一個元素到清單的頭部(左邊)或者尾部(右邊)。
127.0.0.1:6379> lpush city beijing shanghai guangzhou
(integer) 3
127.0.0.1:6379> lrange city 0 10
1) "guangzhou"
2) "shanghai"
3) "beijing
以上指令,使用lpush可以為city這個鍵添加一個或多個值(加到左邊),在使用
lrange city 0 10
把左面的11個值
[0:10]
取出,清單最多可存儲 232 - 1 元素 (4294967295, 每個清單可存儲40多億)。
lpush key value1 [value2] | 将一個或多個值插入到清單頭部 |
rpush key value1 [value2] | 将一個或多個值插入到清單尾部 |
lpop key | 移出并擷取清單的第一個元素 |
rpop key | 移出并擷取清單的最後一個元素 |
llen key | 擷取清單長度 |
rpoplpush source destination | 移除source清單的最後一個元素,并将該元素添加到destination清單的頭部,并傳回 |
lrange key start stop | 擷取清單指定範圍内 的元素,可以使用負索引 |
lindex key index | 通過索引擷取清單中的元素 |
linsert key before/after value1 value2 | 在value1之前/後插入值value2 |
lrem key count value | 從左邊删除count個value(從左到右) |
lset key index value | 通過索引設定清單元素的值 |
blpop key1 [key2 ] timeout | 移出并擷取清單的第一個元素, 如果清單沒有元素會阻塞清單直到等待逾時或發現可彈出元素為止 |
brpop key1 [key2 ] timeout | 移出并擷取清單的最後一個元素, 如果清單沒有元素會阻塞清單直到等待逾時或發現可彈出元素為止 |
brpoplpush source destination timeout | 從清單中彈出一個值,将彈出的元素插入到另外一個清單中并傳回它; 如果清單沒有元素會阻塞清單直到等待逾時或發現可彈出元素為止 |
lpushx key value | 将一個值插入到已存在的清單頭部 |
rpushx key value | 将一個值插入到已存在的清單尾部 |
ltrim key start stop | 對一個清單進行修剪(trim),就是說,讓清單隻保留指定區間内的元素,不在指定區間之内的元素都将被删除 |
List的資料結構為快速連結清單quickList。
首先在清單元素較少的情況下會使用一塊連續的記憶體存儲,這個結構是ziplist,也即是壓縮清單。它将所有的元素緊挨着一起存儲,配置設定的是一塊連續的記憶體。
當資料量比較多的時候才會改成quicklist。因為普通的連結清單需要的附加指針空間太大,會比較浪費空間。比如這個清單裡存的隻是int類型的資料,結構上還需要兩個額外的指針prev和next。
Redis将連結清單和ziplist結合起來組成了quicklist。也就是将多個ziplist使用雙向指針串起來使用。這樣既滿足了快速的插入删除性能,又不會出現太大的空間備援。
哈希Hash
Redis hash 是一個string 類型的field 和value 的映射表。hash特别适合用于存儲對象。添加,删除操作都是O(1)(平均)。
127.0.0.1:6379> hmset user age 18 addr "beijing"
OK
127.0.0.1:6379> hget user age
"18"
127.0.0.1:6379> hget user addr
"beijing"
上面使用hmset建立了一個key:user,它包含兩個field(age、addr)分别值(value)為18、beijing
再用hget擷取一個字段的值
hset key field value | 将哈希表 key 中的字段 field 的值設為 value 。 |
hget key field | 擷取存儲在哈希表中指定字段的值。 |
hdel key field1 [field2] | 删除一個或多個哈希表字段 |
hexists key field | 檢視哈希表 key 中,指定的字段是否存在。 |
hkeys key | 擷取所有哈希表中的字段 |
hvals key | 擷取哈希表中所有值。 |
hincrby key field increment | 為哈希表 key 中的指定字段的整數值加上增量 increment 。 |
hsetnx key field value | 隻有在字段 field 不存在時,設定哈希表字段的值。 |
hlen key | 擷取哈希表中字段的數量 |
hmget key field1 [field2] | 擷取所有給定字段的值 |
hmset key field1 value1 [field2 value2 ] | 同時将多個 field-value (域-值)對設定到哈希表 key 中。 |
hgetall key | 擷取在哈希表中指定 key 的所有字段和值 |
hincrbyfloat key field increment | 為哈希表 key 中的指定字段的浮點數值加上增量 increment 。 |
hscan key cursor [match pattern] [count count] | 疊代哈希表中的鍵值對。 |
配置檔案相關
hash-max-zipmap-entries 64 # 配置字段最多64 個
hash-max-zipmap-value 512 # 配置value 最大為512 位元組
Hash類型對應的資料結構是兩種:ziplist(壓縮清單),hashtable(哈希表)。當field-value長度較短且個數較少時,使用ziplist,否則使用hashtable。
集合Set
set對外提供的功能與list類似是一個清單的功能,特殊之處在于set是可以自動排重的。當你需要存儲一個清單資料,又不希望出現重複資料時,set是一個很好的選擇,并且set提供了判斷某個成員是否在一個set集合内的重要接口,這個也是list所不能提供的。
Redis的Set是string類型的無序集合。它底層其實是一個value為null的hash表,是以添加,删除,查找的複雜度都是O(1)。
127.0.0.1:6379> sadd name tom kk
(integer) 2
127.0.0.1:6379> sadd name tom
(integer) 0
127.0.0.1:6379> smembers name
1) "kk"
2) "tom"
使用sadd添加一個或多個值, 再使用smembers拿到所有的元素
注意:Set中的元素唯一,是以不能插入一個已經存在的元素
sadd key member1 [member2] | 向集合添加一個或多個成員 |
smembers key | 傳回集合中的所有成員 |
sismember key member | 判斷 member 元素是否是集合 key 的成員 |
scard key | 擷取集合的成員數 |
srem key member1 [member2] | 移除集合中一個或多個成員 |
spop key | 移除并傳回集合中的一個随機元素 |
srandmember key [count] | 傳回集合中一個或多個随機數(不會删除) |
smove source destination member | 将 member 元素從 source 集合移動到 destination 集合 |
sdiff key1 [key2] | 傳回給定所有集合的差集 |
sinter key1 [key2] | 傳回給定所有集合的交集 |
sunion key1 [key2] | 傳回所有給定集合的并集 |
sdiffstore destination key1 [key2] | 傳回給定所有集合的差集并存儲在 destination 中 |
sinterstore destination key1 [key2] | 傳回給定所有集合的交集并存儲在 destination 中 |
sunionstore destination key1 [key2] | 所有給定集合的并集存儲在 destination 集合中 |
sscan key cursor [match pattern] [count count] | 疊代集合中的元素 |
Set資料結構是dict字典,字典是用哈希表實作的,它的内部使用hash結構,所有的value都指向同一個内部值。
有序集合Zset
Redis有序集合zset與普通集合set非常相似,是一個沒有重複元素的字元串集合。
不同之處是有序集合的每個成員都關聯了一個評分(score),這個評分(score)被用來按照從最低分到最高分的方式排序集合中的成員。集合的成員是唯一的,但是評分可以是重複了 。因為元素是有序的, 是以你也可以很快的根據評分(score)或者次序(position)來擷取一個範圍的元素。通路有序集合的中間元素也是非常快的,是以你能夠使用有序集合作為一個沒有重複成員的智能清單。
127.0.0.1:6379> zadd top 1 lihua 2 zhangsan 3 lisi
(integer) 3
127.0.0.1:6379> zrange top 0 3
1) "lihua"
2) "zhangsan"
3) "lisi"
zadd key score1 member1 [score2 member2] | 向有序集合添加一個或多個成員,或者更新已存在成員的分數 |
zrange key start stop [withscores] | 通過索引區間傳回有序集合指定區間内的成員,帶WITHSCORES,可以讓分數一起和值傳回到結果集。 |
zrangebyscore key min max [withscores] [limit] | 通過分數傳回有序集合指定區間内的成員 |
zrevrangebyscore key max min [withscores] | 傳回有序集中指定分數區間内的成員,分數從高到低排序 |
zincrby key increment member | 有序集合中對指定成員的分數加上增量 increment |
zrem key member [member ...] | 移除有序集合中的一個或多個成員 |
zcount key min max | 計算在有序集合中指定區間分數的成員數 |
zrank key member | 傳回有序集合中指定成員的索引,從0開始 |
zremrangebyscore key min max | 移除有序集合中給定的分數區間的所有成員 |
zcard key | 擷取有序集合的成員數 |
zinterstore destination numkeys key [key ...] | 計算給定的一個或多個有序集的交集并将結果集存儲在新的有序集合 key 中 |
zlexcount key min max | 在有序集合中計算指定字典區間内成員數量 |
zrangebylex key min max [limit offset count] | 通過字典區間傳回有序集合的成員 |
zremrangebylex key min max | 移除有序集合中給定的字典區間的所有成員 |
zremrangebyrank key start stop | 移除有序集合中給定的排名區間的所有成員 |
zrevrange key start stop [withscores] | 傳回有序集中指定區間内的成員,通過索引,分數從高到低 |
zrevrank key member | 傳回有序集合中指定成員的排名,有序內建員按分數值遞減(從大到小)排序 |
SortedSet(zset)是Redis提供的一個非常特别的資料結構,可以給每一個元素value賦予一個權重score,内部的元素會按照權重score進行排序,可以得到每個元素的名次,還可以通過score的範圍來擷取元素的清單。
zset底層使用了兩個資料結構
- hash,hash的作用就是關聯元素value和權重score,保障元素value的唯一性,可以通過元素value找到相應的score值。
- 跳躍表,跳躍表的目的在于給元素value排序,根據score的範圍擷取元素清單。 例子,找值為51的元素:
- 從第2層開始,1節點比51節點小,向後比較。
- 21節點比51節點小,繼續向後比較,後面就是NULL了,是以從21節點向下到第1層
- 在第1層,41節點比51節點小,繼續向後,61節點比51節點大,是以從41向下
- 在第0層,51節點為要查找的節點,節點被找到,共查找4次。
由此可以看出,跳躍表不像有序連結清單一樣根據順序以此查找,是以跳躍表的查詢效率要更高。
Bitmaps
為了合理地使用操作位能夠有效地提高記憶體使用率和開發效率。Redis提供了Bitmaps這個“資料類型”可以實作對位的操作:
- Bitmaps本身不是一種資料類型, 實際上它就是字元串(key-value) , 但是它可以對字元串的位進行操作。
- Bitmaps單獨提供了一套指令, 是以在Redis中使用Bitmaps和使用字元串的方法不太相同。 可以把Bitmaps想象成一個以位為機關的數組, 數組的每個單元隻能存儲0和1, 數組的下标在Bitmaps中叫做偏移量。
設定Bitmaps中某個偏移量的值(0或1),offset偏移量從0開始 | |
擷取Bitmaps中某個偏移量的值 | |
bitcount key start end | 統計字元串從start位元組到end位元組比特值為1的數量,範圍是 |
bitop and(or/not/xor) destkey key1 key2 [key3.…] | 多個Bitmaps進行and(交集) 、 or(并集) 、 not(非) 、 xor(異或) 操作,然後将結果儲存在destkey中 |
執行個體
記錄每個使用者是否通路過網站。1為通路過,0為未通路。
127.0.0.1:6379> setbit access:user:20210710 1 1
(integer) 0
127.0.0.1:6379> setbit access:user:20210710 2 1
(integer) 0
127.0.0.1:6379> setbit access:user:20210710 5 1
(integer) 0
127.0.0.1:6379> setbit access:user:20210710 7 1
(integer) 0
127.0.0.1:6379> setbit access:user:20210710 8 1
(integer) 0
127.0.0.1:6379> bitcount access:user:20210710 0 -1
(integer) 5
127.0.0.1:6379>
# id為1、2、5、7、8共5個使用者通路過
# 通過取值輕松得知該使用者是否通路過
127.0.0.1:6379> getbit access:user:20210710 1
(integer) 1
127.0.0.1:6379> getbit access:user:20210710 3
(integer) 0
另外我們還可以使用
bitop
計算哪些使用者在哪些時間段通路了,使用and求交集;還可計算出任意一天都通路過網站的使用者數量(例如月活躍就是類似這種) , 可以使用or求并集
Bitmaps與set對比:
當多使用者且使用者活躍時,使用Bitmaps能節省很多的記憶體空間, 尤其是随着時間推移節省的記憶體還是非常可觀的。
然而當網站每天的獨立通路使用者很少, 例如隻有10萬(大量的僵屍使用者) , 那麼兩者的對比如下表所示, 很顯然, 這時候使用Bitmaps就不太合适了, 因為基本上大部分位都是0。
HyperLogLog
在工作當中,我們經常會遇到與統計相關的功能需求,比如統計網站PV(PageView頁面通路量),可以使用Redis的incr、incrby輕松實作。
但像UV(UniqueVisitor,獨立訪客)、獨立IP數、搜尋記錄數等需要去重和計數的問題如何解決?這種求集合中不重複元素個數的問題稱為基數問題。
解決基數問題有很多種方案:
- 資料存儲在MySQL表中,使用distinct count計算不重複個數
-
使用Redis提供的hash、set、bitmaps等資料結構來處理
但是,以上的方案結果精确,但随着資料不斷增加,導緻占用空間越來越大,對于非常大的資料集是不切實際的。
Redis推出了HyperLogLog,它是用來做基數統計的算法。在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定的、并且是很小的,隻需要花費 12 KB 記憶體,就可以計算接近 2^64 個不同元素的基數。
但是,因為 HyperLogLog 隻會根據輸入元素來計算基數,而不會儲存輸入元素本身,所不能傳回輸入的各個元素。
pfadd key element [element ...] | 添加一個或多個元素到 HyperLogLog 中。 近似基數發生變化,傳回1,否則傳回0 |
pfcount key [key ...] | 計算近似基數 |
pfmerge destkey sourcekey [sourcekey ...] | 将一個或多個HLL合并後的結果存儲在destkey中 |
pfmerge可以用來計算每月活躍使用者(使用每天的活躍使用者來合并計算可得)。
Geospatial
讀音:
[ˌdʒiːəʊˈspeɪʃəl]
,意為"地理空間的"。顧名思義,該類型與地理空間相關,它提供了經緯度設定,查詢,範圍查詢,距離查詢,經緯度Hash等常見操作。
geoadd key longitude latitude member [longitude latitude member...] | 添加地理位置(經度,緯度,名稱),兩極無法直接添加 |
geopos key member [member...] | 獲得指定地區的坐标值 |
geodist key member1 member2 [m | km |
# geoadd添加
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen 116.38 39.90 beijing
(integer) 3
# 擷取一個地區的經緯度
127.0.0.1:6379> geopos china:city shanghai
1) 1) "121.47000163793563843"
2) "31.22999903975783553"
# 擷取shenzhen與beijing之間的直線距離,以km表示
127.0.0.1:6379> geodist china:city shenzhen beijing km
"1945.5740"
127.0.0.1:6379>
全局指令
exists key | 檢查給定 key 是否存在 |
del key | key 存在時删除 key |
rename key newkey | 修改 key 的名稱 |
expire key seconds | 為給定 key 設定過期時間,以秒計 |
ttl key | 以秒為機關,傳回給定 key 的剩餘生存時間(ttl, time to live) |
type key | 傳回 key 所儲存的值的類型 |
select index | 選擇資料庫 |
auth password | 驗證密碼 |
dbsize | 檢視目前資料庫的key的數量 |
flushdb | 清空目前庫 |
flushall | 通殺全部庫 |
expireat key timestamp | expireat 的作用和 expire 類似,都用于為 key 設定過期時間。 不同在于 expireat 指令接受的時間參數是 unix 時間戳(unix timestamp) |
pexpire key milliseconds | 設定 key 的過期時間以毫秒計 |
pexpireat key milliseconds-timestamp | 設定 key 過期時間的時間戳(unix timestamp) 以毫秒計 |
keys pattern | 查找所有符合給定模式( pattern)的 key,如: |
move key db | 将目前資料庫的 key 移動到給定的資料庫 db 當中 |
persist key | 移除 key 的過期時間,key 将持久保持 |
pttl key | 以毫秒為機關傳回 key 的剩餘的過期時間 |
randomkey | 從目前資料庫中随機傳回一個 key |
dump key | 序列化給定 key ,并傳回被序列化的值 |
renamenx key newkey | 僅當 newkey 不存在時,将 key 改名為 newkey |
scan cursor [match pattern] [count count] | 疊代資料庫中的資料庫鍵 |
配置檔案
reids的配置檔案在redis的安裝目錄下的redis.conf檔案(windows平台是redis.windows.conf),當然啟動時也可以指定配置檔案啟動:
redis-sever /etc/redis.conf
。
- 在指令行中擷取配置檔案:
CONFIG GET CONFIG_SETTING_NAME
- 在指令行中修改配置檔案:
所有使用CONFIG SET設定的配置參數将會立即被Redis加載,并從下一個執行的指令開始生效。CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
Units機關
配置大小機關,開頭定義了一些基本的度量機關,隻支援bytes,不支援bit
大小寫不敏感。
# Note on units: when memory size is needed, it is possible to specify
# it in the usual form of 1k 5GB 4M and so forth:
#
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same.
INCLUDES包含
# include /path/to/local.conf
# include /path/to/other.conf
指定包含其它的配置檔案,可以在同一主機上多個Redis執行個體之間使用同一份配置檔案,而同時各個執行個體又擁有自己的特定配置檔案
網絡相關配置
-
bind
預設為127.0.0.1,不寫時,可接受任何ip位址的通路
bind 127.0.0.1 -::1
-
protected-mode
設定本機通路保護模式
protected-mode yes
注意:
如果開啟了protected-mode,那麼在沒有設定bind ip且沒有設密碼的情況下,Redis隻允許接受本機的響應
-
port
端口号,預設6379
port 6379
-
tcp-backlog
設定tcp的backlog。backlog是一個連接配接隊列,總和=未完成三次握手隊列 + 已經完成三次握手隊列。
tcp-backlog 511
注意Linux核心會将這個值減小到/proc/sys/net/core/somaxconn的值(128)
是以需要确認增大/proc/sys/net/core/somaxconn和/proc/sys/net/ipv4/tcp_max_syn_backlog(128)兩個值來達到想要的效果
-
timeout
一個空閑的用戶端維持多少秒會關閉,0表示關閉該功能。即永不關閉。
timeout 0
-
tcp-keepalive
對通路用戶端的一種心跳檢測,每個n秒檢測一次。
機關為秒,如果設定為0,則不會進行Keepalive檢測,建議設定成60
tcp-keepalive 300
GENERAL通用
-
daemonize
是否為背景程序,設定為yes時,守護程序,背景啟動。
daemonize yes
-
pidfile
設定存放pid檔案的位置,每個執行個體會産生一個不同的pid檔案, 建議設定成
的形式/var/run/redis_端口.pid
pidfile /var/run/redis_6379.pid
-
loglevel
指定日志記錄級别,Redis總共支援四個級别:debug、verbose、notice、warning,預設為notice
loglevel notice
-
logfile
日志檔案名稱
logfile ""
-
databases
設定庫的數量 ,預設16個(0 - 15)。
databases 16
SECURITY安全
-
requirepass
設定密碼,使用auth指令驗證。
# # requirepass foobared
也可以在指令行中設定,但是,那隻是臨時的。重新開機redis伺服器,密碼就還原了
LIMITS限制
-
maxclients
設定redis同時可以與多少個用戶端進行連接配接。如果達到了限制,redis則會拒絕新的連接配接請求,并且向這些連接配接請求方發出“max number of clients reached”以作回應。
# maxclients 10000
-
maxmemory
設定redis可以使用的記憶體量。一旦到達記憶體使用上限,redis将會試圖移除内部資料,移除規則可以通過maxmemory-policy來指定。建議必須設定,否則,将記憶體占滿,造成伺服器當機。
如果redis無法根據移除規則來移除記憶體中的資料,或者設定了“不允許移除”,那麼redis則會針對那些需要申請記憶體的指令傳回錯誤資訊,比如SET、LPUSH等。
但是對于無記憶體申請的指令,仍然會正常響應,比如GET等。如果你的redis是主redis(說明你的redis有從redis),那麼在設定記憶體使用上限時,需要在系統中留出一些記憶體空間給同步隊列緩存,隻有在你設定的是“不移除”的情況下,才不用考慮這個因素。
# maxmemory <bytes>
- maxmemory-policy
volatile-lru -> Evict using approximated LRU, only keys with an expire set. # allkeys-lru -> Evict any key using approximated LRU. # volatile-lfu -> Evict using approximated LFU, only keys with an expire set. # allkeys-lfu -> Evict any key using approximated LFU. # volatile-random -> Remove a random key having an expire set. # allkeys-random -> Remove a random key, any key. # volatile-ttl -> Remove the key with the nearest expire time (minor TTL) # noeviction -> Don't evict anything, just return an error on write operations. # # LRU means Least Recently Used # LFU means Least Frequently Used # # Both LRU, LFU and volatile-ttl are implemented using approximated # randomized algorithms. # # Note: with any of the above policies, when there are no suitable keys for # eviction, Redis will return an error on write operations that require # more memory. These are usually commands that create new keys, add data or # modify existing keys. A few examples are: SET, INCR, HSET, LPUSH, SUNIONSTORE, # SORT (due to the STORE argument), and EXEC (if the transaction includes any # command that requires memory). # # # The default is: # # maxmemory-policy noeviction
- 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算法都并非是精确的算法,而是估算值,是以你可以設定樣本的大小,redis預設會檢查這麼多個key并選擇其中LRU的那個。
一般設定3到7的數字,數值越小樣本越不準确,但性能消耗越小。
# maxmemory-samples 5
其它
名稱 | |
---|---|
save seconds changes | 多少秒内,有多少次更新操作,就将資料同步到資料檔案,可以多個條件配合,RDB持久化時用到。 |
rdbcompression | 存儲至本地資料庫時是否壓縮資料,預設為 yes,Redis 采用 LZF 壓縮,如果為了節省 CPU 時間,可以關閉該選項,但會導緻資料庫檔案變的巨大 |
dbfilename | 指定本地資料庫檔案名,預設值為 dump.rdb |
dir | 指定本地資料庫存放目錄,預設./,即啟動redis-server的目錄 |
appendonly | 是否在每次更新操作後進行日志記錄,預設為 no |
appendfilename | 更新日志檔案名,預設為 appendonly.aof |
appendfsync | 指定更新日志條件,預設everysec,共有 3 個可選值:no:表示等作業系統進行資料緩存同步到磁盤(快) always:表示每次更新操作後手動調用 fsync() 将資料寫到磁盤(慢,安全) everysec:表示每秒同步一次(折中) |
slaveof masterip masterport | 設定當本機為 slave 服務時,設定 master 服務的 IP 位址及端口,在 Redis 啟動時,它會自動從 master 進行資料同步 |
masterauth master-password | 當 master 服務設定了密碼保護時,slav 服務連接配接 master 的密碼 |
vm-enabled | 指定是否啟用虛拟記憶體機制,預設值為 no |
vm-swap-file | 虛拟記憶體檔案路徑,不可多個 Redis 執行個體共享 |
vm-max-memory | 将所有大于 vm-max-memory 的資料存入虛拟記憶體,預設值為 0 |
vm-page-size | 多大的資料分一個page |
vm-pages | swap 檔案中的 page 數量,磁盤上每 8 個 pages 将消耗 1byte 的記憶體 |
vm-max-threads | 通路swap檔案的線程數,預設值為4 |
glueoutputbuf | 在向用戶端應答時,是否把較小的包合并為一個包發送,預設為yes(開啟) |
activerehashing | 是否激活重置哈希,預設為yes(開啟) |
本文來自部落格園,作者:403·Forbidden,轉載請注明原文連結:https://www.cnblogs.com/lczmx/p/12974915.html