今天還是挺開心的一天,又在工具箱里加了一個工具。嗯,但是快下班的時候也碰到一些不太順心的事,讓我有點惱火。我還真沒想到一個專職的前端,加測試,以及其他一堆人,竟然不知道后端返回的markdown,在前端渲染成html展示后,如果字體太大,應該去改css這件事。
實在比較無語,還好有deepseek
反正我也純粹技術直男那種氣不過,突然靈光一閃,難道:
好吧,反正氣也消了,冷靜下來想想有啥要和老版溝通的要仔細,哈哈
言歸正傳,今天的一大收獲是rocksdb agent。
大體是這么一回事,rocksdb是一個基于「硬盤」的kv數據庫,因為前面做的偽實時服務是需要這么一個kv庫來緩存結果的。最好的選擇當然是redis,目前也是這么干的,還能直接設置一個ttl,很方便。
我自己的服務都喜歡把內存往大了整,再配機器肯定不會低于128G的,如果是霄龍,必須是256G+的。不過有時候生產上的服務器可能不一定能做主;另外還有一個點是,redis我定位不做持久化,所以在需要做程序持久化緩存的時候就得用別的庫。目前我用mongo,其實也還不錯,mongo的用途太多了。但mongo也有問題,如果真的用在生產上,大量零碎的并發還是煩人的。
我發現rocksdb剛好卡在這個空擋上,使用起來是類似下面這樣的樣子:
import rocksdb# 打開或創建一個 RocksDB 數據庫
db = rocksdb.DB("test.db", rocksdb.Options(create_if_missing=True))# 插入數據
db.put(b"key1", b"value1")# 讀取數據
value = db.get(b"key1")
print(value.decode('utf-8')) # 輸出: value1# 刪除數據
db.delete(b"key1")# 關閉數據庫
del db
第一個小問題,讀寫是二進制字符串
然后我就像裝一個環境來著,之前我以為rocksdb是像mysql那樣,要專門起個服,后來發現是嵌入式的,類似sqlite的方式,只要pip就好了。
然后… pip失敗了,報了一堆錯我也沒細看。后來按大模型的指導試了下,發現不管是mac還是ubuntu都挺不好裝的,后來在我的某個鏡像上裝好了
conda install -c conda-forge python-rocksdb
第二個小問題,安裝不方便
然后開始使用測試,突然發現在ipython里執行數據庫導入時報錯,原因是之前已經執行了一次了。原來rocksdb是進程鎖的,一個進程只能開一個連接。這點上,多少有點像kafka>
第三個小問題,進程鎖
因為這些問題,做一個agent就變得很有必要。總體上,這個agent按照json標準實現了普通讀寫和ttl讀寫,以及刪除鍵。還有一些高級的功能就沒有去搞了,這樣就完成了我的持久化kv存儲。
然后我又用一個對象稍微封裝了一下,這樣用起來比較方便。
wrock = WRock()# 寫 2-6ms/條 在100和1000并發下測試 for 1000和10000keyword_args_list = [{'k':'test_var%s' % i , 'v': 123 * i , 'ttl' : 100, 'timeout':100} for i in range(1000)]tick1 = time.time()results = thread_concurrent_run(wrock.ttl_save, keyword_args_list= keyword_args_list, max_workers =100)print(time.time() - tick1)# 讀 + 刪 2-6ms/條keyword_args_list = [{'k':'test_var%s' % i , 'timeout':100} for i in range(1000)]tick1 = time.time()results = thread_concurrent_run(wrock.ttl_get, keyword_args_list= keyword_args_list, max_workers =100)print(time.time() - tick1)
總體上的效果還是讓人滿意的,每條大約是2ms-6ms的讀寫,有相當一部分會損耗在json序列化和反序列化上,但這也是必須的。
按2ms的速度估算,TPS大約是500。回頭有空我也可以測一下redis,同樣也受到json序列化的影響稍微降低了速度。
大約花了半天時間就完成好了這一切,感覺還是不錯的。