Redis詳解:sets數據類型及操作

2021-01-10 IT168

  【IT168 專稿】 set是集合,和我們數學中的集合概念相似,對集合的操作有添加刪除元素,有對多個集合求交並差等操作,操作中key理解為集合的名字。

  系列文章:

  Redis詳解:strings數據類型及操作

  Redis詳解:hashes數據類型及操作

  Redis詳解:lists數據類型及操作

  Redis的set是string類型的無序集合。set元素最大可以包含(2的32次方)個元素。

  set的是通過hash table實現的,所以添加、刪除和查找的複雜度都是O(1)。hash table會隨著添加或者刪除自動的調整大小。需要注意的是調整hash table大小時候需要同步(獲取寫鎖)會阻塞其他讀寫操作,可能不久後就會改用跳表(skip list)來實現,跳表已經在sorted set中使用了。關於set集合類型除了基本的添加刪除操作,其他有用的操作還包含集合的取併集(union),交集(intersection),差集(difference)。通過這些操作可以很容易的實現sns中的好友推薦和blog的tag功能。下面詳細介紹set相關命令:

  1、sadd

  向名稱為key的set中添加元素:

  redis 127.0.0.1:6379> sadd myset "hello"

  (integer) 1

  redis 127.0.0.1:6379> sadd myset "world"

  (integer) 1

  redis 127.0.0.1:6379> sadd myset "world"

  (integer) 0

  redis 127.0.0.1:6379> smembers myset

  1) "world"

  2) "hello"

  redis 127.0.0.1:6379>

  本例中,我們向myset中添加了三個元素,但由於第三個元素跟第二個元素是相同的,所以第三個元素沒有添加成功,最後我們用smembers來查看myset中的所有元素。

  2、srem

  刪除名稱為key的set中的元素member:

  redis 127.0.0.1:6379> sadd myset2 "one"

  (integer) 1

  redis 127.0.0.1:6379> sadd myset2 "two"

  (integer) 1

  redis 127.0.0.1:6379> sadd myset2 "three"

  (integer) 1

  redis 127.0.0.1:6379> srem myset2 "one"

  (integer) 1

  redis 127.0.0.1:6379> srem myset2 "four"

  (integer) 0

  redis 127.0.0.1:6379> smembers myset2

  1) "three"

  2) "two"

  redis 127.0.0.1:6379>

  本例中,我們向myset2中添加了三個元素後,再調用srem來刪除one和four,但由於元素中沒有four所以,此條srem命令執行失敗。

  3、spop

  隨機返回並刪除名稱為key的set中一個元素:

  redis 127.0.0.1:6379> sadd myset2 "one"

  (integer) 1

  redis 127.0.0.1:6379> sadd myset2 "two"

  (integer) 1

  redis 127.0.0.1:6379> sadd myset2 "three"

  (integer) 1

  redis 127.0.0.1:6379> srem myset2 "one"

  (integer) 1

  redis 127.0.0.1:6379> srem myset2 "four"

  (integer) 0

  redis 127.0.0.1:6379> smembers myset2

  1) "three"

  2) "two"

  redis 127.0.0.1:6379>

  本例中,我們向myset3中添加了三個元素後,再調用spop來隨機刪除一個元素,可以看到three元素被刪除了。

  4、sdiff

  返回所有給定key與第一個key的差集:

  redis 127.0.0.1:6379> sadd myset2 "one"

  (integer) 1

  redis 127.0.0.1:6379> sadd myset2 "two"

  (integer) 1

  redis 127.0.0.1:6379> sadd myset2 "three"

  (integer) 1

  redis 127.0.0.1:6379> srem myset2 "one"

  (integer) 1

  redis 127.0.0.1:6379> srem myset2 "four"

  (integer) 0

  redis 127.0.0.1:6379> smembers myset2

  1) "three"

  2) "two"

  redis 127.0.0.1:6379>

  本例中,我們可以看到myset2中的元素與myset3中不同的只是three,所以只有three被查出來了,而不是three和one,因為one是myset3的元素。

  我們也可以將myset2和myset3換個順序來看一下結果:

  redis 127.0.0.1:6379> sdiff myset3 myset2

  1) "one"

  redis 127.0.0.1:6379>

  這個結果中只顯示了,myset3中的元素與myset2中不同的元素。

  5、sdiffstore

  返回所有給定key與第一個key的差集,並將結果存為另一個key:

  redis 127.0.0.1:6379> smembers myset2

  1) "three"

  2) "two"

  redis 127.0.0.1:6379> smembers myset3

  1) "two"

  2) "one"

  redis 127.0.0.1:6379> sdiffstore myset4 myset2 myset3

  (integer) 1

  redis 127.0.0.1:6379> smembers myset4

  1) "three"

  redis 127.0.0.1:6379>

  6、sinter

  返回所有給定key的交集:

  redis 127.0.0.1:6379> smembers myset2

  1) "three"

  2) "two"

  redis 127.0.0.1:6379> smembers myset3

  1) "two"

  2) "one"

  redis 127.0.0.1:6379> sinter myset2 myset3

  1) "two"

  redis 127.0.0.1:6379>

  通過本例的結果可以看出, myset2和myset3的交集two被查出來了。

相關焦點

  • 看完這篇別再說你不懂單機redis了
    Redis與MySQL/Oracle的區別2、Redis數據結構單機redis搭建redis基本數據類型用法3、Redis性能測試MySQL/Oracle將數據持久化的存儲到硬碟;資料庫類型:Redis屬於非關係型資料庫;MySQL/Oracle關係型資料庫存取效率:Redis直接在內存中存取數據效率高;MySQL/Oracle每次請求訪問資料庫時,都存在著I/O操作,如果反覆頻繁的訪問資料庫。
  • 聊聊python 數據處理全家桶(Redis篇)
    在操作 Redis 中的數據之前,我們需要利用 Host、埠號、密碼實例化一個 Redis 連接對象from redis import Redisclass RedisF(object):def __init__(self):
  • 架構秘笈:移花接木,使用MySQL模擬Redis
    改業務代碼是來不及了,只好用一些持久化存儲 ,來模擬redis的一些數據結構。redis支持近十種數據類型,最常用的有5種。string、hash、zset、set、list等。本文將針對幾種常見的數據結構,探討一下常用操作的模擬實現。
  • Redis 的 8 大數據類型,寫得非常好!(建議收藏)
    Redis 的八大數據類型Redis-key127.0.0.1:6379> keys *(empty list or set)127.0.0.1:6379> set name xxxOK127.0.0.1:6379> keys *1) "name"127.0.0.1:6379> set age 1OK127.0.0.1:6379>
  • Redis緩存與NodeJS的初學教程
    Redis支持存儲多種數據結構和數據類型,包括字符串、列表、散列、集合和排序集合。受支持的數據結構為Redis提供了多種用例的通用性。Redis是最好的情況,在最短的時間需要數據檢索和交付給客戶端。緩存是什麼緩存是在緩存中存儲數據副本的過程,以允許應用程式更快地訪問和檢索數據。緩存的目標是比資料庫或遠程伺服器更好地加速數據訪問操作。對於昂貴的(及時的)操作尤其如此。作為一個後端開發人員,我們的任務是儘快完成客戶的請求。
  • Redis-Window Server快速搭建Redis Cluster集群
    集群採用去中心節點方式實現,節點間數據同步通過gossip協議完成狀態互換,客戶端可直接連接redis集群中任一節點獲取數據字典服務,集群中數據持久化通過Hash算法計算出鍵(Key)對應的哈希卡槽(Hash Slot)進行數據持久化操作,集群中數據新增或者遷移節點也能通過Slot的遷移方便的實現。
  • redis集群架構的演進之路
    從節點執行完RDB文件後,主節點將replication buffer的修改操作,發送到從節點,從節點加載replication buffer數據,第一次主從同步完成。網絡中斷時,主從結構如何保持數據一致性?
  • Redis是如何實現點讚、取消點讚的?
    我是如何用redis做實時訂閱推送的?正文:本文基於 SpringCloud, 用戶發起點讚、取消點讚後先存入 Redis 中,再每隔兩小時從 Redis 讀取點讚數據寫入資料庫中做持久化存儲。點讚、取消點讚是高頻次的操作,若每次都讀寫資料庫,大量的操作會影響資料庫性能,所以需要做緩存。至於多久從 Redis 取一次數據存到資料庫中,根據項目的實際情況定吧,我是暫時設了兩個小時。
  • 搞懂這些Redis知識點,吊打面試官!
    我頓了一下,接著說,Redis 作為一個內存資料庫:性能優秀,數據在內存中,讀寫速度非常快,支持並發 10W QPS。單進程單線程,是線程安全的,採用 IO 多路復用機制。豐富的數據類型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
  • Redis面試:八問字典內部構造與rehash,給我整懵了
    redis的字典字典作為一種數據結構內置在很多高級程式語言裡面,但是redis是基於C語言進行開發的,所以沒有內置這種數據結構,redis只能構建自己的字典實現。字典通常可以由兩種底層數據結構組成,分別是線性表(數組)和hash表。
  • 分布式鎖解決方案-Redis
    ='methodName';```問題:1、因為是基於資料庫實現的,資料庫的可用性和性能將直接影響分布式鎖的可用性及性能,所以,資料庫需要雙機部署、數據同步、主備切換;2、不具備可重入的特性,因為同一個線程在釋放鎖之前,行數據一直存在,無法再次成功插入數據
  • 連redis這些概念都不知道,誰敢相信您曾搞過軟體開發?
    這些數據類型都支持push/pop、add/remove以及取交集,併集和差集等多種豐富操作,而且這些操作都是原子性的。1.速度快,因為數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)2.支持豐富數據類型,支持string,list,set,sorted set,hash1)String
  • 新入職的妹子問我Redis是如何實現點讚、取消點讚的?
    基於 SpringCloud, 用戶發起點讚、取消點讚後先存入 Redis 中,再每隔兩小時從 Redis 讀取點讚數據寫入資料庫中做持久化存儲。點讚功能在很多系統中都有,但別看功能小,想要做好需要考慮的東西還挺多的。點讚、取消點讚是高頻次的操作,若每次都讀寫資料庫,大量的操作會影響資料庫性能,所以需要做緩存。
  • redis持久化和選擇
    持久化的作用什麼是持久化redis所有的數據保存在內存中,對數據的更新將異步地保存在硬碟中。地持久化地取捨和選擇RDB什麼是RDBredis在硬碟上創建一個二進位的rdb文件,redis啟動時會把這個rdb文件載入到內存中觸發機制- 主要三種方式save 同步save命令有一個問題,它是一個同步命令,如果數據很多的話
  • Spring Redis中使用Lua腳本實現高並發原子操作
    前言在上一文中我對 Lua 語言的一些簡單的語法及其在 Redis 中的操作進行了介紹,但是在 Java 開發中我們還需要進一步的學習才能使這種技術落地。今天就結合Spring Data Redis這個我們經常使用的 Redis 開發組件來實際嘗試一下 Lua 腳本。2.
  • redis的主從複製
    單機有什麼問題機器故障 數據如何同步的問題(高可用)容量瓶頸QPS瓶頸 (分布式)什麼是主從複製一主一從 一主多從作用數據副本拓展讀性能總結一個master可以有多個slave一個slave只能有一個master
  • 跬步千裡——阿里雲Redis bitfield命令加速記
    圖1.阿里雲Redis讀寫分離版讀寫命令轉發示例1.2 bitfield命令經過和客戶溝通查看後,客戶使用了大量的bitfield做讀取,首先介紹一下這個命令的用法和場景,bitfield 是針對bitmap數據類型操作的命令,bitmap通常被用來在極小空間消耗下通過位的運算(AND/OR/XOR/NOT)實現對狀態的判斷,常見的使用場景例如:
  • Redis系列10之bitmap
    書接上回上一篇我們學習的 zset集合這一數據類型。其內部是由skiplist和hashtable這種兩種數據結構編碼的。如果不記得了,那就來坐穿梭機回去看看吧。開始穿梭接下來,我們繼續學習一個新的"數據類型", 位圖, bitmap.(注意啦,數據類型,我加了引號!!)
  • 在實戰中學習Springboot+Security+redis+jwt的登錄流程
    -- redis 操作依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId&
  • 騰訊開源分布式存儲系統 Tendis,可完全兼容 Redis
    據悉,Tendis 是騰訊互娛 CROS DBA 團隊 & 騰訊雲資料庫團隊自主設計和研發的分布式高性能 KV 存儲資料庫,兼容 Redis 核心數據結構與接口,可提供大容量、低成本、強持久化的資料庫能力,適用於兼容 Redis 協議、需要大容量且較高訪問性能的溫冷數據存儲場景。Tendis 目前已經被應用到騰訊內、外部大型項目中。