redis學習筆記——應用場景

最近在看redis入門指南,現在就自己的學習情況說說自己的理解。

字符串類型(String)

字符串類型是Redis中最基本的類型,能存儲任意形式的字符串,包括二進制數據。如一張照片也可以用字符串類型存儲。注意字符串類型鍵允許存儲的數據最大容量是512M。

Strings 數據結構是簡單的key-value類型,value其實不僅是String,也可以是數字。除了get、set、incr、decr 等操作外,Redis還提供了下面一些操作:

獲取字符串長度;
往字符串append內容;
設置和獲取字符串的某一段內容;
設置及獲取字符串的某一位(bit);
批量設置一系列字符串的內容;

所以字符串類型用來保存字符串和計數都是非常方便的。就拿一篇博客來說:實現文章訪問量的統計、生成自增ID、被評論多少次,轉發多少次,贊多少次,被瀏覽多少次,有多少個好友等等同時包括存儲文章的內容都只需要使用字符串類型便可以實現。

散列類型(hash)

散列就是hash,散列類型用于存儲比如用戶的昵稱、年齡、性別、積分等是非常方便的,都能實現只有O(1)的復雜度。同時對這些內容的修改也會非常方便。

就比如:關系數據庫中如果要存儲汽車對象,存儲結構如下表所示:

如果想為 ID 為 1 的汽車增加生產日期屬性,就需要把數據表更改為如下表所示的結構:

對于 ID 為 2 和 3 的兩條記錄而言 date 字段是冗余的。可想而知當不同的記錄需要不同的屬性時,表的字段數量會越來越多以至于難以維護。

但是在redis中就沒有這樣的情況。當然redis在我看來也會形成很大的浪費,就像上面的例子:如果汽車的數量太多的話,那每一輛車都有一個color、name、price這些字符需要去保存,雖然后面有精簡鍵名的方法那也是很浪費啊。

其實還有一個疑問:redis上面列舉的例子都是一層關系模型,那多層的時候redis是將多層進行分解嗎?

列表類型(list)

list是用鏈表實現的,而且是雙向鏈表。這樣的話很顯而易見的就是在兩端插入和刪除是非常方便的O(1),所以list提供的操作基本操作lpush、rpush、lpop、rpop。

同時不難看出list很容易實現棧和隊列。

基于上面的這些原因:list主要運用于取最新N個數據的操作,如社交網站上的新鮮事,最新的新聞,最新更新的博客這些使用list實現可以事半功倍。

有個問題一直想不清楚:書上說列表是有序的字符串列表,所謂的有序難道是push 時間的先后嗎??

集合類型

集合我們首先應該注意到的是:存儲不重復的鍵,注意不重復也就是唯一的意思。

我們也應該注意到集合是用值為空的散列表實現的,呵呵,那么其實他實現不重復的原理其實就是使用了散列表(hash)的鍵值(key)唯一的特性。

既然他是一種特殊形式的散列表,那么散列表快速訪問——O(1)的特性同樣存在與集合之中。所以訪問集合的時間復雜度就是O(1)咯。

好了我們來看看集合主要用在一些什么地方呢?

uniq的特性——Uniq操作,獲取某段時間所有數據排重值;

簡單粗暴的并交叉操作——比如在微博應用中,可以將一個用戶所有的關注人存在一個集合中,將其所有粉絲存在一個集合。Redis為集合提供了求交集、并集、差集等操作,可以非常方便的實現如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存集到一個新的集合中;

有序集合

有序集合是按照某種分數的高低來排序。

有序集合是利用散列表和跳躍表來實現的。

主要運用:比如一個存儲全班同學成績的Sorted Sets,其集合value可以是同學的學號,而score就可以是其考試得分,這樣在數據插入集合的時候,就已經進行了天然的排序。這就是:排行榜應用,取TOP N操作。

另外還可以用Sorted Sets來做帶權重的隊列,比如普通消息的score為1,重要消息的score為2,然后工作線程可以選擇按score的倒序來獲取工作任務,讓重要的任務優先執行。這就是傳說中的:構建有優先級的隊列系統。

需要精準設定過期時間的應用——如你可以把上面說到的sorted set的score值設置成過期時間的時間戳,那么就可以簡單地通過過期時間排序,定時清除過期數據了,不僅是清除Redis中的過期數據,你完全可以把Redis里這個過期時間當成是對數據庫中數據的索引,用Redis來找出哪些數據需要過期刪除,然后再精準地從數據庫中刪除相應的記錄。

其他的

Pub/Sub構建實時消息系統——Redis的Pub/Sub系統可以構建實時的消息系統,比如很多用Pub/Sub構建的實時聊天系統的例子,我覺得qq消息里面@all就可以用這個實現;

其他的比較高大上的運用的話你不妨參考:http://www.csdn.net/article/1970-01-01/2817107

轉載于:https://www.cnblogs.com/lukexwang/p/4690109.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375690.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375690.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375690.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity的Cover flow的實現包(2個)

蘋果的mac機上預覽圖片,有一個所謂的cover flow的效果,這里收集到兩個,兩個實現效果略有不同。 1、老外的實現 https://github.com/rakkarage/Unity3D-CoverFlow 這個焦點圖片在到最后位置前會模擬一個抖動效果 2、國人的實現 http://game.ce…

卸載全部appx應用(包括應用商店)

在PowerShell中粘貼: Get-AppXPackage | Remove-AppxPackage 轉載于:https://www.cnblogs.com/Bob-wei/p/4691854.html

求兩個整數數組乘積最小值

輸入: 三行: 第一行:n,表示數組的個數 第二行:數組a各個元素的值 第三行:數組b各個元素的值輸出: 式子:a[0]*b[0]a[1]*b[1]...a[n-1]*b[n-1];的最小值 其中數組a中元素順序可以調整…

Xcode快捷鍵整理

做iOS開發,避免不了的就是要和Xcode打交道,如果對Xcode的快捷方式熟練的話,這樣會對我們項目開發速度有很大的提高。也是對你能力的一種提升,下面就是Abel整理的一些資料,希望有一些幫助: 1、文件類 新建項…

Perl語言編程學習筆記2

1. Perl中變量的常用表示 ${var} 相當于 $var $Dog::days 在Dog包里面的變量$days $#days days 的最后一個索引 $days->[2] $days 引用的數組的的第3個元素 $days[0][2] 多維數組 $days{200}{Feb} 多維哈希 $days{2000,"Feb"} 多維哈希仿真 emulation days[…

關于跨平臺下end-of-line問題

因為項目需要,同時開發了Linux/Windows版本的程序,后面在實際測試過程中,發現兩個版本之間的體現出來的行為有些不一致,大致情況如下: 1、Linux下代碼能編譯通過,Windows下編譯通過 2、Linux下程序功能正常…

QImage與Mat之間的相互轉換

Mat轉QImage Mat matimread("c:/dev/test.jpg"); cvtColor(mat, mat, CV_BGR2RGB); QImage image(mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);Qt與OpenCv之間傳輸數據時,QImage::Format_RGB888是最兼容的模式. OpenCv 加載BGR格式…

Graphviz從入門到不精通

1、安裝Graphviz (windows 版本,后面說linux下的安裝) 1.1)下載安裝文件 從graphviz官網下載 http://www.graphviz.org/Download.php 或者從我的百度網盤下載 http://pan.baidu.com/s/1i3mzunV 下載后雙擊安裝,跟著提示…

條款32: 盡可能地推遲變量的定義

// 此函數太早定義了變量"encrypted" string encryptPassword(const string& password) {string encrypted;//默認構造函數初始化if (password.length() < MINIMUM_PASSWORD_LENGTH) {throw logic_error("Password is too short");}進行必要的操作&…

xilinx-arm-linux交叉編譯鏈安裝

1、下載交叉編譯鏈 xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin&#xff0c;直接搜這個&#xff0c;網上有資源。 2、安裝依賴庫 sudo apt-get install lib32ncurses5 lib32z1 3、修改shell sudo dpkg-reconfigure -plow dash&#xff0c;在出現的界面中選no 4、安裝 ./xi…

第一章 1.6 HTML5 的新功能(二)

1.6.4 使用 Selectors API 簡化選取操作 除了語義化元素外&#xff0c;HTML5 還引入了一種用于查找頁面 DOM 元素的快捷方式。 1-3 列出表了在 HTML5 出現之前&#xff0c;用來在頁面中查找特定元素的函數。 函數描述示例getElementById()根據指定的id特性值查找并返回元素<…

Mercurial hg web server的配置

在windows下安裝tortoisehg-1.0.3-hg-1.5.3-x64.exe的版本控制工具后&#xff0c;克隆建立中心庫后&#xff0c;啟動web server&#xff0c;其他分庫可以連接中心庫進行pull但無法push。 這個可能是tortoisehg工具的問題&#xff0c;需要手工在.hg/hgrc文件中加入以下內容才可以…

dorado開發模式下實現動態查詢

使用dorado開發模式,我們可以實現以下開發技巧 開發技巧1.實現動態查詢功能: 1. 查詢按鈕的onClick事件中寫入: datasetEmployee.parameters().setValue(“employee_id”, editor_employee_id.value); datasetEmployee.parameters().setValue(“employee_name”, editor_employ…

港澳通行證辦理手續

港澳通行證辦理手續&#xff1a; 一、辦理前準備 1、 戶口本 原件復印件。 2、 身份證 (一張紙&#xff0c;正反面)原件復印件。 3、 兩張兩寸白底免冠照片。 二、辦理地點 1、戶口所在地公安局 出入境管理處&#xff08;科&#xff09;。 三、辦理時 1、排隊、填寫 【往來港澳…

undefined reference to `cv::VideoCapture::VideoCapture()'

缺少庫&#xff0c;添加相應庫就行&#xff0c;我的Qt Create中做的是&#xff1a; LIBS -L/home/mima111/opencv345/lib -lopencv_imgcodecs -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_videoio 實際上添加-lopencv_videoio就行

HDU2602 (0-1背包)

Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 39259 Accepted Submission(s): 16261 Problem DescriptionMany years ago , in Teddy’s hometown there was a man who was called “Bone Col…

博客3萬訪問量了……

博客有3萬訪問量了呢。自從第一次用了贈送的1500的流量券&#xff0c;粉絲了從零突破了&#xff0c;到現在有150個粉絲了。 之前預想的寫博客的初衷&#xff0c;也是記錄自己的學習過程&#xff0c;畢竟好記憶不如爛筆頭&#xff0c;記錄下來就是長長久久的&#xff0c;隨時可以…

Mint17 一些安裝備忘

1&#xff0c;中文輸入法&#xff1a; sudo apt-add-repository ppa:fcitx-team/dailybuild-fcitx-master sudo apt-get update sudo apt-get upgrade sudo apt-get remove ^ibus* sudo apt-get remove ^fcitx* sudo apt-get install fcitx fcitx-bin fcitx-config-common fcit…

error: ‘CV_BGR2RGB’ was not declared in this scope

缺少庫&#xff0c;添加相應庫就行&#xff0c;ubuntu中Qt Create設置如下 LIBS -L/home/mima111/opencv345/lib -lopencv_imgcodecs -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_videoio 實際只要添加-lopencv_imgproc就行&#xff0c;CV_BGR2RGB變量存儲在該…

Struts學習之手動驗證

* 首先要從頁面中獲取對應的標簽name屬性的值&#xff0c;在動作類action中聲明同名的屬性&#xff0c;提供get和set方法 * 要繼承ActionSupport類或者實現Validateable接口 * 重寫Validateable接口的validate()方法 * 前提是&#xff1a;要保證setUsername()、va…