整理一些常見Redis資料結構(總結)
這篇文章跟大家整理分享一些常見Redis資料結構,還有一些常用指令整理,希望對大家有幫助!
什麼是資料結構?
有Java基礎的應該知道常用的一些資料結構,像是陣列、佇列、堆疊等等... 那Redis的資料結構跟Java的資料結構有什麼不同嗎?答案是有的,如果一些小夥伴了解的Map的話就知道Map中有一個Key值和一個Value值,Redis的資料結構也是這樣的。
Redis的資料結構:String、List、Hash、Set的話都是有一個Key值和一個Value值。
Key值是名字,Value值就是資料。這兩個是綁在一起的,一個Key值對應一個Value值,我們稱為這樣的鍵值對。 【相關推薦:Redis影片教學】
Redis常用的基本指令
在Redis中,在不同的場景下會使用不同的命令。但是不是每個指令都需要記住呢?不是的,只需要熟悉最常用的指令就好了,在需要使用一些少用的指令可以去官方文件查閱即可。以下來介紹Redis中一些常用的指令。
1.# exists(判断key值是否存在):如果存在返回1,反之返回0 例子: exists name(name为key) 2.# del(删除key): 删除成功返回1,反之返回0 3.# type(判断key的类型) 4.ttl(查看key存活时间
想學習更多指令可以自行到中文文件查詢:http://www.redis.cn/
String類型的介紹與使用場景
String字串類型是Redis中最基本的資料類型,在Redis中的應用程式場景很廣,一個key對應一個value。
Redis的String是動態字串,可修改的字串,它的內部結構類似於Java的ArrayList,採用預先分配冗餘空間的方式來減少記憶體的分配。
String類型是二進位安全的,意思是Redis的String可以包含任何的資料。如:數字,字串,圖片等
String類型的應用程式場景:驗證碼、計數器、訂單重複提交、使用者登入資訊、商品詳情的實作
##String的常用指令1.# set/get 设置和获取key-value 注意中间一定要加空格
例子: set xxx(key) xxx(value)
get xxx(key)
2.# mget/mset 批量设置或获取多个key的值
mset user:name jack user:age 2
mget user:name user:age
3.# incr incr对key对应的值进行加1操作,并返回新的值
incr video:uv:1
4. # incrby 将key对应的数字加increment.如果key不存在,操作之前,key就会被置为0
incrby video:uv:1 10
5.# setex 设置key对应字符串value,并且设置key在给定的seconds时间之后超时过期操作
setex code 20 778899 (设置一个key为code value为778899 20秒后过期)4
6. # setnx 将key设置值为value,如果存在该key那么什么都不做,如果不存在key那么等同于set命令
setnx name xdclass.net
7. # getset 设置key的值,并返回key旧的值
get name uuuuu (这时会返回xdclass.net,重新在get一下会获得重新设置的值uuuuu)
登入後複製
1.# set/get 设置和获取key-value 注意中间一定要加空格 例子: set xxx(key) xxx(value) get xxx(key) 2.# mget/mset 批量设置或获取多个key的值 mset user:name jack user:age 2 mget user:name user:age 3.# incr incr对key对应的值进行加1操作,并返回新的值 incr video:uv:1 4. # incrby 将key对应的数字加increment.如果key不存在,操作之前,key就会被置为0 incrby video:uv:1 10 5.# setex 设置key对应字符串value,并且设置key在给定的seconds时间之后超时过期操作 setex code 20 778899 (设置一个key为code value为778899 20秒后过期)4 6. # setnx 将key设置值为value,如果存在该key那么什么都不做,如果不存在key那么等同于set命令 setnx name xdclass.net 7. # getset 设置key的值,并返回key旧的值 get name uuuuu (这时会返回xdclass.net,重新在get一下会获得重新设置的值uuuuu)
注意: 值的長度不能超過512MB,遵循key的命名規範:業務名稱:表示:ID(不要過長,用冒號分割)
String的內部結構(內部結構為深入探究)
Redis中沒有使用C語言的傳統字串來表示,而是建構了一個名為簡單動態字符串(SDS)的抽象類型。為什麼Redis要用自己建構的SDS而不是直接用C語言的String呢?原因其實很簡單,就是為了提升Redis操作的效能。SDS字串與C語言字串有什麼優勢?
- 常數複雜度取得字串長度:C語言想取得長度,那麼它就必須遍歷一整個字串才行。 SDS透過len屬性取得SDS字串長度的時間複雜度從O(N)變成了O(1),保證了取得字串長度時不會成為Redis的效能瓶頸。
- 減少修改帶來的記憶體重新分配次數:記憶體重新分配就是說在修改字串時,由於記憶體空間的不足或超出了,需要對執行記憶體的重分配操作,這種操作由於會涉及到內存,所以導致時間的成本高,所以我們應該盡量的避免內存重分配。而在SDS就是有len和free這兩個屬性,可以使用最佳化策略來減少對記憶體重新分配次數。
List類型的介紹與使用場景
List類型說白了就是一個鍊錶, 插入元素進去後是有序排列的,value值是可以重複的,可以透過對應的下標來取得對應的value值,鍊錶的左右兩邊都能進行插入和刪除資料。在插入時,如果該鍵並不存在,那麼Redis將為該鍵建立一個新的鍊錶。與此相反,如果這個鍊錶中的所有元素都被刪除,那麼該鍵也會被刪除掉。
應用程式情境:簡單佇列、最新評論清單、非即時排行榜:定時計算榜單,如手機日銷榜單List的常用指令 #1. # lpush 将一个或多个值插入到列表头部
lpush phone:rank:daily iphone6
2. # rpop 移除并获取列表的最后一个元素
rpor phone:rank:daily
3. # llen 获取列表长度
llen phone:rank:daily
4. # lrange 获取key对应的list的指定下标范围元素,其中0表示列表的第一个元素,-1表示获取列表的所有元素
lrange phone:rank:daily 0 -1
5. # rpush 在key对应的list尾部添加一个元素
rpush phone:rank:daily xiaodi
6. # lpop 从key对应的List的尾部删除一个元素,并返回该元素
lpop phone:rank:daily
7. # bropo 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
brpop phone:rank:daily 20
8. # lrem 移除元素
lrem phone:rank:daily 2 a
登入後複製
1. # lpush 将一个或多个值插入到列表头部 lpush phone:rank:daily iphone6 2. # rpop 移除并获取列表的最后一个元素 rpor phone:rank:daily 3. # llen 获取列表长度 llen phone:rank:daily 4. # lrange 获取key对应的list的指定下标范围元素,其中0表示列表的第一个元素,-1表示获取列表的所有元素 lrange phone:rank:daily 0 -1 5. # rpush 在key对应的list尾部添加一个元素 rpush phone:rank:daily xiaodi 6. # lpop 从key对应的List的尾部删除一个元素,并返回该元素 lpop phone:rank:daily 7. # bropo 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 brpop phone:rank:daily 20 8. # lrem 移除元素 lrem phone:rank:daily 2 a
List的內部結構(內部結構為深入探究)
上面了解了List的常用指令的使用,我們現在就來看下list的底層結構。 List有兩種實作方式- 壓縮鍊錶(ziplist):是Redis為了節省記憶體空間而開發的,它是特殊編碼的連續記憶體區塊而組成的一個順序資料結構,一個壓縮列表可以包含許多任意的節點,它的重點是記憶體連續!
双端链表:使用prev和next这两个指针,是可以从前向后也可以从后向前来实现lpush和rpush这些指令。因为是链表,所以也导致了lindex指令获取某个元素需要遍历链表才能获取得到。时间复杂度O(n)。
当列表的对象同时满足下述两个条件时,列表对象采用压缩链表编码:
(1)列表对象保存的所有元素长度都小于64个字节;
(2)列表元素所保存的元素个数小于512个
在Redis3.2之后,采用的是快速链表-quicklist。quicklist是一个双向链表,并且它还是一个有ziplist特性的双向链表,就是说quicklist每个节点都是ziplist。这个快速链表结合了两者的优点。
Hash类型的介绍与使用场景
Redis中的Hash类型是一个String类型的field和value的映射表,Hash特别适合用于存储对象,Hash类似于Map结构。因为在Redis里,Hash又是另外的一种键值对结构,而Redis本身就是key-value类型,所以这个Hash结构是套在了Redis下的value里。
下面说说Hash的底层数据结构:
一种是ziplist , 当存储的数据超过所配置的数量大小时就是转成Hashtable这种结构。这种转换会比较消耗性能,所以尽量少用这种转换操作。
另一种就是hashtable , 这种结构的时间复杂度为O(1),但是会比较消耗内存空间。
对于Hash在Redis中的应用场景:购物车、用户个人信息、商品详情的实现
Hash的常用命令
1. # hset 设置key指定的哈希集指定字段的值 hset product:detail:1 title iphone11 2. # hget 返回key指定的哈希集中该字段所关联的值 hget product:detail:1 title 3. # hgetall 返回key指定的哈希集中所有的字段和值 hegetall product:detail:1 4. # hdel 从key指定的哈希集中移除指定的域 hdel product:detail:1 title 5. # hexists 返回hash里面的field是否存在 hexists product:detail:1 title (存在返回1,不存在返回0) 6. # hincrby 增加key指定的哈希集中的指定字段的数值,如果是-1则是递减 hincrby product:detail:1 key 1 (对key里的value值进行递增或递减) 7. # hmset 设置key指定的哈希集中指定字段的值 hmset product:detail:2 title xiaomi price 1000 stock 10 8. # hmget 返回key指定的哈希集中指定字段的值 hmget product:detail:2 title price
注意: 每个Hash可以存储232-1键值对
Set类型的介绍与使用场景
Redis中的Set类型是一个集合,集合的概念是一堆不重复的组合。利用Redis提供的Set数据结构可以存储一些集合性的数据。因为Redis很友好的为集合提供了求集、并集、差集等操作( PS:不懂的同学可以问下以前的数学老师哦~哈哈哈哈),那么就可以非常方便的实现共同关注、共同喜好等功能。对上面的集合操作,你还可以使用不同的命令选择奖结果返回给客户端还是存集合到一个新的集合中。
Redis中Set应用场景:去重、社交应用关注(粉丝,共同好友)、统计网站PV(UV、IP)大数据里面的用户画像标签集合
Set的常用命令
1. # sadd 添加一个或多个指定的元素到集合中,如果指定的元素已经在集合key中则忽略 sadd user:tags female sadd user:tags bmw 2. # scard 返回集合存储的key的基数(集合元素的数量) scard user:tags 3. # sdiff 返回的集合元素是第一个key集合与后面所有key集合的差集 sdiff user:tags:1 user:tags:2 4. # sinter 返回指定所有的集合的成员的交集 sinter user:tags:1 user:tags:2 5. # sismember 返回成员是否有存储的集合key的成员 sismember user:tags:1 bmw 6. # srem 在集合中移除指定的元素,如果指定元素不是key集合中的则忽略 srem user:tags:1 bmw 7. # sunion 返回给定的多个集合的并集所有的成员 sunion user:tags:1 user:tags:2
SortedSet类型的介绍与使用场景
和Set相比,SortedSet是将Set中的元素增加了一个权重参数score,使得集合中的元素能够按 score进行有序排序,比如存储一个存储班上同学成绩的SortedSet集合,该集合value可以设为同学的学号,然而score就可以是考试成绩。这样才插入数据的时候,就已经为数据进行了排序。另外,SortedSet还可以用来做带权重的队列。
应用场景:实时排行榜、优先级任务(队列)、朋友圈(文章)点赞-取消
SortedSet中跳跃表的介绍
跳跃表实则是一个链表,在传统的链表中想要查找一个元素就要从最原始的地方开始查找,直到查找到该元素。在跳跃表中呢,它会把链表进行抽层,抽层的时候会隔几个元素分为一个节点,抽层之后也是一条链表,节点会变少了。如下图所示,当要寻找元素78时,如果是寻常的链表就会从左往右挨个查询,这时查询了8次才能找带该元素。当使用跳跃表后,从第二层的开始出发,当查询到79这个节点时发现没有78,则返回到57这个节点再返回第一层去寻找该元素。
SortedSet的常用命令
1.# zadd 向有序集合里添加一个或者多个成员,或者更新已存在成员的分数 zadd video:rank 90 springcloud zadd video:rank 80 springboot zadd video:rank 50 redis 2.# zcard 获取有序集合的成员数 zcard video:rank 3.# zcount 计算在有序集合中指定的区间分数的成员数 zcount video:rank 0 60 4.# zincrby 在有序集合中对指定成员的分数加上增量 zincrby video:rank 2 springcloud 5.# zrange 通过索引区间返回有序集合指定内的成员,成员位置分数按(从小到大排序) zrange voideo:rank 0 -1 zrange voideo:rank 0 -1 withscores(返回分数) 6.# zrevrange 通过索引集合中指定成员的排名,其中有序集合成员按score值递增(从大到小排序) zrevrange voideo:rank 0 -1 7.# zrevrank 返回有序集合中指定的成员排名,有序集合成员按分数递减(从大到小排序) zrevrank voideo:rank springcloud 8.# zrank 返回有序集key中成员member的排名,其中有序集成员按score值递增(从小到大排序) zrank voideo:rank 9.# zrem 移除有序集合中的一个或者多个成员 zrem voideo:rank redis 10.# zscore 返回有序集合中的成员分数值 zscore voideo:rank springcloud
好啦Redis的数据类型都整理好了,如果文章对你有帮助的话记得点点赞哈,可以的话也点点关注哦。求求各位大哥啦。
更多编程相关知识,请访问:编程入门!!
以上是整理一些常見Redis資料結構(總結)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

使用 Redis 指令需要以下步驟:打開 Redis 客戶端。輸入指令(動詞 鍵 值)。提供所需參數(因指令而異)。按 Enter 執行指令。 Redis 返迴響應,指示操作結果(通常為 OK 或 -ERR)。

Redis 使用單線程架構,以提供高性能、簡單性和一致性。它利用 I/O 多路復用、事件循環、非阻塞 I/O 和共享內存來提高並發性,但同時存在並發性受限、單點故障和不適合寫密集型工作負載的局限性。

理解 Redis 源碼的最佳方法是逐步進行:熟悉 Redis 基礎知識。選擇一個特定的模塊或功能作為起點。從模塊或功能的入口點開始,逐行查看代碼。通過函數調用鏈查看代碼。熟悉 Redis 使用的底層數據結構。識別 Redis 使用的算法。

Redis 使用哈希表存儲數據,支持字符串、列表、哈希表、集合和有序集合等數據結構。 Redis 通過快照 (RDB) 和追加只寫 (AOF) 機制持久化數據。 Redis 使用主從復制來提高數據可用性。 Redis 使用單線程事件循環處理連接和命令,保證數據原子性和一致性。 Redis 為鍵設置過期時間,並使用 lazy 刪除機制刪除過期鍵。

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

使用Redis進行鎖操作需要通過SETNX命令獲取鎖,然後使用EXPIRE命令設置過期時間。具體步驟為:(1) 使用SETNX命令嘗試設置一個鍵值對;(2) 使用EXPIRE命令為鎖設置過期時間;(3) 當不再需要鎖時,使用DEL命令刪除該鎖。
