redis——數據結構和對象的使用介紹

redis官網

微軟寫的windows下的redis

我們下載第一個

額案后基本一路默認就行了

安裝后,服務自動啟動,以后也不用自動啟動。

出現這個表示我們連接上了。

?

redis命令參考鏈接

String

字符串結構

struct sdshdr{//記錄buf數組中已使用字節的數量int len;//記錄buf數組中未使用的數量int free;//字節數組,用于保存字符串char buf[];
}

常見操作

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379>

應用場景

String是最常用的一種數據類型,普通的key/value存儲都可以歸為此類,value其實不僅是String,也可以是數字:比如想知道什么時候封鎖一個IP地址(訪問超過幾次)。INCRBY命令讓這些變得很容易,通過原子遞增保持計數。

LIST

數據結構

typedef struct listNode{//前置節點struct listNode *prev;//后置節點struct listNode *next;//節點的值struct value;
}

常見操作

> lpush list-key item
(integer) 1
> lpush list-key item2
(integer) 2
> rpush list-key item3
(integer) 3
> rpush list-key item
(integer) 4
> lrange list-key 0 -1
1) "item2"
2) "item"
3) "item3"
4) "item"
> lindex list-key 2
"item3"
> lpop list-key
"item2"
> lrange list-key 0 -1
1) "item"
2) "item3"
3) "item"

應用場景

Redis list的應用場景非常多,也是Redis最重要的數據結構之一。
我們可以輕松地實現最新消息排行等功能。
Lists的另一個應用就是消息隊列,可以利用Lists的PUSH操作,將任務存在Lists中,然后工作線程再用POP操作將任務取出進行執行。

HASH

數據結構

dictht是一個散列表結構,使用拉鏈法保存哈希沖突的dictEntry。

typedef struct dictht{//哈希表數組dictEntry **table;//哈希表大小unsigned long size;//哈希表大小掩碼,用于計算索引值unsigned long sizemask;//該哈希表已有節點的數量unsigned long used;
}typedef struct dictEntry{//鍵void *key;//值union{void *val;uint64_tu64;int64_ts64;}struct dictEntry *next;
}

Redis的字典dict中包含兩個哈希表dictht,這是為了方便進行rehash操作。在擴容時,將其中一個dictht上的鍵值對rehash到另一個dictht上面,完成之后釋放空間并交換兩個dictht的角色。

typedef struct dict {dictType *type;void *privdata;dictht ht[2];long rehashidx; /* rehashing not in progress if rehashidx == -1 */unsigned long iterators; /* number of iterators currently running */
} dict;

rehash操作并不是一次性完成、而是采用漸進式方式,目的是為了避免一次性執行過多的rehash操作給服務器帶來負擔。

漸進式rehash通過記錄dict的rehashidx完成,它從0開始,然后沒執行一次rehash例如在一次 rehash 中,要把 dict[0] rehash 到 dict[1],這一次會把 dict[0] 上 table[rehashidx] 的鍵值對 rehash 到 dict[1] 上,dict[0] 的 table[rehashidx] 指向 null,并令 rehashidx++。

在 rehash 期間,每次對字典執行添加、刪除、查找或者更新操作時,都會執行一次漸進式 rehash。

采用漸進式rehash會導致字典中的數據分散在兩個dictht中,因此對字典的操作也會在兩個哈希表上進行。
例如查找時,先從ht[0]查找,沒有再查找ht[1],添加時直接添加到ht[1]中。

常見操作

> hset hash-key sub-key1 value1
(integer) 1
> hset hash-key sub-key2 value2
(integer) 1
> hset hash-key sub-key1 value1
(integer) 0
> hgetall hash-key
1) "sub-key1"
2) "value1"
3) "sub-key2"
4) "value2"
> hdel hash-key sub-key2
(integer) 1
> hdel hash-key sub-key2
(integer) 0
> hget hash-key sub-key1
"value1"
> hgetall hash-key
1) "sub-key1"
2) "value1"

SET

常見操作

> sadd set-key item
(integer) 1
> sadd set-key item2
(integer) 1
> sadd set-key item3
(integer) 1
> sadd set-key item
(integer) 0
> smembers set-key
1) "item2"
2) "item"
3) "item3"
> sismember set-key item4
(integer) 0
> sismember set-key item
(integer) 1
> srem set-key item
(integer) 1
> srem set-key item
(integer) 0
> smembers set-key
1) "item2"
2) "item3"

應用場景

Redis為集合提供了求交集、并集、差集等操作,故可以用來求共同好友等操作。

ZSET

數據結構

typedef struct zskiplistNode{//后退指針struct zskiplistNode *backward;//分值double score;//成員對象robj *obj;//層struct zskiplistLever{//前進指針struct zskiplistNode *forward;//跨度unsigned int span;}lever[];}typedef struct zskiplist{//表頭節點跟表尾結點struct zskiplistNode *header, *tail;//表中節點的數量unsigned long length;//表中層數最大的節點的層數int lever;}

跳躍表,基于多指針有序鏈實現,可以看作多個有序鏈表。

與紅黑樹等平衡樹相比,跳躍表具有以下優點:

  • 插入速度非常快速,因為不需要進行旋轉等操作來維持平衡性。
  • 更容易實現。
  • 支持無鎖操作。

常見操作

> zadd zset-key 728 member1
(integer) 1
> zadd zset-key 982 member0
(integer) 1
> zadd zset-key 982 member0
(integer) 0
> zrange zset-key 0 -1
1) "member1"
2) "member0"
> zrange zset-key 0 -1 withscores
1) "member1"
2) "728"
3) "member0"
4) "982"
> zrangebyscore zset-key 0 800 withscores
1) "member1"
2) "728"
> zrem zset-key member1
(integer) 1
> zrem zset-key member1
(integer) 0
> zrange zset-key 0 -1 withscores
1) "member0"
2) "982"

應用場景

以某個條件為權重,比如按頂的次數排序
ZREVRANGE命令可以用來按照得分來獲取前100名的用戶,ZRANK可以用來獲取用戶排名,非常直接而且操作容易。
Redis sorted set的使用場景與set類似,區別是set不是自動有序的,而sorted set可以通過用戶額外提供一個優先級(score)的參數來為成員排序,并且是插入有序的,即自動排序。

?

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

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

相關文章

Python模塊(1)-Argparse 簡易使用教程

argparse 簡易使用教程1.概況2. action3. argparse 使用demo3.1 argparse 實現加法器3.2 D-Model parser1.概況 argparse是Python中用于解析命令行參數的一個模塊,可以自動生成help和usage信息;當從終端輸入的參數無效時,模塊會輸出提示信息…

深度學習--Keras總結

Keras主要包括14個模塊,本文主要對Models、layers、Initializations、Activations、Objectives、Optimizers、Preprocessing、metrics共計8個模塊分別展開介紹,并通過一個簡單的Bp神經網絡說明各個模塊的作用。 1. Model 包:keras.models …

redis——NOSQL及redis概述

NoSql入門概述 單機Mysql的美好時代 瓶頸: 數據庫總大小一臺機器硬盤內存放不下數據的索引(B tree)一個機器的運行內存放不下訪問量(讀寫混合)一個實例不能承受Memcached(緩存) MySql 垂直拆…

Python(17)-元組tuple

高級數據類型--元組1.元組的定義2.元組基本操作3.元組的循環遍歷4.元組的應用場景5.元組與格式化字符串6.元組與列表之間的轉換元組的最大特征就是可訪問不可改,可作為字典的鍵值,因為鍵值必須是唯一的。字符串也是不可邊類型,因此也適合做字…

深度學習(莫煩 神經網絡 lecture 3) Keras

神經網絡 & Keras 目錄 神經網絡 & Keras目錄1、Keras簡介1.1 科普: 人工神經網絡 VS 生物神經網絡1.2 什么是神經網絡 (Neural Network)1.3 神經網絡 梯度下降1.4 科普: 神經網絡的黑盒不黑1.5 Why Keras?1.6 兼容 backend 2、如何搭建各種神經網絡2.1 Regressor回歸…

阿里Java編程規約(集合)

【強制】關于 hashCode 和 equals 的處理,遵循如下規則: 1) 只要覆寫 equals,就必須覆寫 hashCode。 2) 因為 Set 存儲的是不重復的對象,依據 hashCode 和 equals 進行判斷,所以 Set 存儲的對…

Pytorch(3)-數據載入接口:Dataloader、datasets

pytorch數據載入1.數據載入概況Dataloader 是啥2.支持的三類數據集2.1 torchvision.datasets.xxx2.2 torchvision.datasets.ImageFolder2.3 寫自己的數據類,讀入定制化數據2.3.1 數據類的編寫map-style范式iterable-style 范式2.3.2 DataLoader 導入數據類1.數據載入…

阿里Java編程規約(控制語句)

【強制】在一個 switch 塊內,每個 case 要么通過 continue/break/return 等來終止,要么 注釋說明程序將繼續執行到哪一個 case 為止;在一個 switch 塊內,都必須包含一個 default 語句并且放在最后,即使它什么代碼也沒…

大數據學習(5)-- NoSQL數據庫

文章目錄目錄1.NoSQL的介紹2.NoSQL產生的原因2.1 web2.02.2 NoSQL興起原因3.NoSQL和關系數據庫的區別4.NoSQL的四大類型4.1 鍵值數據庫4.2 列族數據庫4.3 文檔數據庫4.4 圖形數據庫4.5 不同類型的NoSQL數據庫進行比較5.NoSQL的三大基石5.1 CAP5.2 base5.3 最終一致性6.從NoSQL到…

經典算法重點總結

文章目錄排序算法冒泡排序直接插入排序希爾排序直接選擇排序快速排序堆排序歸并排序總結查找算法順序查找二分查找插值查找斐波那契查找樹表查找分塊查找哈希查找總結排序算法 冒泡排序 void bubbleSort(int a[] , int n){for(int i n-1 ; i > 0 ; i--){for(int j 0 ; j …

Python(18)-字典dictionary、集合

Python高級數據類型-字典1.字典的定義2.字典的基本操作:查詢,增加,修改,獲取3.字典的統計、合并、清空4.字典的循環遍歷5.返回最大“值”對應的“鍵”6.應用場景pop(key)7.集合字典是除了列表之外最靈活的數據類型,用來描述一個物…

redis——Redis中的LRU算法改進

redis通常使用緩存,是使用一種固定最大內存的使用。當數據達到可使用的最大固定內存時,我們需要通過移除老數據來獲取空間。redis作為緩存是否有效的重要標志是如何尋找一種好的策略:刪除即將需要使用的數據是一種糟糕的策略,而刪…

redis——HyperLogLog

HyperLogLog 是一種概率數據結構,用來估算數據的基數。數據集可以是網站訪客的 IP 地址,E-mail 郵箱或者用戶 ID。 基數就是指一個集合中不同值的數目,比如 a, b, c, d 的基數就是 4,a, b, c, d, a 的基數還是 4。雖然 a 出現兩次…

機器學習知識總結系列-機器學習中的優化算法總結(1-4)

文章目錄1.梯度下降1.1批量梯度下降(BGD)1.2隨機梯度下降(SGD)1.3 小批量隨機梯度下降(MSGD)1.4 比較:1.5 動量算法(momentum)1.6 Nestrov Momentum2. 自適應方法2.1 自適應學習率算法&#xff…

Python(19)-字符串、Unicode字符串

高級數據類型--字符串、Unicode字符串1.字符串的定義2.字符串的長度、計數、Index3.字符串常用方法3.1判斷類型3.2查找和替換3.3文本對齊3.4去除空白字符.strip()4.字符串的拆分和拼接5.字符串的切片6.跨行字符串7.包含轉義字符r8.字符串的分割與連接9.Unicode字符串字符串-不變…

機器學習中的距離和損失函數

文章目錄13.1 距離度量13.2 損失函數13.1 距離度量 距離函數種類:歐式距離、曼哈頓距離、明式距離(閔可夫斯基距離)、馬氏距離、切比雪夫距離、標準化歐式距離、漢明距離、夾角余弦等常用距離函數:歐式距離、馬氏距離、曼哈頓距離…

Python(20)-高級數據類型的公共方法

高級數據類型的公共方法1內置函數2高級數據類型切片3運算符,*,in4完整的for循環公共方法是列表,元組,字典,字符串都能使用的方法1內置函數 內置函數:不需要import導入模塊,就可以直接使用的函數…

redis——為什么選擇了跳表而不是紅黑樹?

跳表是個啥東西請看這個文章。 我們知道,節點插入時隨機出一個層數,僅僅依靠一個簡單的隨機數操作而構建出來的多層鏈表結構,能保證它有一個良好的查找性能嗎?為了回答這個疑問,我們需要分析skiplist的統計性能。 在…

機器學習公式推導

文章目錄線性回歸邏輯回歸線性判別分析PCAk-means決策樹svm隨機深林GBDTxgboost強化學習MapReduce線性回歸 邏輯回歸 對于分類問題:輸出0/1,超過[0,1]沒有意義,使用sigmoid函數 **代價函數:**使用L2平方差,由于模型函…

Python綜合應用(1)--名片管理系統開發

第一個綜合應用-名片管理系統1框架搭建2完善功能綜合應用,名片管理系統 歡迎界面,不同選項,1.新建名片,2.顯示全部,3 查詢名片(查到之后可以修改名片信息),0 退出系統 程序開發流程…