中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis的使用場景和實例

發布時間:2020-06-10 12:29:40 來源:億速云 閱讀:257 作者:元一 欄目:系統運維

redis

是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。

【1】案例一現象:
生產系統剛開始運行階段,系統穩定。但是運行了一段時間后,發現部分時間段系統接口響應變慢。查看客戶端日志經常會出現如下錯誤:

redis.clients.jedis.exception.JedisConnectionException:java.net.SocketTimeoutException:Read time out
問題定位:執行 slowlog 查看慢查詢日志,發現大量的 keys 命令操作,keys 命令在大量并發情況下性能非常差,生產環境,盡量避免使用 keys,接下來找出使用 keys 的代碼做優化,直到 time out 問題解決。

192.168.17.46:6386> slowlog get
 1) 1) (integer) 22
    2) (integer) 1563344158
    3) (integer) 10193
    4) 1) "SET"
       2) "getBatchChapterFiles"
       3) "\x0b\xfa\529:\t489761532B\x02-1J\t48976181... (1293 more bytes)"
 2) 1) (integer) 21
    2) (integer) 1545403066
    3) (integer) 10915
    4) 1) "GET"
       2) "getVolumeChapters#data"

【2】案例二現象:
生產環境長時間的運行后,經常會有接口返回數據失敗的情況,或者是從監控上發現數據庫壓力某一時間暴增。查看客戶端日志發現如下錯誤:
redis.clients.jedis.exceptions.JedisConnectionException:Cloud not get a resource from the pool

在redis日志里面發現報錯:
[2489] 02 Jun 10:43:42 # Error allocating resoures for the client

問題定位:執行 client list 命令,發現大量的 client 的 idle 時間特別長。檢查配置發現 timeout 和 tcp-keepalive(心跳檢測) 均為啟用(均為0),Redis 服務端沒有有效的機制來確保服務端連接是否已經失效。當服務器與客戶端網絡發生閃斷,導致tcp中斷,這種情況下的 client 將會一直被 redis 服務端所持有,就會出現 idle(空閑)時間特長的 client 連接。
解決辦法:設置 timeout 和 tcp-keepalive 來清理失效的連接。

redis/bin>redis-cli -h 192.168.17.46 -p 6386 info Clients
# Clients
connected_clients:5000                      ---------------偏大
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

192.168.17.46:6386> CONFIG GET timeout 
1) "timeout"
2) "0"

192.168.17.46:6386> CONFIG GET tcp-keepalive
1) "tcp-keepalive"
2) "0"
192.168.17.46:6386> client list
id=612260747 addr=192.168.17.92:53069 fd=806 name= age=114 idle=21 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
id=612260593 addr=192.168.41.44:38248 fd=381 name= age=131 idle=61 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=get

字段定義
addr : 客戶端的地址和端口
fd : 套接字所使用的文件描述符
age : 以秒計算的已連接時長
idle : 以秒計算的空閑時長
flags : 客戶端 flag
db : 該客戶端正在使用的數據庫 ID
sub : 已訂閱頻道的數量
psub : 已訂閱模式的數量
multi : 在事務中被執行的命令數量
qbuf : 查詢緩沖區的長度(字節為單位, 0 表示沒有分配查詢緩沖區)
qbuf-free : 查詢緩沖區剩余空間的長度(字節為單位, 0 表示沒有剩余空間)
obl : 輸出緩沖區的長度(字節為單位, 0 表示沒有分配輸出緩沖區)
oll : 輸出列表包含的對象數量(當輸出緩沖區沒有剩余空間時,命令回復會以字符串對象的形式被入隊到這個隊列里)
omem : 輸出緩沖區和輸出列表占用的內存總量
events : 文件描述符事件
cmd : 最近一次執行的命令

【3】案例三現象:
Redis 突然間不能訪問,返回如下錯誤:

redis.client.jedis.exception.JedisDataException: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 日志,發現如下錯誤:Cant save in background:fork:Cannot allocate memory Redis在保存內存的數據到磁盤時,為了防止主線程假死,會Fork 一個子進程來完成這個保存操作,這個Fork 的子進程需要分配與主進程相同的內存,這時候就相當于需要的內存翻倍了。如果這時候可用內存不足以分配需要的內存,將會導致Fork 子進程失敗而無法將數據持久化到磁盤。修改Linux內核參數 vm.overcommit_memeory=1(表示內核允許分配所有的物理內存,而不管當前的內存狀態如何) 問題便可解決。

192.168.17.46:6386> CONFIG GET logfile
1) "logfile"
2) "/home/redis02/redis/log/6386.log"

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岳阳市| 三河市| 昂仁县| 荆州市| 内丘县| 七台河市| 周口市| 靖宇县| 格尔木市| 小金县| 建昌县| 天等县| 慈溪市| 建水县| 安图县| 黔江区| 张北县| 宁阳县| 广安市| 容城县| 太原市| 泰来县| 祁阳县| 鄂州市| 南漳县| 涟水县| 余姚市| 邹城市| 来宾市| 平南县| 永修县| 尤溪县| 额敏县| 内黄县| 武平县| 昌平区| 安龙县| 苏州市| 白银市| 宁德市| 株洲县|