聯系方式 Contact

聊城科達信息技術有限公司

地址:山東省聊城市東昌府區威尼斯購物公園南首6路

電話:0635-8185888

傳真:0635-8314011

郵箱:lckeda2006@163.com

網址:www.vcoursolle.com

搜索 Search
你的位置:首頁 > 知識庫 > 技術手冊

redis常見問題解決方案

2019/12/11 8:08:19點擊:

1. 強制關閉Redis快照導致不能持久化

MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

Redis被配置為保存數據庫快照,但它目前不能持久化到硬盤。用來修改集合數據的命令不能用。請查看Redis日志的詳細錯誤信息。

原因:

強制關閉Redis快照導致不能持久化。

解決方案:

運行config set stop-writes-on-bgsave-error no 命令后,關閉配置項stop-writes-on-bgsave-error解決該問題。

root@centos:/usr/local/redis/bin# ./redis-cli
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
OK
127.0.0.1:6379> lpush myColour "red"

(integer) 1

 

 

 

2. 內存使用率

因內存交換引起的性能問題

內存使用率是Redis服務最關鍵的一部分。如果一個Redis實例的內存使用率超過可用最大內存 (used_memory > 可用最大內存),那么操作系統開始進行內存與swap空間交換,把內存中舊的或不再使用的內容寫入硬盤上(硬盤上的這塊空間叫Swap分區),以便騰出新的物理內存給新頁或活動頁(page)使用。 
在硬盤上進行讀寫操作要比在內存上進行讀寫操作,時間上慢了近5個數量級,內存是0.1μs單位、而硬盤是10ms。如果Redis進程上發生內存交換,那么Redis和依賴Redis上數據的應用會受到嚴重的性能影響。 通過查看used_memory指標可知道Redis正在使用的內存情況,如果used_memory>可用最大內存,那就說明Redis實例正在進行內存交換或者已經內存交換完畢。管理員根據這個情況,執行相對應的應急措施。

解決方案:
跟蹤內存使用率

若是在使用Redis期間沒有開啟rdb快照或aof持久化策略,那么緩存數據在Redis崩潰時就有丟失的危險。因為當Redis內存使用率超過可用內存的95%時,部分數據開始在內存與swap空間來回交換,這時就可能有丟失數據的危險。
當開啟并觸發快照功能時,Redisfork一個子進程把當前內存中的數據完全復制一份寫入到硬盤上。因此若是當前使用內存超過可用內存的45%時觸發快照功能,那么此時進行的內存交換會變的非常危險(可能會丟失數據)。 倘若在這個時候實例上有大量頻繁的更新操作,問題會變得更加嚴重。

通過減少Redis的內存占用率,來避免這樣的問題,或者使用下面的技巧來避免內存交換發生:

    1.假如緩存數據小于4GB,就使用32位的Redis實例。因為32位實例上的指針大小只有64位的一半,它的內存空間占用空間會更少些。 這有一個壞處就是,假設物理內存超過4GB,那么32位實例能使用的內存仍然會被限制在4GB以下。 要是實例同時也共享給其他一些應用使用的話,那可能需要更高效的64Redis實例,這種情況下切換到32位是不可取的。 不管使用哪種方式,Redisdump文件在32位和64位之間是互相兼容的, 因此倘若有減少占用內存空間的需求,可以嘗試先使用32位,后面再切換到64位上。

     2.盡可能的使用Hash數據結構。因為Redis在儲存小于100個字段的Hash結構上,其存儲效率是非常高的。所以在不需要集合(set)操作或listpush/pop操作的時候,盡可能的使用Hash結構。比如,在一個web應用程序中,需要存儲一個對象表示用戶信息,使用單個key表示一個用戶,其每個屬性存儲在Hash的字段里,這樣要比給每個屬性單獨設置一個key-value要高效的多。 通常情況下倘若有數據使用string結構,用多個key存儲時,那么應該轉換成單key多字段的Hash結構。 如上述例子中介紹的Hash結構應包含,單個對象的屬性或者單個用戶各種各樣的資料。Hash結構的操作命令是HSET(key, fields, value)HGET(key, field),使用它可以存儲或從Hash中取出指定的字段。

3.設置key的過期時間。一個減少內存使用率的簡單方法就是,每當存儲對象時確保設置key的過期時間。倘若key在明確的時間周期內使用或者舊key不大可能被使用時,就可以用Redis過期時間命令(expire,expireat, pexpire, pexpireat)去設置過期時間,這樣Redis會在key過期時自動刪除key。 假如你知道每秒鐘有多少個新key-value被創建,那可以調整key的存活時間,并指定閥值去限制Redis使用的最大內存。

4.回收key。在Redis配置文件中(一般叫Redis.conf),通過設置“maxmemory”屬性的值可以限制Redis最大使用的內存,修改后重啟實例生效。 也可以使用客戶端命令config set maxmemory 去修改值,這個命令是立即生效的,但會在重啟后會失效,需要使用config rewrite命令去刷新配置文件。 若是啟用了Redis快照功能,應該設置“maxmemory”值為系統可使用內存的45%,因為快照時需要一倍的內存來復制整個數據集,也就是說如果當前已使用45%,在快照期間會變成95%(45%+45%+5%),其中5%是預留給其他的開銷。 如果沒開啟快照功能,maxmemory最高能設置為系統可用內存的95%。

    當內存使用達到設置的最大閥值時,需要選擇一種key的回收策略,可在Redis.conf配置文件中修改“maxmemory-policy”屬性值。 若是Redis數據集中的key都設置了過期時間,那么“volatile-ttl”策略是比較好的選擇。但如果key在達到最大內存限制時沒能夠迅速過期,或者根本沒有設置過期時間。那么設置為“allkeys-lru”值比較合適,它允許Redis從整個數據集中挑選最近最少使用的key進行刪除(LRU淘汰算法)。Redis還提供了一些其他淘汰策略,如下:

  • volatile-lru:使用LRU算法從已設置過期時間的數據集合中淘汰數據。

  • volatile-ttl:從已設置過期時間的數據集合中挑選即將過期的數據淘汰。

  • volatile-random:從已設置過期時間的數據集合中隨機挑選數據淘汰。

  • allkeys-lru:使用LRU算法從所有數據集合中淘汰數據。

  • allkeys-random:從數據集合中任意選擇數據淘汰

  • no-enviction:禁止淘汰數據。

通過設置maxmemory為系統可用內存的45%95%(取決于持久化策略)和設置“maxmemory-policy”“volatile-ttl”“allkeys-lru”(取決于過期設置),可以比較準確的限制Redis最大內存使用率,在絕大多數場景下使用這2種方式可確保Redis不會進行內存交換。倘若你擔心由于限制了內存使用率導致丟失數據的話,可以設置noneviction值禁止淘汰數據。

3、虛擬內存方式無法啟動
啟動redis服務失敗,提示如下信息:

ARE YOU SURE YOU WANT TO USE VM?

Redis Virtual Memory is going to be deprecated soon,

we think you should NOT use it, but use Redis only if

your data is suitable for an in-memory database.

If you *really* want VM add this in the config file:

    really-use-vm yes

解決方案:

此時需在配置文件中增加 really-use-vm yes,重啟。



4、redis啟動時報警錯誤 
1)The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128

2WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1‘ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1‘ for this to take effect.

解決:

針對這兩個問題,都要修改/etc/sysctl.conf文件,在文件末尾加入以下兩句:

net.core.somaxconn= 1024
vm.overcommit_memory = 1

3WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command ‘echo never > /sys/kernel/mm/transparent_hugepage/enabled‘ as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

臨時解決:root用戶執行echo never > /sys/kernel/mm/transparent_hugepage/enabled

永久解決:將上面這句話寫入到/etc/rc.local文件中。

修改完成后重啟redis。

數據庫連接上,和一些中文亂碼問題。 

大乳BOOBS巨大吃乳-浪货你那里又湿又紧 H-善良的小峓子在线BD-岳夹得我好紧