PHP操作Redis使用incrByFloat 造成小數位數異常問題

我遇到問題的場景

廢話少說下面是我的環境配置
系統 => Centos7.2 結果來自 uname -a 命令
在這裏插入圖片描述
PHP => 7.1.25 結果來自 php -v 命令
在這裏插入圖片描述
PHP的Redis擴展 => 4.2.0 結果來自 php --ri redis 命令
在這裏插入圖片描述
Redis服務端 => 3.0.3 (阿里雲的雲數據庫Redis版本) 截圖結果來自 redis命令中 info命令
在這裏插入圖片描述

詳細過程

我在正常的業務代碼中使用Redis,在使用incrByFloat命令操作成功後我前往redis查看設置的結果,這個結果讓我很意外
在這裏插入圖片描述
這個結果是在redis命令行獲取的結果,如果用php使用redis擴展獲取相同的key也是這個結果,
但是我發現在redis命令行設置相同的值卻沒有上面的異常情況 例如

incrbyfloat key_name 1.20

我一直在想爲什麼會出現這種情況呢?

排查

開始時我懷疑是在PHP中數據的類型問題,所以各種轉換類型,都不好使!

繼續在網上找答案:發現了一個好用的redis命令 MONITOR 這個命令可以實時打印出redis接收到的命令,不看不知道,一看嚇一跳!

"INCRBYFLOAT" "key_name" "這裏是具體數值 後面就已經是各種零了"

我在本地又搭建了一個更高版本的redis服務端,還是出現了同樣的問題!
於是我又搭建了一個和阿里雲一樣版本的服務端,還是出現了同樣的問題!

到這裏我發現只要通過PHP的redis擴展操作redis服務端就會出現上面的問題。使用redis-cli的命令行就沒有這個問題。看來問題不是出在redis服務端,而是php的redis擴展的問題!

所以我又去PECL下載了一個低版本的redis擴展,然而各種錯誤沒裝上【😅】
所以我又看了網上的一些文章(然而這個問題的結果少之又少 沒有對我有什麼幫助)。

我又去github克隆了一個更高的版本裝上 結果問題就解決了,使用redis命令發現的數據也正常了,再次用命令行查看數值也正常了,難道這的是PHP擴展的問題?到這裏我不甘心,又裝回了原來的擴展,發現問題也沒有了。到這裏我有些迷糊了,我猜是在一開始安裝redis擴展時有什麼錯誤沒有及時處理掉,最後導致了這種問題。

不過到最後還是解決了,我也留下這篇文章希望能夠向遇到此問題的朋友提供一些幫助,嘿嘿

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