Redis(li)

来源:http://www.cnblogs.com/RunForLove/archive/2016/09/01/5829476.html
-Advertisement-
Play Games

一、Redis基礎介紹 redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、a ...


一、Redis基礎介紹

  redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在記憶體中。不同的是redis會周期性把更新的數據寫入磁碟或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。關於性能方面,redis也有一個不錯的表現:官方的bench-mark數據:測試完成了50個併發執行100000個請求;設置和獲取的值是一個256位元組字元串;Linux box是運行Linux 2.6結果:寫的速度是110000次/s,讀的速度是81000次/s 。

// 安裝步驟:

$ wget http://redis.googlecode.com/files/redis-2.4.7.tar.gz
$ tar zxvf redis-2.4.7.tar.gz
$ cd redis-2.4.7
$ make

make命令執行完成後,會在當前目錄下生成本個可執行文件,分別是redis-server、redis-cli、redis-benchmark、redis-stat,它們的作用如下:

  1. redis-server:Redis伺服器的daemon啟動程式
  2. redis-cli:Redis命令行操作工具。當然,你也可以用telnet根據其純文本協議來操作
  3. redis-benchmark:Redis性能測試工具,測試Redis在你的系統及你的配置下的讀寫性能
  4. redis-stat:Redis狀態檢測工具,可以檢測Redis當前狀態參數及延遲狀況。

服務端啟動:

src/redis-server

客戶端連接:

src/redis-cli

例子:

redis> set name helloword!
OK
redis> get name
"helloword!"

更多命令行使用可以藉助help。客戶端編碼方式:首先引入二方包。

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.2.1</version>
</dependency>

API文檔示例:http://tool.oschina.net/apidocs/apidoc?api=jedis-2.1.0

Redis存儲中的key值不限長度,可以適用一些模糊查詢或匹配場景。

二、Redis列表改造

  性能確實很高:現在海選列表頁是基於對Redis的強依賴,只讀redis不讀DB,如果redis沒有記錄或者掛了就直接返回空記錄頁面。在存儲的優化方面,是採取直接的VO存放在redis中,上層把海選商品的id放到redis的List中做分頁的索引,因為redis的列表是基於Linked list實現的,所以分頁索引時間複雜度為O(S+N),S為偏移量start,N為指定區間內元素的數量,但也很快的,現在海選列表的響應時間為30ms。

  http://redis.readthedocs.org/en/latest/index.html這裡有各種redis的命令分析及複雜度。

  Redis的數據結構及對應的操作很豐富。List的操作很不錯(這次主要是用了List),這次的列表分頁就是基於List的range介面實現的,可以取從start坐標到stop坐標之間range的值。在做海選列表的分頁時會遇到一個小問題,因為List不支持批量的set,所以只能一個一個的push進去,但這樣會導致id列表不斷的變化,雖然整個過程完成得很快,但如果數量達到1k或以上的時候這種變化還是會體現到前端頁面影響用戶,但redis提供了一種rename的機制,這樣我們在列表變化時可以先一個一個的push到一個tmp中,待push完成後再一次性的rename為正式key,這樣的馬上切換可以保證列表的變化不影響到前端用戶。

  總結:redis的操作很豐富,但也有缺陷,不過我們只要將這些豐富的命令組合一下基本上就可以很好地補充這些缺陷點。對代碼的入侵。正因為redis有豐富的數據結構及操作,沒有像tair那樣可以用一個annotation就可以解決,所以,redis的介面會對工程的代碼有一定的影響,目前只能做到在VO層的隔離。

  對redis的強依賴,通過任務保證數據的實時:這次的改造嘗試了另一種使用Cache的方式,就是實時的刷數據到redis(1分鐘一次)這樣做的好處是:

  1. 修改商品1分鐘生效,解決了運營修改商品後要待緩存失效了才生效,以前的方式,如果是詳情頁還可以馬上清緩存,但如果是按分頁進行緩存的話,不知道這個商品在第幾頁,很難清,這樣會造成列表頁與詳情頁不一致的情況
  2. 無論運營怎樣修改,都不會造成對前端用戶的影響,先前首頁出現過運營修改商品緩存失效後出現繁忙頁面的現象,但這次海選的優化可以避免這種現象但也有不好的地方:
  3. 1分鐘要批量讀一次DB,對DB也是有點壓力的
  4. 這種方式在凌晨沒人訪問的時候是一種浪費,不知有沒有些更綠色一點的同步機制?大家有什麼建議呢?

  一些缺點:n  線上的監控要完善,如key的qps,value占的空間大小,最後有後臺操作線上的KV,這樣以後作為參考對一些請求次數很高的key進行優化(考慮放本地緩存等);。n  關於過期時間的操作比較不方便,ValueCommand中的multiSet介面沒有過期時間參數,而單獨set一個value時是有的,這點比較奇怪,而且其他的命令,在處理過期時間方面很多都要採用TedisManager來做。

  跳錶演算法:這次在使用redis時學習了一個新的平衡數據結構---跳錶,實現快速的插入和查詢。

其原理和實現的複雜度比紅黑樹平衡樹之類的都要簡單。參考博客如下:

  1. http://kenby.iteye.com/blog/1187303
  2. http://www.cxphp.com/?p=241
  3. http://www.searchtb.com/2011/05/redis-storage.html

三、Redis命令

// Redis安裝

tar zxvf redis-2.8.9.tar.gz
cd redis-2.8.9
#直接make 編譯
make
#可使用root用戶執行`make install`,將可執行文件拷貝到/usr/local/bin目錄下。這樣就可以直接敲名字運行程式了。
make install
啟動
#加上`&`號使redis以後臺程式方式運行
./redis-server &
檢測
#檢測後臺進程是否存在
ps -ef |grep redis
 
#檢測6379埠是否在監聽
netstat -lntp | grep 6379
 
#使用`redis-cli`客戶端檢測連接是否正常
./redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set key "hello world"
OK
127.0.0.1:6379> get key
"hello world"
停止
 
#使用客戶端
redis-cli shutdown
#因為Redis可以妥善處理SIGTERM信號,所以直接kill -9也是可以的
kill -9 PID

四、

五、

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 三觀是什麼鬼 當我們在討論「三觀一致」的時候是在討論些什麼? 我認為這個世界上本沒有「三觀」這一說法,說的人多了,也就有了「三觀」這個詞,當我們討論「三觀一致」其實並不是真的在說世界觀、價值觀、人生觀,而是再說,你們能不能玩到一起,吃到一起,睡到一起。就這麼簡單 官網下載 因為本文是基於 Windo ...
  • 1)Description: 1)Description: N! (N的階乘) 是非常大的數,計算公式為:N! = N * (N - 1) * (N - 2) * ... * 2 * 1)。現在需要知道N!有多少(十進位)位。 input:每行輸入1個正整數N。0 < N < 1000000 out ...
  • 1)名稱:memset()函數 2)別稱:char型初始化函數 3)功能: 將s所指向的某一塊記憶體中的每個位元組的內容全部設置為ch指定的ASCII值,塊的大小由第三個參數指定,這個函數通常為新申請的記憶體做初始化工作 4)用法: void *memset(void *s, char ch, unsig ...
  • Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Example:Given a = 1 and b = 2, return 3. 個人思路:繞開+、-,利用 ...
  • 一、標識符 二、中置操作符 中置表達式,操作符位於兩個參數之間 1 to 10 1.to(10) 1 -> 10 1.->(10) 三、一元操作符 a.標識符() 1 toString 1.toString() +、-、!、~ 可以作為前置操作符,轉換成名為 unary_操作符 的方法調用 -a 和 ...
  • 表單的數據檢驗對一個程式來講非常重要,因為對於客戶端的數據不能完全信任,常規的檢驗類型有: 參數為空,根據不同的業務規定要求表單項是必填項 參數值的有效性,比如產品的價格,一定不能是負數 多個表單項組合檢驗,比如在註冊時密碼與確認密碼必須相同 參數值的數據範圍,常見的是一些狀態值,或者叫枚舉值,如果 ...
  • 一、生成文件夾。 mkdir();--新建目錄 參數:pathname:目錄的路徑。 mode:預設的 mode 是 0777,意味著最大可能的訪問權。有關 mode 的更多信息請閱讀 chmod() 頁面。 看到上面的函數了嗎?記牢。上節課沈老師留了一個作業,讀取god.json文件,生成一個最簡 ...
  • 從控制台輸入輸出,來進行資料庫的插入和查詢操作的小程式(利用JDBC) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...