1. 程式人生 > >一文了解:Redis基礎型別

一文了解:Redis基礎型別

一文了解:Redis基礎型別

Redis特點

開源的,BSD許可高階的key-value儲存系統
可以用來儲存字串,雜湊結構,連結串列,集合

安裝

windows:https://github.com/microsoftarchive/redis/releases

mac\linux:http://www.redis.cn/

Redis 資料型別

Redis支援五種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(有序集合)。

string(字串)

字串型別是Redis的最基本資料結構。
字串型別的值實際可以為字串,數字,二進位制,但是值最大不能超過512M。

key value
hello world
counter 1
bits 10000100
json {"id":1,"name":"xiaocai","age":18}

string命令

設定

set key value [EX seconds] [PX milliseconds] [NX|XX]

get key

> set name xiaocai
OK
> get name
"xiaocai"

過期

setex key seconds value

> set name1 redis1 ex 10 #10秒後過期
OK
> get name1
(nil)

> setex name2 10 redis2 #10秒後過期
OK
> get name2
"redis2"
> get name2
(nil)

> set name3 redis3 px 10 #10豪秒後過期
OK
> get name3
(nil)

不存在才能設定成功或者必須存在才能設定成功

> set hello world nx #不存在才能設定成功
OK
> set hello w nx #存在就設定失敗
(nil)
> get hello
"world"

>set hello w xx  #存在才能設定成功
OK
> set world hello xx #不存在就設定失敗
(nil)
> get hello
"w"
> get world
(nil)

批量設定

mset key value [key value ...]
mget key [key ...]


> mset name1 redis1 name2 redis2
OK

> mget name1 name2
1) "redis1"
2) "redis2"

> mget name1 name2 name3
1) "redis1"
2) "redis2"
3) (nil)

計數

incr key

incrby key increment

> set age 18  #value只能為整數
OK
> incr age
(integer) 19
> incrby age -5
(integer) 14
> incrby age 10
(integer) 24

刪除

del key [key ...]

> del age
(integer) 1
> get age
(nil)

內部編碼

  1. int 8個位元組的長整型
  2. embstr 小於等於39個位元組的字串
  3. raw 大於39個位元組的字串
> set port 6379
OK
> object encoding port
"int"

> set hello world
OK
> object encoding hello 
"embstr"

> set longString abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
OK
> object encoding hello
"raw"
> strlen longString
(integer) 52

list(列表)

list型別是用來儲存多個有序的字串。每列字串稱之為元素。一個list的最大儲存為2^32-1個元素。可以對列表進行雙端插入和彈出,也可以指定索引下標獲取元素。

list命令

頭部和尾部新增元素

lpush key value [value ...]

rpush key value [value ...]

lrange key start stop

> lpush letter "a"
(integer) 1
> lpush letter "b"
(integer) 2
> lpush letter "c"
(integer) 3
> lrange letter 0 -1
1) "c"
2) "b"
3) "a"

> rpush letter "a"
(integer) 4
> rpush letter "b"
(integer) 5
> rpush letter "c"
> lrange letter 0 -1
1) "c"
2) "b"
3) "a"
4) "a"
5) "b"
6) "c"

頭部和尾部彈出元素

lpop key

rpop key

> lpop letter
"c"
> lpop letter
"b"
> lrange letter 0 -1
1) "a"
2) "a"
3) "b"
4) "c"

> rpop letter
"c"
> rpop letter
"b"
> lrange letter 0 -1
1) "a"
2) "a"

索引操作
索引需要對全部list進行遍歷,效能會隨著元素個數的增大而變差

lrange key start stop

lindex key index

ltrim key start stop

len key

> rpush letter b c
(integer) 4
> lrange letter 0 -1
1) "a"
2) "a"
3) "b"
4) "c"
> lindex letter 2
"b"
> ltrim letter 0 -2
OK
> lrange letter 0 -1
1) "a"
2) "a"
3) "b"
> llen letter
(integer) 3

插入

insert key BEFORE|AFTER pivot value

> linsert letter before b c
(integer) 4
> linsert letter after a d
(integer) 5
> lrange letter 0 -1
1) "a"
2) "d"
3) "a"
4) "c"
5) "b"

修改

set key index value

> lset letter 2 B
OK
> lrange letter 0 -1
1) "a"
2) "d"
3) "B"
4) "c"
5) "b"

內部編碼

  1. ziplist(壓縮列表):小於3.2版本,當元素個數小於list-max-ziplist-entries配置(預設512個),同時每個元素的值長度都小於list-max-ziplist-value配置(預設64位元組)
  2. linkedlist(連結串列):小於3.2版本,不滿足ziplist的條件
  3. quicklist:Redis 3.2版本,以一個ziplist為節點的linkedlist
> object encoding letter
"quicklist"

hash (雜湊)

hash是一個string型別的field和value的對映表。 它適合用於儲存物件,它是無序的,不能使用索引操作。

hash命令

設定

hset key field value

> hset user:1 name zhangSan
(integer) 1
> hset user:1 age 18
(integer) 1

獲取和獲取所有的field-value

hget key field

hgetall key

> hget user:1 name
"zhangSan"
> hgetall user:1
1) "name"
2) "zhangSan"
3) "age"
4) "18"

刪除

hdel key field [field ...]

> hdel user:1 age
(integer) 1
> hdel user:2 age
(integer) 0

長度

hlen key

> hlen user:1
(integer) 1

批量設定

hmset key field value [field value ...]

> hmset user:2 name liSi age 23
OK
> hmget user:2 name age
1) "liSi"
2) "23"
> hlen user:1
(integer) 1
> hlen user:2
(integer) 2

是否存在

hexists key field

> hexists user:2 name
(integer) 1
> hexists user:2 city
(integer) 0

所有的field和所有的value

hkeys key

hvals key

> hkeys user:1
1) "name"
> hkeys user:2
1) "name"
2) "age"
> hvals user:1
1) "zhangSan"
> hvals user:2
1) "liSi"

內部編碼

  1. ziplist(壓縮列表):當元素個數小於hash-max-ziplist-entries配置(預設512個)和每個元素大小小於hash-max-ziplist-value配置(預設64位元組)時
  2. hashtable(雜湊表):不滿足ziplist條件時
> object encoding user:1
"ziplist"

修改配置檔案hash-max-ziplist-entries為5

> hmset test t1 v1 t2 v2 t3 v3 t4 v4 t5 v5 t6 v6
OK
> object encoding test
"hashtable"

set(集合)

用來儲存多個字串元素,無序的,不能有重複元素,不能使用索引下標獲取元素。一個集合可以儲存2^32-1個元素。

set命令

增加

add key member [member ...]

> sadd user:1:tag it music news
(integer) 3
> sadd user:1:tag bike news
(integer) 1

刪除

srem key member [member ...]

> srem user:1:tag bike
(integer) 1

個數

scard key

> scard user:1:tag
(integer) 3

是否存在

sismember key member

> sismember user:1:tag bike
(integer) 0
> sismember user:1:tag it
(integer) 1

隨機返回指定個數

srandmember key [count]

> srandmember user:1:tag
"news"
> srandmember user:1:tag 3
1) "news"
2) "music"
3) "it"

隨機彈出

spop key [count]

> spop user:1:tag
"news"
> srandmember user:1:tag 3
1) "music"
2) "it"

所有個數

smembers key

> smembers user:1:tag
1) "music"
2) "it"

交集

sinter key [key ...]

> sinter user:1:tag user:2:tag
1) "music"
2) "it"

並集

sunion key [key ...]

> sunion user:1:tag user:2:tag
1) "music"
2) "java"
3) "run"
4) "it"

差集

sdiff key [key ...]

> sdiff user:1:tag user:2:tag
(empty list or set)
> sadd user:1:tag sleep
(integer) 1
> sdiff user:1:tag user:2:tag
1) "sleep"
> sdiff user:2:tag user:1:tag
1) "java"
2) "run"

內部編碼

  1. intset(整數集合):元素都是整數和元素個數小於set-max-intset-entries配置(預設512個)時
  2. hashtable(雜湊表):不滿足intset時
> object encoding user:1:tag
"hashtable"

> sadd numbers 1 2 3 4 5
(integer) 5
> object encoding numbers
"intset"

zset(有序集合)

zset保證了元素不能重複,每個元素都有一個分數(score)作為排序的依據。

zset命令

新增

zadd key [NX|XX] [CH] [INCR] score member [score member ...]

> zadd books 8.2 "Redis in Action"
(integer) 1
> zadd books 9.3 "Effective Java: Second Edition : Java"
(integer) 1
> zadd books 9.1 "Think in Java"
(integer) 1
> zadd books 9.3 "Python Cookbook" 9.0 "Effective Python"
(integer) 2

個數

zcard key

> zcard books
(integer) 5

升序返回範圍的成員

zrange key start stop [WITHSCORES]

> zrange books 0 -1
1) "Redis in Action"
2) "Effective Python"
3) "Think in Java"
4) "Effective Java: Second Edition : Java"
5) "Python Cookbook"

> zrange books 2 5
1) "Think in Java"
2) "Effective Java: Second Edition : Java"
3) "Python Cookbook"

升序返回成員時帶上分數

> zrange books 0 -1 withscores
 1) "Redis in Action"
 2) "8.1999999999999993" 
 3) "Effective Python"
 4) "9"
 5) "Think in Java"
 6) "9.0999999999999996"
 7) "Effective Java: Second Edition : Java"
 8) "9.3000000000000007"
 9) "Python Cookbook"
10) "9.3000000000000007"

> zrange books 2 5 withscores
1) "Think in Java"
2) "9.0999999999999996"
3) "Effective Java: Second Edition : Java"
4) "9.3000000000000007"
5) "Python Cookbook"
6) "9.3000000000000007"
  1. 精度問題:內部 score 使用 double 型別進行儲存,所以存在小數點精度問題
  2. withscores:帶上分數

降序

zrevrange key start stop [WITHSCORES]

> zrevrange books 0 -1 withscores
 1) "Python Cookbook"
 2) "9.3000000000000007"
 3) "Effective Java: Second Edition : Java"
 4) "9.3000000000000007"
 5) "Think in Java"
 6) "9.0999999999999996"
 7) "Effective Python"
 8) "9"
 9) "Redis in Action"
10) "8.1999999999999993"

指定value的score

zscore key member

> zscore books "Think in Java"
"9.0999999999999996"

根據score的數值區間升序

zrangebyscore key min max [WITHSCORES] [LIMIT offset count]

> zrangebyscore books 0 9.1 withscores
1) "Redis in Action"
2) "8.1999999999999993"
3) "Effective Python"
4) "9"
5) "Think in Java"
6) "9.0999999999999996"

根據score的數值區間降序

zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]

> zrevrangebyscore books 9.1 0  withscores
1) "Think in Java"
2) "9.0999999999999996"
3) "Effective Python"
4) "9"
5) "Redis in Action"
6) "8.1999999999999993"

根據score的數值降序輸出所有元素

> zrevrangebyscore books +inf -inf  withscores
 1) "Python Cookbook"
 2) "9.3000000000000007"
 3) "Effective Java: Second Edition : Java"
 4) "9.3000000000000007"
 5) "Think in Java"
 6) "9.0999999999999996"
 7) "Effective Python"
 8) "9"
 9) "Redis in Action"
10) "8.1999999999999993"
  1. +inf 正無窮
  2. -inf 負無窮

刪除

zrem key member [member ...]

> zrem books "Effective Java: Second Edition : Java"
(integer) 1

增加分數

zincrby key increment member

> zincrby books 2  "Redis in Action"
"10.199999999999999"
> zincrby books -1  "Redis in Action"
"9.1999999999999993"

交集

zinterstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE

> zadd textbooks 8 "chinese" 9 "english" 9.5 "mathematics"
(integer) 3
> zadd textbooks 9.2 "Think in Java"
(integer) 1

> zrange books 0 -1
1) "Redis in Action"
2) "Effective Python"
3) "Think in Java"
4) "Python Cookbook"
> zrange textbooks 0 -1
1) "chinese"
2) "english"
3) "Think in Java"
4) "mathematics"

> zinterstore newbooks 2 books textbooks
(integer) 1
> zrange newbooks 0 -1
1) "Think in Java"

並集

zunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE

> zunionstore newUnionbooks 2 books textbooks
(integer) 7
> zrange newUnionbooks 0 -1
1) "chinese"
2) "Redis in Action"
3) "Effective Python"
4) "english"
5) "Python Cookbook"
6) "mathematics"
7) "Think in Java"

內部編碼

  1. ziplist(壓縮列表):元素個數小於zset-max-ziplist-entries配置(預設128個)和元素長度小於zset-max-ziplist-value配置(預設64B)時
  2. skiplist(跳躍表):不滿足ziplist時
> object encoding books
"ziplist"

結語

本人深知水平有限,歡迎指正本文錯誤之處。

參考資料

《Redis 實戰》

《Redis 開發與運維》

《Redis 深度歷險:核心原理與應用實踐》

相關推薦

Redis基礎型別

一文了解:Redis基礎型別 Redis特點 開源的,BSD許可高階的key-value儲存系統 可以用來儲存字串,雜湊結構,連結串列,集合 安裝 windows:https://github.com/microsoftarchive/redis/releases mac\linux:http://www.r

Redis事務

Redis事務 事務提供了一種"將多個命令打包,一次性提交併按順序執行"的機制,提交後在事務執行中不會中斷。只有在執行完所有命令後才會繼續執行來自其他客戶的訊息。 Redis中的使用 Redis通過multi,exec,discard,watch實現事務功能。 multi:開始事務 exec:提交事務並執行

Redis的RDB持久化

一文了解:Redis的RDB持久化 Redis是記憶體資料庫,為了保證資料不在故障後丟失,Redis需要將資料持久化到硬碟上。 Redis持久化有兩種方式:一種是快照,全量備份。一種是AOF方式,連續增量方式。 RDB RDB持久化就是把資料生成快照儲存到硬碟的過程。每N分鐘資料傳送了M次寫操作之後,從記憶體

Redis的AOF持久化

Redis的AOF持久化 每當Redis-Server接收到寫資料時,就把命令以文字形式追加到AOF檔案裡,當重啟Redis服務時,AOF檔案裡的命令會被重新執行一次,重新恢復資料。當AOF過大時將重寫AOF檔案。 工作原理 > lpush list 1 2 3 4 (integer) 4 127.0.

Redis過期鍵刪除策略

Redis過期鍵刪除策略 Redis中所有的鍵都可以設定過期策略,就像是所有的鍵都可以上"生死簿",上了生死簿的鍵到時間後閻王就會叉掉這個鍵。同一時間大量的鍵過期,閻王就會忙不過來。同時因為Redis是單執行緒的,導致閻王的處理時間會變得很長,而且處理繁忙,Redis就會出現卡頓現象。 R

Redis主從複製

Redis主從複製 主從複製 主從複製,將一臺Redis伺服器的資料,複製到其他Redis伺服器。前者稱為主(master)節點,後者稱為從(slave)節點 。 在預設的情況下,Redis都是主節點,每個從節點只能有一個主節點,一個主節點可以有多個從節點。複製的資料只能從主節點複製到從節點。 配置方式 在

夯實Java基礎系列4final關鍵字的特性、使用方法,以及實現原理

目錄 final使用 final變數 final修飾基本資料型別變數和引用 final類 final關鍵字的知識點 final關鍵字的最佳實踐 final的用法 關於空白final final記憶體分配 使用final修飾方法會提高速度和效率嗎 使用final修飾變數會讓變數的值不能被改變嗎; 如何保

推薦 AI時代的資料風險(後真相時代、演算法囚徒和權利讓渡)

當今,在基於資料的個性化推薦演算法機制滿足了人們獵奇心、窺探欲、表演慾,讓人們在網路中尋找到共鳴

線性代數--深度學習入門之數學基礎

一文了解線性代數–深度學習入門之數學基礎 本文將簡單且形象的對線性代數進行介紹,與傳統的線性代數教材不同,我不想聚焦於具體的數學命題和技術,而是想探究線性代數的現實意義與哲學本質。本文主要記錄我為了深入瞭解機器學習而再次學習線性代數的一些所思所感,或許不夠

Redis 記憶體監控和記憶體消耗

Redis 是一種記憶體資料庫,將資料儲存在記憶體中,讀寫效率要比傳統的將資料儲存在磁碟上的資料庫要快很多。所以,監控 Redis 的記憶體消耗並瞭解 Redis 記憶體模型對高效並長期穩定使用 Redis 至關重要。 記憶體使用統計 通過 info memory 命令可以獲得 Redis 記憶體相關的指

.Net Core 3.1 Web API基礎知識

一、前言   隨著近幾年前後端分離、微服務等模式的興起,.Net Core也似有如火如荼之勢 ,自16年釋出第一個版本到19年底的3.1 LTS版本,以及將釋出的.NET 5,.NET Core一路更迭,在部署和開發工具上也都支援了跨平臺應用。一直對.Net Core有所關注,但未涉及太多實際應用,經過一番學

[翻譯自官方]什麼是RDB和AOF? Redis持久化!

  ​概述 本文提供Redis持久化技術說明,  建議所有Redis使用者閱讀. 如果您想更深入瞭解Redis永續性原理機制和底層永續性保證, 請參考文章 揭祕Redis持久化: http://antirez.com/post/redis-persistence-demystifie

sun.misc.Unsafe

類型轉換 鏈接 str DC arch lang 生態 rip export Java語言和JVM平臺已經度過了20歲的生日。它最初起源於機頂盒、移動設備和Java-Card,同時也應用在了各種服務器系統中,Java已成為物聯網(Internet of Things)的通用

網絡安全數字化轉型,Gartner的這些數字驚呆你!

紅芯企業瀏覽器 數字化轉型提起網絡安全立馬會想到Facebook泄密門受影響的用戶已達到8700 萬事實甚至比這個數字還要多得多連媒體都在感嘆網絡安全界真是“多事之秋”啊! 而Gartner近期發布的全球網絡安全產業規模發展及趨勢預測,那些關於網安行業的數字更是驚人。 “數字安全大家族”來啦 網絡安全問題由來

安卓APP逆向分析與保護機制

dex 也不會 時也 也有 包含 啟動 RM 操作 混亂 “知物由學”是網易雲易盾打造的一個品牌欄目,詞語出自漢·王充《論衡·實知》。人,能力有高下之分,學習才知道事物的道理,而後才有智慧,不去求問就不會知道。“知物由學”希望通過一篇篇技術幹貨、趨勢解讀、人物思考和沈澱給你

c/c++、java、JavaScript、php、Python的用途

BE 算法實現 分布式 底層 web服務器 物聯網 文檔 性能 爆發 編程語言是用來定義計算機程序的形式語言。它是一種被標準化的交流技巧,用來向計算機發出指令。一種計算機語言讓程序員能夠準確地定義計算機所需要使用的數據,並精確地定義在不同情況下所應當采取的行動。 C和C+

“Service Mesh(服務網格)”的歷史與現在

對於大多數人來說,“Service Mesh(服務網格)”仍然是一個新概念,因此,談論它的“歷史”可能看起來有點滑稽。但事實上,早在2010年初,在一些大網路規模的公司中,服務網格的概念就隱約開始逐步形成了。因此,服務網格確實有一段歷史值得去探索、去理解。  

強化學習

雖然是週末,也保持充電,今天來看看強化學習,不過不是要用它來玩遊戲,而是覺得它在製造業,庫存,電商,廣告,推薦,金融,醫療等與我們生活息息相關的領域也有很好的應用,當然要了解一下了。 本文結構: 定義 和監督式學習

,大資料就業薪資怎麼樣?

大資料行業薪資高,是顯而易見的,於此同時,大資料崗位薪資的範圍也是比較寬的,這關係到個人的學歷學科背景,技術掌握情況,當然各個地區的薪資肯定是不同的。本文從三個角度來分析薪資。先從科多大資料的一個大資料開發培訓班來了解初級大資料崗位的薪資情況,對於很多初入大資料行業的人來說,這個比較有參考性,其次從

前端、後端、全棧都學什麼?薪資前景如何?

隨著資訊產業的迅猛發展,IT行業人才需求量也在逐年擴大。 據國內權威資料統計,未來五年,我國資訊化人才總需求量高達1500萬—2000萬人。其中“軟體開發”、“網路工程”等人才的缺口最為突出。以軟體開發為例,我國軟體人才需求以每年遞增20%的速度增長,每年新增需求近百萬。 這也是目前很多非科