標籤:led root cli stat 四分 發布 啟動方式 man miss
54945667
Redis需要設定最大佔用記憶體嗎?如果Redis記憶體使用量超出了設定的最大值會怎樣?
設定Redis最大佔用記憶體
Redis設定最大佔用記憶體,開啟redis設定檔,找到如下段落,設定maxmemory參數,maxmemory是bytes位元組類型,注意轉換。修改如下所示:
Vim
123456 |
# In short... if you have slaves attached it is suggested that you set a lower# limit for maxmemory so that there is some free RAM on the system for slave# output buffers (but this is not needed if the policy is ‘noeviction‘).## maxmemory <bytes>maxmemory 268435456 |
本機伺服器redis設定檔路徑:/etc/redis/6379.conf,由於本機內建記憶體只有1G,一般推薦Redis設定記憶體為最大實體記憶體的四分之三,所以設定0.75G,換成byte是751619276.
可以在CentOS下輸入命令:find / -name redis尋找redis目錄:
[[email protected] ~]# find / -name redis
/usr/share/nginx/html/blog.tanteng.me/wp-content/cache/supercache/blog.tanteng.me/tag/redis
/etc/redis
/var/redis
Redis設定檔一般在etc下的redis安裝目錄下。
Redis使用超過設定的最大值
如果Redis的使用超過了設定的最大值會怎樣?我們來改一改上面的配置,故意把最大值設為1個byte試試。
Vim
1234 |
# output buffers (but this is not needed if thepolicy is ‘noeviction‘).## maxmemory <bytes>maxmemory 1 |
開啟debug模式下的頁面,提示錯誤:OOM command not allowed when used memory > ‘maxmemory’.
設定了maxmemory的選項,redis記憶體使用量達到上限。可以通過設定LRU演算法來刪除部分key,釋放空間。預設是按照到期時間的,如果set時候沒有加上到期時間就會導致資料寫滿maxmemory。
如果不設定maxmemory或者設定為0,64位系統不限制記憶體,32位系統最多使用3GB記憶體。
LRU是Least Recently Used 近期最少使用演算法。
- volatile-lru -> 根據LRU演算法產生的到期時間來刪除。
- allkeys-lru -> 根據LRU演算法刪除任何key。
- volatile-random -> 根據到期設定來隨機刪除key。
- allkeys->random -> 無差別隨機刪。
- volatile-ttl -> 根據最近到期時間來刪除(輔以TTL)
- noeviction -> 誰也不刪,直接在寫操作時返回錯誤。
如果設定了maxmemory,一般都要設定到期策略。開啟Redis的設定檔有如下描述,Redis有六種到期策略:
Vim
123456 |
# volatile-lru -> remove the key with an expire set using an LRU algorithm# allkeys-lru -> remove any key accordingly to the LRU algorithm# volatile-random -> remove a random key with 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 expire at all, just return an error on write operations |
那麼開啟設定檔,添加如下一行,使用volatile-lru的到期策略:
Vim
1 |
maxmemory-policy volatile-lru |
儲存檔案退出,重啟redis服務。
info命令查看Redis記憶體使用量情況
如伺服器Redis所在目錄:/usr/local/redis-3.0.7/src
在終端輸入./redis-cli,開啟Redis用戶端,輸入info命令。
出來如下資訊:
[[email protected] src]# ./redis-cli
127.0.0.1:6379> info
# Server
redis_version:3.0.7
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:f07a42660a61a05e
redis_mode:standalone
os:Linux 3.10.0-327.10.1.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:2165
run_id:8ec8a8dc969d6e2f2867d9188ccb90850bfc9acb
tcp_port:6379
uptime_in_seconds:668
uptime_in_days:0
hz:10
lru_clock:15882419
config_file:/etc/redis/6379.conf
# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:816232
used_memory_human:797.10K
used_memory_rss:7655424
used_memory_peak:816232
used_memory_peak_human:797.10K
used_memory_lua:36864
mem_fragmentation_ratio:9.38
mem_allocator:jemalloc-3.6.0
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1458722327
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
# Stats
total_connections_received:1
total_commands_processed:0
instantaneous_ops_per_sec:0
total_net_input_bytes:14
total_net_output_bytes:0
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
migrate_cached_sockets:0
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU
used_cpu_sys:0.30
used_cpu_user:0.29
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
# Cluster
cluster_enabled:0
# Keyspace
db0:keys=1,expires=1,avg_ttl=425280
其中used_memory:816232,僅用了0.7M左右。
轉載:https://blog.tanteng.me/2016/03/redis-maxmemory/
Redis配置
Redis可以在沒有設定檔的情況下通過內建的配置來啟動,但是這種啟動方式只適用於開發與測試。
合理的配置Redis的方式是提供一個Redis設定檔,這個檔案通常叫做 redis.conf
。
redis.conf檔案中包含了很多格式簡單的指令如下:
- keyword argument1 argument2 ... argumentN
- 關鍵字 參數1 參數2 ... 參數N
如下是一個配置指令的樣本:
slaveof 127.0.0.1 6380
如果參數中含有空格,那麼可以用雙引號括起來,如下:
requirepass "hello world"
這些指令的配置,意義以及深入使用方法都能在每個Redis發布版本內建的的redis.conf文檔中找到。
- 自描述文檔 redis.conf for Redis 2.8
- 自描述文檔 redis.conf for Redis 2.6.
- 自描述文檔 redis.conf for Redis 2.4.
通過命令列傳參
自Redis2.6起就可以直接通過命令列傳遞Redis配置參數。這種方法可以用於測試。 以下是一個例子:這個例子配置一個新運行並以6380為連接埠的 Redis執行個體,使配置它為127.0.0.1:6379Redis執行個體的slave。
./redis-server --port 6380 --slaveof 127.0.0.1 6379
通過命令列傳遞的配置參數的格式和在redis.conf中設定的配置參數的格式完全一樣, 唯一不同的是需要在關鍵字之前加上 首碼--
。
需要注意的是通過命令列傳遞參數的過程會在記憶體中產生一個臨時的設定檔(也許會直接追加在 命令指定的設定檔後面),這些傳遞的參數也會轉化為跟Redis設定檔一樣的形式。
運行時配置更改
Redis允許在啟動並執行過程中,在不重啟伺服器的情況下更改伺服器配置,同時也支援 使用特殊的CONFIG SET和 CONFIG GET命令用編程方式查詢並設定配置。
並非所有的配置指令都支援這種使用方式,但是大部分是支援的。更多相關的資訊請查閱CONFIG SET和 CONFIG GET頁面。
需要確保的是在通過CONFIG SET命令進行的設定的同時,也需在 redis.conf檔案中進行了相應的更改。 未來Redis有計劃提供一個CONFIG REWRITE命令在不更改現有設定檔的同時, 根據當下的伺服器配置對redis.conf檔案進行重寫。
配置Redis成為一個緩衝
如果你想把Redis當做一個緩衝來用,所有的key都有到期時間,那麼你可以考慮 使用以下設定(假設最大記憶體使用量量為2M):
- maxmemory 2mb
- maxmemory-policy allkeys-lru
以上設定並不需要我們的應用使用EXPIRE(或相似的命令)命令去設定每個key的到期時間,因為 只要記憶體使用量量到達2M,Redis就會使用類LRU演算法自動刪除某些key。
相比使用額外記憶體空間儲存多個鍵的到期時間,使用緩衝設定是一種更加有效利用記憶體的方式。而且相比每個鍵固定的 到期時間,使用LRU也是一種更加推薦的方式,因為這樣能使應用的熱資料(更頻繁使用的鍵) 在記憶體中停留時間更久。
基本上這麼配置下的Redis可以當成memcached使用。
當我們把Redis當成緩衝來使用的時候,如果應用程式同時也需要把Redis當成儲存系統來使用,那麼強烈建議 使用兩個Redis執行個體。一個是緩衝,使用上述方法進行配置,另一個是儲存,根據應用的持久化需求進行配置,並且 只儲存那些不需要被緩衝的資料。
請注意:使用者需要詳細閱讀樣本redis.conf檔案來決定使用什麼記憶體上限處理策略。
設定Redis最大佔用記憶體