Redis sets
Introduction to Redis sets
-
SADD v1.0.0 @write @set @fastAdds one or more members to a set. Creates the key if it doesn't exist. O(1) for each element added, so O(N) to add N elements when the command is called with multiple arguments.
-
SCARD v1.0.0 @read @set @fastReturns the number of members in a set. O(1)
-
SDIFF v1.0.0 @read @set @slowReturns the difference of multiple sets. O(N) where N is the total number of elements in all given sets.
-
SDIFFSTORE v1.0.0 @write @set @slowStores the difference of multiple sets in a key. O(N) where N is the total number of elements in all given sets.
-
SINTER v1.0.0 @read @set @slowReturns the intersect of multiple sets. O(N*M) worst case where N is the cardinality of the smallest set and M is the number of sets.
-
SINTERCARD v7.0.0 @read @set @slowReturns the number of members of the intersect of multiple sets. O(N*M) worst case where N is the cardinality of the smallest set and M is the number of sets.
-
SINTERSTORE v1.0.0 @write @set @slowStores the intersect of multiple sets in a key. O(N*M) worst case where N is the cardinality of the smallest set and M is the number of sets.
-
SISMEMBER v1.0.0 @read @set @fastDetermines whether a member belongs to a set. O(1)
-
SMEMBERS v1.0.0 @read @set @slowReturns all members of a set. O(N) where N is the set cardinality.
-
SMISMEMBER v6.2.0 @read @set @fastDetermines whether multiple members belong to a set. O(N) where N is the number of elements being checked for membership
-
SMOVE v1.0.0 @write @set @fastMoves a member from one set to another. O(1)
-
SPOP v1.0.0 @write @set @fastReturns one or more random members from a set after removing them. Deletes the set if the last member was popped. Without the count argument O(1), otherwise O(N) where N is the value of the passed count.
-
SRANDMEMBER v1.0.0 @read @set @slowGet one or multiple random members from a set Without the count argument O(1), otherwise O(N) where N is the absolute value of the passed count.
-
SREM v1.0.0 @write @set @fastRemoves one or more members from a set. Deletes the set if the last member was removed. O(N) where N is the number of members to be removed.
-
SSCAN v2.8.0 @read @set @slowIterates over members of a set. O(1) for every call. O(N) for a complete iteration, including enough command calls for the cursor to return back to 0. N is the number of elements inside the collection.
-
SUNION v1.0.0 @read @set @slowReturns the union of multiple sets. O(N) where N is the total number of elements in all given sets.
-
SUNIONSTORE v1.0.0 @write @set @slowStores the union of multiple sets in a key. O(N) where N is the total number of elements in all given sets.
A Redis set is an unordered collection of unique strings (members). You can use Redis sets to efficiently:
- Track unique items (e.g., track all unique IP addresses accessing a given blog post).
- Represent relations (e.g., the set of all users with a given role).
- Perform common set operations such as intersection, unions, and differences.
Examples
-
Store the sets of bikes racing in France and the USA. Note that if you add a member that already exists, it will be ignored.
Foundational: Add members to a set using SADD when you need to store unique items (duplicates are silently ignored)Redis CLI guideAlso, check out our other client tools Redis Insight and Redis for VS Code.res1 = r.sadd("bikes:racing:france", "bike:1") print(res1) # >>> 1 res2 = r.sadd("bikes:racing:france", "bike:1") print(res2) # >>> 0 res3 = r.sadd("bikes:racing:france", "bike:2", "bike:3") print(res3) # >>> 2 res4 = r.sadd("bikes:racing:usa", "bike:1", "bike:4") print(res4) # >>> 2""" Code samples for Set doc pages: https://redis.io/docs/latest/develop/data-types/sets/ """ import redis r = redis.Redis(decode_responses=True) res1 = r.sadd("bikes:racing:france", "bike:1") print(res1) # >>> 1 res2 = r.sadd("bikes:racing:france", "bike:1") print(res2) # >>> 0 res3 = r.sadd("bikes:racing:france", "bike:2", "bike:3") print(res3) # >>> 2 res4 = r.sadd("bikes:racing:usa", "bike:1", "bike:4") print(res4) # >>> 2 r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3") r.sadd("bikes:racing:usa", "bike:1", "bike:4") res5 = r.sismember("bikes:racing:usa", "bike:1") print(res5) # >>> 1 res6 = r.sismember("bikes:racing:usa", "bike:2") print(res6) # >>> 0 r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3") r.sadd("bikes:racing:usa", "bike:1", "bike:4") res7 = r.sinter("bikes:racing:france", "bikes:racing:usa") print(res7) # >>> {'bike:1'} r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3") res8 = r.scard("bikes:racing:france") print(res8) # >>> 3 r.delete("bikes:racing:france") res9 = r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3") print(res9) # >>> 3 res10 = r.smembers("bikes:racing:france") print(res10) # >>> {'bike:1', 'bike:2', 'bike:3'} # Recreate the set so this example runs on its own. r.delete("bikes:racing:france") r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3") res11 = r.sismember("bikes:racing:france", "bike:1") print(res11) # >>> 1 res12 = r.smismember("bikes:racing:france", "bike:2", "bike:3", "bike:4") print(res12) # >>> [1, 1, 0] r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3") r.sadd("bikes:racing:usa", "bike:1", "bike:4") res13 = r.sdiff("bikes:racing:france", "bikes:racing:usa") print(res13) # >>> {'bike:2', 'bike:3'} r.delete("bikes:racing:france") r.delete("bikes:racing:usa") r.delete("bikes:racing:italy") r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3") r.sadd("bikes:racing:usa", "bike:1", "bike:4") r.sadd("bikes:racing:italy", "bike:1", "bike:2", "bike:3", "bike:4") res13 = r.sinter("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy") print(res13) # >>> {'bike:1'} res14 = r.sunion("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy") print(res14) # >>> {'bike:1', 'bike:2', 'bike:3', 'bike:4'} res15 = r.sdiff("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy") print(res15) # >>> set() res16 = r.sdiff("bikes:racing:usa", "bikes:racing:france") print(res16) # >>> {'bike:4'} res17 = r.sdiff("bikes:racing:france", "bikes:racing:usa") print(res17) # >>> {'bike:2', 'bike:3'} r.delete("bikes:racing:france") r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3", "bike:4", "bike:5") res18 = r.srem("bikes:racing:france", "bike:1") print(res18) # >>> 1 res19 = r.spop("bikes:racing:france") print(res19) # >>> bike:3 res20 = r.smembers("bikes:racing:france") print(res20) # >>> {'bike:2', 'bike:4', 'bike:5'} res21 = r.srandmember("bikes:racing:france") print(res21) # >>> bike:4const res1 = await client.sAdd('bikes:racing:france', 'bike:1') console.log(res1) // >>> 1 const res2 = await client.sAdd('bikes:racing:france', 'bike:1') console.log(res2) // >>> 0 const res3 = await client.sAdd('bikes:racing:france', ['bike:2', 'bike:3']) console.log(res3) // >>> 2 const res4 = await client.sAdd('bikes:racing:usa', ['bike:1', 'bike:4']) console.log(res4) // >>> 2import { createClient } from 'redis'; const client = createClient(); await client.connect(); const res1 = await client.sAdd('bikes:racing:france', 'bike:1') console.log(res1) // >>> 1 const res2 = await client.sAdd('bikes:racing:france', 'bike:1') console.log(res2) // >>> 0 const res3 = await client.sAdd('bikes:racing:france', ['bike:2', 'bike:3']) console.log(res3) // >>> 2 const res4 = await client.sAdd('bikes:racing:usa', ['bike:1', 'bike:4']) console.log(res4) // >>> 2 await client.del('bikes:racing:france') await client.del('bikes:racing:usa') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) await client.sAdd('bikes:racing:usa', ['bike:1', 'bike:4']) const res5 = await client.sIsMember('bikes:racing:usa', 'bike:1') console.log(res5) // >>> 1 const res6 = await client.sIsMember('bikes:racing:usa', 'bike:2') console.log(res6) // >>> 0 await client.del('bikes:racing:france') await client.del('bikes:racing:usa') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) await client.sAdd('bikes:racing:usa', ['bike:1', 'bike:4']) const res7 = await client.sInter(['bikes:racing:france', 'bikes:racing:usa']) console.log(res7) // >>> {'bike:1'} await client.del('bikes:racing:france') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) const res8 = await client.sCard('bikes:racing:france') console.log(res8) // >>> 3 await client.del('bikes:racing:france') const res9 = await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) console.log(res9) // >>> 3 const res10 = await client.sMembers('bikes:racing:france') console.log(res10) // >>> ['bike:1', 'bike:2', 'bike:3'] // Recreate the set so this example runs on its own. await client.del('bikes:racing:france') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) const res11 = await client.sIsMember('bikes:racing:france', 'bike:1') console.log(res11) // >>> 1 const res12 = await client.smIsMember('bikes:racing:france', ['bike:2', 'bike:3', 'bike:4']) console.log(res12) // >>> [1, 1, 0] await client.del('bikes:racing:france') await client.del('bikes:racing:usa') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) await client.sAdd('bikes:racing:usa', ['bike:1', 'bike:4']) const res13 = await client.sDiff(['bikes:racing:france', 'bikes:racing:usa']) console.log(res13) // >>> [ 'bike:2', 'bike:3' ] await client.del('bikes:racing:france') await client.del('bikes:racing:usa') await client.del('bikes:racing:italy') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) await client.sAdd('bikes:racing:usa', ['bike:1', 'bike:4']) await client.sAdd('bikes:racing:italy', ['bike:1', 'bike:2', 'bike:3', 'bike:4']) const res14 = await client.sInter( ['bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy'] ) console.log(res14) // >>> ['bike:1'] const res15 = await client.sUnion( ['bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy'] ) console.log(res15) // >>> ['bike:1', 'bike:2', 'bike:3', 'bike:4'] const res16 = await client.sDiff(['bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy']) console.log(res16) // >>> [] const res17 = await client.sDiff(['bikes:racing:usa', 'bikes:racing:france']) console.log(res17) // >>> ['bike:4'] const res18 = await client.sDiff(['bikes:racing:france', 'bikes:racing:usa']) console.log(res18) // >>> ['bike:2', 'bike:3'] await client.del('bikes:racing:france') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3', 'bike:4', 'bike:5']) const res19 = await client.sRem('bikes:racing:france', 'bike:1') console.log(res19) // >>> 1 const res20 = await client.sPop('bikes:racing:france') console.log(res20) // >>> bike:3 or other random value const res21 = await client.sMembers('bikes:racing:france') console.log(res21) // >>> ['bike:2', 'bike:4', 'bike:5']; depends on previous result const res22 = await client.sRandMember('bikes:racing:france') console.log(res22) // >>> bike:4 or other random valuelong res1 = jedis.sadd("bikes:racing:france", "bike:1"); System.out.println(res1); // >>> 1 long res2 = jedis.sadd("bikes:racing:france", "bike:1"); System.out.println(res2); // >>> 0 long res3 = jedis.sadd("bikes:racing:france", "bike:2", "bike:3"); System.out.println(res3); // >>> 2 long res4 = jedis.sadd("bikes:racing:usa", "bike:1", "bike:4"); System.out.println(res4); // >>> 2import redis.clients.jedis.UnifiedJedis; import java.util.List; import java.util.Set; public class SetsExample { public void run() { UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379"); long res1 = jedis.sadd("bikes:racing:france", "bike:1"); System.out.println(res1); // >>> 1 long res2 = jedis.sadd("bikes:racing:france", "bike:1"); System.out.println(res2); // >>> 0 long res3 = jedis.sadd("bikes:racing:france", "bike:2", "bike:3"); System.out.println(res3); // >>> 2 long res4 = jedis.sadd("bikes:racing:usa", "bike:1", "bike:4"); System.out.println(res4); // >>> 2 jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3"); jedis.sadd("bikes:racing:usa", "bike:1", "bike:4"); boolean res5 = jedis.sismember("bikes:racing:usa", "bike:1"); System.out.println(res5); // >>> true boolean res6 = jedis.sismember("bikes:racing:usa", "bike:2"); System.out.println(res6); // >>> false jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3"); jedis.sadd("bikes:racing:usa", "bike:1", "bike:4"); Set<String> res7 = jedis.sinter("bikes:racing:france", "bikes:racing:usa"); System.out.println(res7); // >>> [bike:1] jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3"); long res8 = jedis.scard("bikes:racing:france"); System.out.println(res8); // >>> 3 jedis.del("bikes:racing:france"); long res9 = jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3"); System.out.println(res9); // >>> 3 Set<String> res10 = jedis.smembers("bikes:racing:france"); System.out.println(res10); // >>> [bike:1, bike:2, bike:3] // Recreate the set so this example runs on its own. jedis.del("bikes:racing:france"); jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3"); boolean res11 = jedis.sismember("bikes:racing:france", "bike:1"); System.out.println(res11); // >>> true List<Boolean> res12 = jedis.smismember("bikes:racing:france", "bike:2", "bike:3", "bike:4"); System.out.println(res12); // >>> [true,true,false] jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3"); jedis.sadd("bikes:racing:usa", "bike:1", "bike:4"); Set<String> res13 = jedis.sdiff("bikes:racing:france", "bikes:racing:usa"); System.out.println(res13); // >>> [bike:2, bike:3] jedis.del("bikes:racing:france"); jedis.del("bikes:racing:usa"); jedis.del("bikes:racing:italy"); jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3"); jedis.sadd("bikes:racing:usa", "bike:1", "bike:4"); jedis.sadd("bikes:racing:italy", "bike:1", "bike:2", "bike:3", "bike:4"); Set<String> res14 = jedis.sinter("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"); System.out.println(res14); // >>> [bike:1] Set<String> res15 = jedis.sunion("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"); System.out.println(res15); // >>> [bike:1, bike:2, bike:3, bike:4] Set<String> res16 = jedis.sdiff("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"); System.out.println(res16); // >>> [] Set<String> res17 = jedis.sdiff("bikes:racing:usa", "bikes:racing:france"); System.out.println(res17); // >>> [bike:4] Set<String> res18 = jedis.sdiff("bikes:racing:france", "bikes:racing:usa"); System.out.println(res18); // >>> [bike:2, bike:3] jedis.del("bikes:racing:france"); jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3", "bike:4", "bike:5"); long res19 = jedis.srem("bikes:racing:france", "bike:1"); System.out.println(res18); // >>> 1 String res20 = jedis.spop("bikes:racing:france"); System.out.println(res20); // >>> bike:3 Set<String> res21 = jedis.smembers("bikes:racing:france"); System.out.println(res21); // >>> [bike:2, bike:4, bike:5] String res22 = jedis.srandmember("bikes:racing:france"); System.out.println(res22); // >>> bike:4 jedis.close(); } }-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: byte[],
- members: byte[]...
-
sadd(
- key: String,
- members: String...
-
sadd(
CompletableFuture<Void> sAdd = asyncCommands.sadd("bikes:racing:france", "bike:1").thenCompose(res1 -> { System.out.println(res1); // >>> 1 return asyncCommands.sadd("bikes:racing:france", "bike:1"); }).thenCompose(res2 -> { System.out.println(res2); // >>> 0 return asyncCommands.sadd("bikes:racing:france", "bike:2", "bike:3"); }).thenCompose(res3 -> { System.out.println(res3); // >>> 2 return asyncCommands.sadd("bikes:racing:usa", "bike:1", "bike:4"); }).thenAccept(res4 -> { System.out.println(res4); // >>> 2 }).toCompletableFuture();package io.redis.examples.async; import io.lettuce.core.*; import io.lettuce.core.api.async.RedisAsyncCommands; import io.lettuce.core.api.StatefulRedisConnection; import java.util.*; import java.util.concurrent.CompletableFuture; public class SetExample { public void run() { RedisClient redisClient = RedisClient.create("redis://localhost:6379"); try (StatefulRedisConnection<String, String> connection = redisClient.connect()) { RedisAsyncCommands<String, String> asyncCommands = connection.async(); CompletableFuture<Void> sAdd = asyncCommands.sadd("bikes:racing:france", "bike:1").thenCompose(res1 -> { System.out.println(res1); // >>> 1 return asyncCommands.sadd("bikes:racing:france", "bike:1"); }).thenCompose(res2 -> { System.out.println(res2); // >>> 0 return asyncCommands.sadd("bikes:racing:france", "bike:2", "bike:3"); }).thenCompose(res3 -> { System.out.println(res3); // >>> 2 return asyncCommands.sadd("bikes:racing:usa", "bike:1", "bike:4"); }).thenAccept(res4 -> { System.out.println(res4); // >>> 2 }).toCompletableFuture(); sAdd.join(); CompletableFuture<Void> sIsMember = asyncCommands.sismember("bikes:racing:usa", "bike:1").thenCompose(res5 -> { System.out.println(res5); // >>> true return asyncCommands.sismember("bikes:racing:usa", "bike:2"); }).thenAccept(res6 -> { System.out.println(res6); // >>> false }).toCompletableFuture(); CompletableFuture<Void> sInter = asyncCommands.sinter("bikes:racing:france", "bikes:racing:usa") .thenAccept(res7 -> { System.out.println(res7); // >>> [bike:1] }).toCompletableFuture(); CompletableFuture<Void> sCard = asyncCommands.scard("bikes:racing:france").thenAccept(res8 -> { System.out.println(res8); // >>> 3 }).toCompletableFuture(); CompletableFuture.allOf(sIsMember, sInter, sCard).join(); CompletableFuture<Void> sAddSMembers = asyncCommands.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3") .thenCompose(res9 -> { System.out.println(res9); // >>> 3 return asyncCommands.smembers("bikes:racing:france"); }).thenAccept(res10 -> { System.out.println(res10); // >>> [bike:1, bike:2, bike:3] }).toCompletableFuture(); sAddSMembers.join(); // Recreate the set so this example runs on its own. The chain is // ordered, so the DEL + SADD complete before the reads below. CompletableFuture<Void> sMIsMember = asyncCommands.del("bikes:racing:france") .thenCompose(d -> asyncCommands.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3")) .thenCompose(a -> asyncCommands.sismember("bikes:racing:france", "bike:1")).thenCompose(res11 -> { System.out.println(res11); // >>> true return asyncCommands.smismember("bikes:racing:france", "bike:2", "bike:3", "bike:4"); }).thenAccept(res12 -> { System.out.println(res12); // >>> [true, true, false] }).toCompletableFuture(); sMIsMember.join(); CompletableFuture<Void> sDiff = asyncCommands.sdiff("bikes:racing:france", "bikes:racing:usa") .thenAccept(res13 -> { System.out.println(res13); // >>> [bike:2, bike:3] }).toCompletableFuture(); sDiff.join(); CompletableFuture<Void> multisets = asyncCommands.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3") .thenCompose(res14 -> { System.out.println(res14); // >>> 0 return asyncCommands.sadd("bikes:racing:usa", "bike:1", "bike:4"); }).thenCompose(res15 -> { System.out.println(res15); // >>> 0 return asyncCommands.sadd("bikes:racing:italy", "bike:1", "bike:2", "bike:3", "bike:4"); }).thenCompose(res16 -> { System.out.println(res16); // >>> 4 return asyncCommands.sinter("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"); }).thenCompose(res17 -> { System.out.println(res17); // >>> [bike:1] return asyncCommands.sunion("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"); }).thenCompose(res18 -> { System.out.println(res18); // >>> [bike:1, bike:2, bike:3, bike:4] return asyncCommands.sdiff("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"); }).thenCompose(res19 -> { System.out.println(res19); // >>> [] return asyncCommands.sdiff("bikes:racing:usa", "bikes:racing:france"); }).thenCompose(res20 -> { System.out.println(res20); // >>> [bike:4] return asyncCommands.sdiff("bikes:racing:france", "bikes:racing:usa"); }).thenAccept(res21 -> { System.out.println(res21); // >>> [bike:2, bike:3] }).toCompletableFuture(); multisets.join(); CompletableFuture<Void> sRem = asyncCommands .sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3", "bike:4", "bike:5").thenCompose(res22 -> { System.out.println(res22); // >>> 2 return asyncCommands.srem("bikes:racing:france", "bike:1"); }).thenCompose(res23 -> { System.out.println(res23); // >>> 1 return asyncCommands.spop("bikes:racing:france"); }).thenCompose(res24 -> { System.out.println(res24); // >>> bike:3 (for example) return asyncCommands.smembers("bikes:racing:france"); }).thenCompose(res25 -> { System.out.println(res25); // >>> [bike:2, bike:4, bike:5] (for example) return asyncCommands.srandmember("bikes:racing:france"); }).thenAccept(res26 -> { System.out.println(res26); // >>> bike:4 (for example) }).toCompletableFuture(); sRem.join(); } finally { redisClient.shutdown(); } } }-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: K, // the key.
- members: V... // the member type: value.
-
sadd(
Mono<Void> sAdd = reactiveCommands.sadd("bikes:racing:france", "bike:1").doOnNext(result -> { System.out.println(result); // >>> 1 }).flatMap(v -> reactiveCommands.sadd("bikes:racing:france", "bike:1")).doOnNext(result -> { System.out.println(result); // >>> 0 }).flatMap(v -> reactiveCommands.sadd("bikes:racing:france", "bike:2", "bike:3")).doOnNext(result -> { System.out.println(result); // >>> 2 }).flatMap(v -> reactiveCommands.sadd("bikes:racing:usa", "bike:1", "bike:4")).doOnNext(result -> { System.out.println(result); // >>> 2 }).then();package io.redis.examples.reactive; import io.lettuce.core.*; import io.lettuce.core.api.reactive.RedisReactiveCommands; import io.lettuce.core.api.StatefulRedisConnection; import reactor.core.publisher.Mono; import java.util.*; public class SetExample { public void run() { RedisClient redisClient = RedisClient.create("redis://localhost:6379"); try (StatefulRedisConnection<String, String> connection = redisClient.connect()) { RedisReactiveCommands<String, String> reactiveCommands = connection.reactive(); Mono<Void> sAdd = reactiveCommands.sadd("bikes:racing:france", "bike:1").doOnNext(result -> { System.out.println(result); // >>> 1 }).flatMap(v -> reactiveCommands.sadd("bikes:racing:france", "bike:1")).doOnNext(result -> { System.out.println(result); // >>> 0 }).flatMap(v -> reactiveCommands.sadd("bikes:racing:france", "bike:2", "bike:3")).doOnNext(result -> { System.out.println(result); // >>> 2 }).flatMap(v -> reactiveCommands.sadd("bikes:racing:usa", "bike:1", "bike:4")).doOnNext(result -> { System.out.println(result); // >>> 2 }).then(); sAdd.block(); Mono<Boolean> sIsMember1 = reactiveCommands.sismember("bikes:racing:usa", "bike:1").doOnNext(result -> { System.out.println(result); // >>> true }); Mono<Boolean> sIsMember2 = reactiveCommands.sismember("bikes:racing:usa", "bike:2").doOnNext(result -> { System.out.println(result); // >>> false }); Mono<List<String>> sInter = reactiveCommands.sinter("bikes:racing:france", "bikes:racing:usa").collectList() .doOnNext(result -> { System.out.println(result); // >>> [bike:1] }); Mono<Long> sCard = reactiveCommands.scard("bikes:racing:france").doOnNext(result -> { System.out.println(result); // >>> 3 }); Mono.when(sIsMember1, sIsMember2, sInter, sCard).block(); Mono<Void> sAddSMembers = reactiveCommands.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3") .doOnNext(result -> { System.out.println(result); // >>> 3 }).flatMap(v -> reactiveCommands.smembers("bikes:racing:france").collectList()).doOnNext(result -> { System.out.println(result); // >>> [bike:1, bike:2, bike:3] }).then(); sAddSMembers.block(); // Recreate the set so this example runs on its own. Block it // sequentially: a DEL inside the shared Mono.when() below would // race the sibling reads on the same key. reactiveCommands.del("bikes:racing:france") .then(reactiveCommands.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3")) .block(); Mono<Boolean> sIsMember3 = reactiveCommands.sismember("bikes:racing:france", "bike:1").doOnNext(result -> { System.out.println(result); // >>> true }); Mono<List<Boolean>> sMIsMember = reactiveCommands.smismember("bikes:racing:france", "bike:2", "bike:3", "bike:4") .collectList().doOnNext(result -> { System.out.println(result); // >>> [true, true, false] }); Mono<List<String>> sDiff = reactiveCommands.sdiff("bikes:racing:france", "bikes:racing:usa").collectList() .doOnNext(result -> { System.out.println(result); // >>> [bike:2, bike:3] }); Mono.when(sIsMember3, sMIsMember, sDiff).block(); Mono<Void> add3sets = reactiveCommands.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3") .doOnNext(result -> { System.out.println(result); // >>> 0 }).flatMap(v -> reactiveCommands.sadd("bikes:racing:usa", "bike:1", "bike:4")).doOnNext(result -> { System.out.println(result); // >>> 0 }).flatMap(v -> reactiveCommands.sadd("bikes:racing:italy", "bike:1", "bike:2", "bike:3", "bike:4")) .doOnNext(result -> { System.out.println(result); // >>> 4, }).then(); add3sets.block(); Mono<List<String>> multisets1 = reactiveCommands .sinter("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy").collectList().doOnNext(result -> { System.out.println(result); // >>> [bike:1] }); Mono<List<String>> multisets2 = reactiveCommands .sunion("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy").collectList().doOnNext(result -> { System.out.println(result); // >>> [bike:1, bike:2, bike:3, bike:4] }); Mono<List<String>> multisets3 = reactiveCommands .sdiff("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy").collectList().doOnNext(result -> { System.out.println(result); // >>> [] }); Mono<List<String>> multisets4 = reactiveCommands.sdiff("bikes:racing:usa", "bikes:racing:france").collectList() .doOnNext(result -> { System.out.println(result); // >>> [bike:4] }); Mono<List<String>> multisets5 = reactiveCommands.sdiff("bikes:racing:france", "bikes:racing:usa").collectList() .doOnNext(result -> { System.out.println(result); // >>> [bike:2, bike:3] }); Mono.when(multisets1, multisets2, multisets3, multisets4, multisets5).block(); Mono<Void> sRem = reactiveCommands.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3", "bike:4", "bike:5") .doOnNext(result -> { System.out.println(result); // >>> 2 }).flatMap(v -> reactiveCommands.srem("bikes:racing:france", "bike:1")).doOnNext(result -> { System.out.println(result); // >>> 1 }).flatMap(v -> reactiveCommands.spop("bikes:racing:france")).doOnNext(result -> { System.out.println(result); // >>> bike:3 (for example) }).flatMap(v -> reactiveCommands.smembers("bikes:racing:france").collectList()).doOnNext(result -> { System.out.println(result); // >>> [bike:2, bike:4, bike:5] (for example) }).flatMap(v -> reactiveCommands.srandmember("bikes:racing:france")).doOnNext(result -> { System.out.println(result); // >>> bike:4 (for example) }).then(); sRem.block(); } finally { redisClient.shutdown(); } } }-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: K, // the key.
- members: V... // the member type: value.
-
sadd(
res1, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1").Result() if err != nil { panic(err) } fmt.Println(res1) // >>> 1 res2, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1").Result() if err != nil { panic(err) } fmt.Println(res2) // >>> 0 res3, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:2", "bike:3").Result() if err != nil { panic(err) } fmt.Println(res3) // >>> 2 res4, err := rdb.SAdd(ctx, "bikes:racing:usa", "bike:1", "bike:4").Result() if err != nil { panic(err) } fmt.Println(res4) // >>> 2package example_commands_test import ( "context" "fmt" "sort" "github.com/redis/go-redis/v9" ) func ExampleClient_sadd() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) res1, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1").Result() if err != nil { panic(err) } fmt.Println(res1) // >>> 1 res2, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1").Result() if err != nil { panic(err) } fmt.Println(res2) // >>> 0 res3, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:2", "bike:3").Result() if err != nil { panic(err) } fmt.Println(res3) // >>> 2 res4, err := rdb.SAdd(ctx, "bikes:racing:usa", "bike:1", "bike:4").Result() if err != nil { panic(err) } fmt.Println(res4) // >>> 2 } func ExampleClient_sismember() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) _, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1", "bike:2", "bike:3").Result() if err != nil { panic(err) } _, err = rdb.SAdd(ctx, "bikes:racing:usa", "bike:1", "bike:4").Result() if err != nil { panic(err) } res5, err := rdb.SIsMember(ctx, "bikes:racing:usa", "bike:1").Result() if err != nil { panic(err) } fmt.Println(res5) // >>> true res6, err := rdb.SIsMember(ctx, "bikes:racing:usa", "bike:2").Result() if err != nil { panic(err) } fmt.Println(res6) // >>> false } func ExampleClient_sinter() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) _, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1", "bike:2", "bike:3").Result() if err != nil { panic(err) } _, err = rdb.SAdd(ctx, "bikes:racing:usa", "bike:1", "bike:4").Result() if err != nil { panic(err) } res7, err := rdb.SInter(ctx, "bikes:racing:france", "bikes:racing:usa").Result() if err != nil { panic(err) } fmt.Println(res7) // >>> [bike:1] } func ExampleClient_scard() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) _, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1", "bike:2", "bike:3").Result() if err != nil { panic(err) } res8, err := rdb.SCard(ctx, "bikes:racing:france").Result() if err != nil { panic(err) } fmt.Println(res8) // >>> 3 } func ExampleClient_saddsmembers() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) rdb.Del(ctx, "bikes:racing:france") res9, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1", "bike:2", "bike:3").Result() if err != nil { panic(err) } fmt.Println(res9) // >>> 3 res10, err := rdb.SMembers(ctx, "bikes:racing:france").Result() if err != nil { panic(err) } // Sort the strings in the slice to make sure the output is lexicographical sort.Strings(res10) fmt.Println(res10) // >>> [bike:1 bike:2 bike:3] } func ExampleClient_smismember() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) _, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1", "bike:2", "bike:3").Result() if err != nil { panic(err) } res11, err := rdb.SIsMember(ctx, "bikes:racing:france", "bike:1").Result() if err != nil { panic(err) } fmt.Println(res11) // >>> true res12, err := rdb.SMIsMember(ctx, "bikes:racing:france", "bike:2", "bike:3", "bike:4").Result() if err != nil { panic(err) } fmt.Println(res12) // >>> [true true false] } func ExampleClient_sdiff() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) _, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1", "bike:2", "bike:3").Result() if err != nil { panic(err) } _, err = rdb.SAdd(ctx, "bikes:racing:usa", "bike:1", "bike:4").Result() res13, err := rdb.SDiff(ctx, "bikes:racing:france", "bikes:racing:usa").Result() if err != nil { panic(err) } // Sort the strings in the slice to make sure the output is lexicographical sort.Strings(res13) fmt.Println(res13) // >>> [bike:2 bike:3] } func ExampleClient_multisets() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) rdb.Del(ctx, "bikes:racing:france") rdb.Del(ctx, "bikes:racing:usa") rdb.Del(ctx, "bikes:racing:italy") _, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1", "bike:2", "bike:3").Result() if err != nil { panic(err) } _, err = rdb.SAdd(ctx, "bikes:racing:usa", "bike:1", "bike:4").Result() if err != nil { panic(err) } _, err = rdb.SAdd(ctx, "bikes:racing:italy", "bike:1", "bike:2", "bike:3", "bike:4").Result() if err != nil { panic(err) } res14, err := rdb.SInter(ctx, "bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy").Result() if err != nil { panic(err) } fmt.Println(res14) // >>> [bike:1] res15, err := rdb.SUnion(ctx, "bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy").Result() if err != nil { panic(err) } // Sort the strings in the slice to make sure the output is lexicographical sort.Strings(res15) fmt.Println(res15) // >>> [bike:1 bike:2 bike:3 bike:4] res16, err := rdb.SDiff(ctx, "bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy").Result() if err != nil { panic(err) } fmt.Println(res16) // >>> [] res17, err := rdb.SDiff(ctx, "bikes:racing:usa", "bikes:racing:france").Result() if err != nil { panic(err) } fmt.Println(res17) // >>> [bike:4] res18, err := rdb.SDiff(ctx, "bikes:racing:france", "bikes:racing:usa").Result() if err != nil { panic(err) } // Sort the strings in the slice to make sure the output is lexicographical sort.Strings(res18) fmt.Println(res18) // >>> [bike:2 bike:3] } func ExampleClient_srem() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) rdb.Del(ctx, "bikes:racing:france") _, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1", "bike:2", "bike:3", "bike:4", "bike:5").Result() if err != nil { panic(err) } res19, err := rdb.SRem(ctx, "bikes:racing:france", "bike:1").Result() if err != nil { panic(err) } fmt.Println(res19) // >>> 1 res20, err := rdb.SPop(ctx, "bikes:racing:france").Result() if err != nil { panic(err) } fmt.Println(res20) // >>> <random element> res21, err := rdb.SMembers(ctx, "bikes:racing:france").Result() if err != nil { panic(err) } fmt.Println(res21) // >>> <remaining elements> res22, err := rdb.SRandMember(ctx, "bikes:racing:france").Result() if err != nil { panic(err) } fmt.Println(res22) // >>> <random element> // Testable examples not available because the test output // is not deterministic. }long res1 = db.SetAdd("bikes:racing:france", ["bike:1"]); Console.WriteLine(res1); // >>> 1 long res2 = db.SetAdd("bikes:racing:france", ["bike:1"]); Console.WriteLine(res2); // >>> 0 long res3 = db.SetAdd("bikes:racing:france", ["bike:2", "bike:3"]); Console.WriteLine(res3); // >>> 2 long res4 = db.SetAdd("bikes:racing:usa", ["bike:1", "bike:4"]); Console.WriteLine(res4); // >>> 2using StackExchange.Redis; public class SetsExample { public void Run() { var muxer = ConnectionMultiplexer.Connect("localhost:6379"); var db = muxer.GetDatabase(); long res1 = db.SetAdd("bikes:racing:france", ["bike:1"]); Console.WriteLine(res1); // >>> 1 long res2 = db.SetAdd("bikes:racing:france", ["bike:1"]); Console.WriteLine(res2); // >>> 0 long res3 = db.SetAdd("bikes:racing:france", ["bike:2", "bike:3"]); Console.WriteLine(res3); // >>> 2 long res4 = db.SetAdd("bikes:racing:usa", ["bike:1", "bike:4"]); Console.WriteLine(res4); // >>> 2 // Tests for 'sadd' step. bool res5 = db.SetContains("bikes:racing:france", "bike:1"); Console.WriteLine(res5); // >>> True bool res6 = db.SetContains("bikes:racing:usa", "bike:2"); Console.WriteLine(res6); // >>> False // Tests for 'sismember' step. long res7 = db.SetAdd("{bikes:racing}:france", ["bike:1", "bike:2", "bike:3"]); long res8 = db.SetAdd("{bikes:racing}:usa", ["bike:1", "bike:4"]); RedisValue[] res9 = db.SetCombine(SetOperation.Intersect, ["{bikes:racing}:france", "{bikes:racing}:usa"]); Console.WriteLine(string.Join(", ", res9)); // >>> bike:1 // Tests for 'sinter' step. long res10 = db.SetAdd("bikes:racing:france", ["bike:1", "bike:2", "bike:3"]); long res11 = db.SetLength("bikes:racing:france"); Console.WriteLine(res11); // >>> 3 // Tests for 'scard' step. db.KeyDelete("bikes:racing:france"); long res12 = db.SetAdd("bikes:racing:france", ["bike:1", "bike:2", "bike:3"]); RedisValue[] res13 = db.SetMembers("bikes:racing:france"); Console.WriteLine(string.Join(", ", res13)); // >>> bike:3, bike:2, bike:1 // Tests for 'sadd_smembers' step. // Recreate the set so this example runs on its own. db.KeyDelete("bikes:racing:france"); db.SetAdd("bikes:racing:france", ["bike:1", "bike:2", "bike:3"]); bool res14 = db.SetContains("bikes:racing:france", "bike:1"); Console.WriteLine(res14); // >>> true bool[] res15 = db.SetContains("bikes:racing:france", ["bike:2", "bike:3", "bike:4"]); Console.WriteLine(string.Join(", ", res15)); // >>> True, True, False // Tests for 'smismember' step. long res16 = db.SetAdd("{bikes:racing}:france", ["bike:1", "bike:2", "bike:3"]); long res17 = db.SetAdd("{bikes:racing}:usa", ["bike:1", "bike:4"]); RedisValue[] res18 = db.SetCombine(SetOperation.Difference, ["{bikes:racing}:france", "{bikes:racing}:usa"]); Console.WriteLine(string.Join(", ", res18)); // >>> bike:2, bike:3 // Tests for 'sdiff' step. db.KeyDelete("{bikes:racing}:france"); db.KeyDelete("{bikes:racing}:usa"); db.KeyDelete("{bikes:racing}:italy"); long res19 = db.SetAdd("{bikes:racing}:france", ["bike:1", "bike:2", "bike:3"]); long res20 = db.SetAdd("{bikes:racing}:usa", ["bike:1", "bike:4"]); long res21 = db.SetAdd("{bikes:racing}:italy", ["bike:1", "bike:2", "bike:3", "bike:4"]); RedisValue[] res22 = db.SetCombine(SetOperation.Intersect, ["{bikes:racing}:france", "{bikes:racing}:usa", "{bikes:racing}:italy" ]); Console.WriteLine(string.Join(", ", res22)); // >>> bike:1 RedisValue[] res23 = db.SetCombine(SetOperation.Union, ["{bikes:racing}:france", "{bikes:racing}:usa", "{bikes:racing}:italy" ]); Console.WriteLine(string.Join(", ", res23)); // >>> bike:1, bike:2, bike:3, bike:4 RedisValue[] res24 = db.SetCombine(SetOperation.Difference, ["{bikes:racing}:france", "{bikes:racing}:usa", "{bikes:racing}:italy" ]); Console.WriteLine(string.Join(", ", res24)); // >>> <empty set> RedisValue[] res25 = db.SetCombine(SetOperation.Difference, ["{bikes:racing}:usa", "{bikes:racing}:france"]); Console.WriteLine(string.Join(", ", res25)); // >>> bike:4 RedisValue[] res26 = db.SetCombine(SetOperation.Difference, ["{bikes:racing}:france", "{bikes:racing}:usa"]); Console.WriteLine(string.Join(", ", res26)); // >>> bike:2, bike:3 // Tests for 'multisets' step. db.KeyDelete("bikes:racing:france"); long res27 = db.SetAdd("bikes:racing:france", ["bike:1", "bike:2", "bike:3", "bike:4", "bike:5"]); bool res28 = db.SetRemove("bikes:racing:france", "bike:1"); Console.WriteLine(res28); // >>> True RedisValue res29 = db.SetPop("bikes:racing:france"); Console.WriteLine(res29); // >>> bike:3 RedisValue[] res30 = db.SetMembers("bikes:racing:france"); Console.WriteLine(string.Join(", ", res30)); // >>> bike:2, bike:4, bike:5 RedisValue res31 = db.SetRandomMember("bikes:racing:france"); Console.WriteLine(res31); // >>> bike:4 // Tests for 'srem' step. } }-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
SetAdd(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The values to add to the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The values to add to the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
$res1 = $r->sadd('bikes:racing:france', ['bike:1']); echo $res1 . PHP_EOL; // >>> 1 $res2 = $r->sadd('bikes:racing:france', ['bike:1']); echo $res2 . PHP_EOL; // >>> 0 $res3 = $r->sadd('bikes:racing:france', ['bike:2', 'bike:3']); echo $res3 . PHP_EOL; // >>> 2 $res4 = $r->sadd('bikes:racing:usa', ['bike:1', 'bike:4']); echo $res4 . PHP_EOL; // >>> 2<?php require 'vendor/autoload.php'; use Predis\Client as PredisClient; class DtSetsTest { public function testDtSet() { $r = new PredisClient([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379, 'password' => '', 'database' => 0, ]); $res1 = $r->sadd('bikes:racing:france', ['bike:1']); echo $res1 . PHP_EOL; // >>> 1 $res2 = $r->sadd('bikes:racing:france', ['bike:1']); echo $res2 . PHP_EOL; // >>> 0 $res3 = $r->sadd('bikes:racing:france', ['bike:2', 'bike:3']); echo $res3 . PHP_EOL; // >>> 2 $res4 = $r->sadd('bikes:racing:usa', ['bike:1', 'bike:4']); echo $res4 . PHP_EOL; // >>> 2 $res5 = $r->sismember('bikes:racing:usa', 'bike:1'); echo $res5 . PHP_EOL; // >>> 1 $res6 = $r->sismember('bikes:racing:usa', 'bike:2'); echo $res6 . PHP_EOL; // >>> 0 $res7 = $r->sinter(['bikes:racing:france', 'bikes:racing:usa']); echo json_encode($res7) . PHP_EOL; // >>> ["bike:1"] $res8 = $r->scard('bikes:racing:france'); echo $res8 . PHP_EOL; // >>> 3 $r->del('bikes:racing:france'); $res9 = $r->sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']); echo $res9 . PHP_EOL; // >>> 3 $res10 = $r->smembers('bikes:racing:france'); sort($res10); echo json_encode($res10) . PHP_EOL; // >>> ["bike:1","bike:2","bike:3"] // Recreate the set so this example runs on its own. $r->del('bikes:racing:france'); $r->sadd('bikes:racing:france', 'bike:1', 'bike:2', 'bike:3'); $res11 = $r->sismember('bikes:racing:france', 'bike:1'); echo $res11 . PHP_EOL; // >>> 1 $res12 = $r->smismember('bikes:racing:france', 'bike:2', 'bike:3', 'bike:4'); echo json_encode($res12) . PHP_EOL; // >>> [1,1,0] $r->sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']); $r->sadd('bikes:racing:usa', ['bike:1', 'bike:4']); $res13 = $r->sdiff(['bikes:racing:france', 'bikes:racing:usa']); sort($res13); echo json_encode($res13) . PHP_EOL; // >>> ["bike:2","bike:3"] $r->del('bikes:racing:france'); $r->del('bikes:racing:usa'); $r->del('bikes:racing:italy'); $r->sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']); $r->sadd('bikes:racing:usa', ['bike:1', 'bike:4']); $r->sadd('bikes:racing:italy', ['bike:1', 'bike:2', 'bike:3', 'bike:4']); $res14 = $r->sinter(['bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy']); echo json_encode($res14) . PHP_EOL; // >>> ["bike:1"] $res15 = $r->sunion(['bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy']); sort($res15); echo json_encode($res15) . PHP_EOL; // >>> ["bike:1","bike:2","bike:3","bike:4"] $res16 = $r->sdiff(['bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy']); echo json_encode($res16) . PHP_EOL; // >>> [] $res17 = $r->sdiff(['bikes:racing:usa', 'bikes:racing:france']); echo json_encode($res17) . PHP_EOL; // >>> ["bike:4"] $res18 = $r->sdiff(['bikes:racing:france', 'bikes:racing:usa']); sort($res18); echo json_encode($res18) . PHP_EOL; // >>> ["bike:2","bike:3"] $r->del('bikes:racing:france'); $r->sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3', 'bike:4', 'bike:5']); $res19 = $r->srem('bikes:racing:france', ['bike:1']); echo $res19 . PHP_EOL; // >>> 1 $res20 = $r->spop('bikes:racing:france'); echo $res20 . PHP_EOL; // >>> bike:3 (for example) $res21 = $r->smembers('bikes:racing:france'); sort($res21); echo json_encode($res21) . PHP_EOL; // >>> ["bike:2","bike:4","bike:5"] $res22 = $r->srandmember('bikes:racing:france'); echo $res22 . PHP_EOL; // >>> bike:4 (for example) } }res1 = r.sadd('bikes:racing:france', ['bike:1']) puts res1 # 1 res2 = r.sadd('bikes:racing:france', ['bike:1']) puts res2 # 0 res3 = r.sadd('bikes:racing:france', ['bike:2', 'bike:3']) puts res3 # 2 res4 = r.sadd('bikes:racing:usa', ['bike:1', 'bike:4']) puts res4 # 2require 'redis' r = Redis.new res1 = r.sadd('bikes:racing:france', ['bike:1']) puts res1 # 1 res2 = r.sadd('bikes:racing:france', ['bike:1']) puts res2 # 0 res3 = r.sadd('bikes:racing:france', ['bike:2', 'bike:3']) puts res3 # 2 res4 = r.sadd('bikes:racing:usa', ['bike:1', 'bike:4']) puts res4 # 2 r.del('bikes:racing:france', 'bikes:racing:usa') r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) r.sadd('bikes:racing:usa', ['bike:1', 'bike:4']) res5 = r.sismember('bikes:racing:usa', 'bike:1') puts res5 # true res6 = r.sismember('bikes:racing:usa', 'bike:2') puts res6 # false r.del('bikes:racing:france', 'bikes:racing:usa') r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) r.sadd('bikes:racing:usa', ['bike:1', 'bike:4']) res7 = r.sinter('bikes:racing:france', 'bikes:racing:usa') puts res7.inspect # ["bike:1"] r.del('bikes:racing:france') r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) res8 = r.scard('bikes:racing:france') puts res8 # 3 r.del('bikes:racing:france') res9 = r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) puts res9 # 3 res10 = r.smembers('bikes:racing:france') puts res10.sort.inspect # ["bike:1", "bike:2", "bike:3"] # Recreate the set so this example runs on its own. r.del('bikes:racing:france') r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) res11 = r.sismember('bikes:racing:france', 'bike:1') puts res11 # true res12 = r.smismember('bikes:racing:france', 'bike:2', 'bike:3', 'bike:4') puts res12.inspect # [true, true, false] r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) r.sadd('bikes:racing:usa', ['bike:1', 'bike:4']) res13 = r.sdiff('bikes:racing:france', 'bikes:racing:usa') puts res13.sort.inspect # ["bike:2", "bike:3"] r.del('bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy') r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) r.sadd('bikes:racing:usa', ['bike:1', 'bike:4']) r.sadd('bikes:racing:italy', ['bike:1', 'bike:2', 'bike:3', 'bike:4']) res14 = r.sinter('bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy') puts res14.inspect # ["bike:1"] res15 = r.sunion('bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy') puts res15.sort.inspect # ["bike:1", "bike:2", "bike:3", "bike:4"] res16 = r.sdiff('bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy') puts res16.inspect # [] res17 = r.sdiff('bikes:racing:france', 'bikes:racing:usa') puts res17.sort.inspect # ["bike:2", "bike:3"] res18 = r.sdiff('bikes:racing:usa', 'bikes:racing:france') puts res18.inspect # ["bike:4"] r.del('bikes:racing:france') r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3', 'bike:4', 'bike:5']) res19 = r.srem('bikes:racing:france', ['bike:1']) puts res19 # 1 res20 = r.spop('bikes:racing:france') puts res20 # bike:3, for example res21 = r.smembers('bikes:racing:france') puts res21.sort.inspect # Remaining members, in no particular order res22 = r.srandmember('bikes:racing:france') puts res22 # bike:4, for exampleif let Ok(res) = r.sadd("bikes:racing:france", "bike:1") { let res: usize = res; println!("{res}"); // >>> 1 } if let Ok(res) = r.sadd("bikes:racing:france", "bike:1") { let res: usize = res; println!("{res}"); // >>> 0 } if let Ok(res) = r.sadd("bikes:racing:france", &["bike:2", "bike:3"]) { let res: usize = res; println!("{res}"); // >>> 2 } if let Ok(res) = r.sadd("bikes:racing:usa", &["bike:1", "bike:4"]) { let res: usize = res; println!("{res}"); // >>> 2 }mod sets_tests { use redis::Commands; use std::collections::HashSet; fn sorted(mut values: Vec<String>) -> Vec<String> { values.sort(); values } fn sorted_set(values: HashSet<String>) -> Vec<String> { sorted(values.into_iter().collect()) } fn strings(values: &[&str]) -> Vec<String> { values.iter().map(|value| value.to_string()).collect() } fn run() { let mut r = match redis::Client::open("redis://127.0.0.1") { Ok(client) => { match client.get_connection() { Ok(conn) => conn, Err(e) => { println!("Failed to connect to Redis: {e}"); return; } } } Err(e) => { println!("Failed to create Redis client: {e}"); return; } }; if let Ok(res) = r.sadd("bikes:racing:france", "bike:1") { let res: usize = res; println!("{res}"); // >>> 1 } if let Ok(res) = r.sadd("bikes:racing:france", "bike:1") { let res: usize = res; println!("{res}"); // >>> 0 } if let Ok(res) = r.sadd("bikes:racing:france", &["bike:2", "bike:3"]) { let res: usize = res; println!("{res}"); // >>> 2 } if let Ok(res) = r.sadd("bikes:racing:usa", &["bike:1", "bike:4"]) { let res: usize = res; println!("{res}"); // >>> 2 } if let Ok(res) = r.sismember("bikes:racing:usa", "bike:1") { let res: bool = res; println!("{}", i32::from(res)); // >>> 1 } if let Ok(res) = r.sismember("bikes:racing:usa", "bike:2") { let res: bool = res; println!("{}", i32::from(res)); // >>> 0 } if let Ok(res) = r.sinter(&["bikes:racing:france", "bikes:racing:usa"]) { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:1"] } if let Ok(res) = r.scard("bikes:racing:france") { let res: usize = res; println!("{res}"); // >>> 3 } let _: usize = r.del("bikes:racing:france").unwrap_or(0); if let Ok(res) = r.sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"]) { let res: usize = res; println!("{res}"); // >>> 3 } if let Ok(res) = r.smembers("bikes:racing:france") { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:1", "bike:2", "bike:3"] } // Recreate the set so this example runs on its own. let _: usize = r.del("bikes:racing:france").unwrap_or(0); let _: usize = r .sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"]) .unwrap_or(0); if let Ok(res) = r.sismember("bikes:racing:france", "bike:1") { let res: bool = res; println!("{}", i32::from(res)); // >>> 1 } if let Ok(res) = r.smismember("bikes:racing:france", &["bike:2", "bike:3", "bike:4"]) { let res: Vec<bool> = res; let res: Vec<i32> = res.into_iter().map(i32::from).collect(); println!("{res:?}"); // >>> [1, 1, 0] } let _: usize = r.del("bikes:racing:france").unwrap_or(0); let _: usize = r.del("bikes:racing:usa").unwrap_or(0); let _: usize = r.sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"]).unwrap_or(0); let _: usize = r.sadd("bikes:racing:usa", &["bike:1", "bike:4"]).unwrap_or(0); if let Ok(res) = r.sdiff(&["bikes:racing:france", "bikes:racing:usa"]) { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:2", "bike:3"] } let _: usize = r.del(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"]).unwrap_or(0); let _: usize = r.sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"]).unwrap_or(0); let _: usize = r.sadd("bikes:racing:usa", &["bike:1", "bike:4"]).unwrap_or(0); let _: usize = r.sadd("bikes:racing:italy", &["bike:1", "bike:2", "bike:3", "bike:4"]).unwrap_or(0); if let Ok(res) = r.sinter(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"]) { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:1"] } if let Ok(res) = r.sunion(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"]) { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:1", "bike:2", "bike:3", "bike:4"] } if let Ok(res) = r.sdiff(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"]) { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> [] } if let Ok(res) = r.sdiff(&["bikes:racing:france", "bikes:racing:usa"]) { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:2", "bike:3"] } if let Ok(res) = r.sdiff(&["bikes:racing:usa", "bikes:racing:france"]) { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:4"] } let _: usize = r.del("bikes:racing:france").unwrap_or(0); let _: usize = r .sadd( "bikes:racing:france", &["bike:1", "bike:2", "bike:3", "bike:4", "bike:5"], ) .unwrap_or(0); if let Ok(res) = r.srem("bikes:racing:france", "bike:1") { let res: usize = res; println!("{res}"); // >>> 1 } if let Ok(res) = r.spop("bikes:racing:france") { let res: Option<String> = res; match res { Some(res) => println!("{res}"), // >>> bike:3 (for example) None => println!("(nil)"), } } if let Ok(res) = r.smembers("bikes:racing:france") { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:2", "bike:4", "bike:5"] (for example) } if let Ok(res) = r.srandmember("bikes:racing:france") { let res: Option<String> = res; match res { Some(res) => println!("{res}"), // >>> bike:4 (for example) None => println!("(nil)"), } } } }if let Ok(res) = r.sadd("bikes:racing:france", "bike:1").await { let res: usize = res; println!("{res}"); // >>> 1 } if let Ok(res) = r.sadd("bikes:racing:france", "bike:1").await { let res: usize = res; println!("{res}"); // >>> 0 } if let Ok(res) = r.sadd("bikes:racing:france", &["bike:2", "bike:3"]).await { let res: usize = res; println!("{res}"); // >>> 2 } if let Ok(res) = r.sadd("bikes:racing:usa", &["bike:1", "bike:4"]).await { let res: usize = res; println!("{res}"); // >>> 2 }mod tests { use redis::AsyncCommands; use std::collections::HashSet; fn sorted(mut values: Vec<String>) -> Vec<String> { values.sort(); values } fn sorted_set(values: HashSet<String>) -> Vec<String> { sorted(values.into_iter().collect()) } fn strings(values: &[&str]) -> Vec<String> { values.iter().map(|value| value.to_string()).collect() } async fn run() { let mut r = match redis::Client::open("redis://127.0.0.1") { Ok(client) => { match client.get_multiplexed_async_connection().await { Ok(conn) => conn, Err(e) => { println!("Failed to connect to Redis: {e}"); return; } } } Err(e) => { println!("Failed to create Redis client: {e}"); return; } }; if let Ok(res) = r.sadd("bikes:racing:france", "bike:1").await { let res: usize = res; println!("{res}"); // >>> 1 } if let Ok(res) = r.sadd("bikes:racing:france", "bike:1").await { let res: usize = res; println!("{res}"); // >>> 0 } if let Ok(res) = r.sadd("bikes:racing:france", &["bike:2", "bike:3"]).await { let res: usize = res; println!("{res}"); // >>> 2 } if let Ok(res) = r.sadd("bikes:racing:usa", &["bike:1", "bike:4"]).await { let res: usize = res; println!("{res}"); // >>> 2 } if let Ok(res) = r.sismember("bikes:racing:usa", "bike:1").await { let res: bool = res; println!("{}", i32::from(res)); // >>> 1 } if let Ok(res) = r.sismember("bikes:racing:usa", "bike:2").await { let res: bool = res; println!("{}", i32::from(res)); // >>> 0 } if let Ok(res) = r.sinter(&["bikes:racing:france", "bikes:racing:usa"]).await { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:1"] } if let Ok(res) = r.scard("bikes:racing:france").await { let res: usize = res; println!("{res}"); // >>> 3 } let _: usize = r.del("bikes:racing:france").await.unwrap_or(0); if let Ok(res) = r.sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"]).await { let res: usize = res; println!("{res}"); // >>> 3 } if let Ok(res) = r.smembers("bikes:racing:france").await { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:1", "bike:2", "bike:3"] } // Recreate the set so this example runs on its own. let _: usize = r.del("bikes:racing:france").await.unwrap_or(0); let _: usize = r .sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"]) .await .unwrap_or(0); if let Ok(res) = r.sismember("bikes:racing:france", "bike:1").await { let res: bool = res; println!("{}", i32::from(res)); // >>> 1 } if let Ok(res) = r .smismember("bikes:racing:france", &["bike:2", "bike:3", "bike:4"]) .await { let res: Vec<bool> = res; let res: Vec<i32> = res.into_iter().map(i32::from).collect(); println!("{res:?}"); // >>> [1, 1, 0] } let _: usize = r.del("bikes:racing:france").await.unwrap_or(0); let _: usize = r.del("bikes:racing:usa").await.unwrap_or(0); let _: usize = r .sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"]) .await .unwrap_or(0); let _: usize = r .sadd("bikes:racing:usa", &["bike:1", "bike:4"]) .await .unwrap_or(0); if let Ok(res) = r.sdiff(&["bikes:racing:france", "bikes:racing:usa"]).await { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:2", "bike:3"] } let _: usize = r .del(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"]) .await .unwrap_or(0); let _: usize = r .sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"]) .await .unwrap_or(0); let _: usize = r .sadd("bikes:racing:usa", &["bike:1", "bike:4"]) .await .unwrap_or(0); let _: usize = r .sadd("bikes:racing:italy", &["bike:1", "bike:2", "bike:3", "bike:4"]) .await .unwrap_or(0); if let Ok(res) = r .sinter(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"]) .await { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:1"] } if let Ok(res) = r .sunion(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"]) .await { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:1", "bike:2", "bike:3", "bike:4"] } if let Ok(res) = r .sdiff(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"]) .await { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> [] } if let Ok(res) = r.sdiff(&["bikes:racing:france", "bikes:racing:usa"]).await { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:2", "bike:3"] } if let Ok(res) = r.sdiff(&["bikes:racing:usa", "bikes:racing:france"]).await { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:4"] } let _: usize = r.del("bikes:racing:france").await.unwrap_or(0); let _: usize = r .sadd( "bikes:racing:france", &["bike:1", "bike:2", "bike:3", "bike:4", "bike:5"], ) .await .unwrap_or(0); if let Ok(res) = r.srem("bikes:racing:france", "bike:1").await { let res: usize = res; println!("{res}"); // >>> 1 } if let Ok(res) = r.spop("bikes:racing:france").await { let res: Option<String> = res; match res { Some(res) => println!("{res}"), // >>> bike:3 (for example) None => println!("(nil)"), } } if let Ok(res) = r.smembers("bikes:racing:france").await { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:2", "bike:4", "bike:5"] (for example) } if let Ok(res) = r.srandmember("bikes:racing:france").await { let res: Option<String> = res; match res { Some(res) => println!("{res}"), // >>> bike:4 (for example) None => println!("(nil)"), } } } } -
-
Check whether bike:1 or bike:2 are racing in the US.
Foundational: Test set membership using SISMEMBER when you need O(1) lookups (much faster than checking a list)Redis CLI guideAlso, check out our other client tools Redis Insight and Redis for VS Code.r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3") r.sadd("bikes:racing:usa", "bike:1", "bike:4") res5 = r.sismember("bikes:racing:usa", "bike:1") print(res5) # >>> 1 res6 = r.sismember("bikes:racing:usa", "bike:2") print(res6) # >>> 0await client.del('bikes:racing:france') await client.del('bikes:racing:usa') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) await client.sAdd('bikes:racing:usa', ['bike:1', 'bike:4']) const res5 = await client.sIsMember('bikes:racing:usa', 'bike:1') console.log(res5) // >>> 1 const res6 = await client.sIsMember('bikes:racing:usa', 'bike:2') console.log(res6) // >>> 0jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3"); jedis.sadd("bikes:racing:usa", "bike:1", "bike:4"); boolean res5 = jedis.sismember("bikes:racing:usa", "bike:1"); System.out.println(res5); // >>> true boolean res6 = jedis.sismember("bikes:racing:usa", "bike:2"); System.out.println(res6); // >>> false-
Determines whether a member belongs to a set.
-
sismember(
- key: byte[],
- member: byte[]
-
sismember(
- key: String,
- member: String
-
sismember(
CompletableFuture<Void> sIsMember = asyncCommands.sismember("bikes:racing:usa", "bike:1").thenCompose(res5 -> { System.out.println(res5); // >>> true return asyncCommands.sismember("bikes:racing:usa", "bike:2"); }).thenAccept(res6 -> { System.out.println(res6); // >>> false }).toCompletableFuture();-
Determines whether a member belongs to a set.
-
sismember(
- key: K, // the key.
- member: V // the member type: value.
-
sismember(
Mono<Boolean> sIsMember1 = reactiveCommands.sismember("bikes:racing:usa", "bike:1").doOnNext(result -> { System.out.println(result); // >>> true }); Mono<Boolean> sIsMember2 = reactiveCommands.sismember("bikes:racing:usa", "bike:2").doOnNext(result -> { System.out.println(result); // >>> false });-
Determines whether a member belongs to a set.
-
sismember(
- key: K, // the key.
- member: V // the member type: value.
-
sismember(
res5, err := rdb.SIsMember(ctx, "bikes:racing:usa", "bike:1").Result() if err != nil { panic(err) } fmt.Println(res5) // >>> true res6, err := rdb.SIsMember(ctx, "bikes:racing:usa", "bike:2").Result() if err != nil { panic(err) } fmt.Println(res6) // >>> falsebool res5 = db.SetContains("bikes:racing:france", "bike:1"); Console.WriteLine(res5); // >>> True bool res6 = db.SetContains("bikes:racing:usa", "bike:2"); Console.WriteLine(res6); // >>> False-
Determines whether a member belongs to a set.
-
SetContains(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetContains(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The members to check for.
- flags: CommandFlags // The flags to use for this operation.
-
SetContains(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetContains(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The members to check for.
- flags: CommandFlags // The flags to use for this operation.
-
SetContains(
$res5 = $r->sismember('bikes:racing:usa', 'bike:1'); echo $res5 . PHP_EOL; // >>> 1 $res6 = $r->sismember('bikes:racing:usa', 'bike:2'); echo $res6 . PHP_EOL; // >>> 0r.del('bikes:racing:france', 'bikes:racing:usa') r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) r.sadd('bikes:racing:usa', ['bike:1', 'bike:4']) res5 = r.sismember('bikes:racing:usa', 'bike:1') puts res5 # true res6 = r.sismember('bikes:racing:usa', 'bike:2') puts res6 # falseif let Ok(res) = r.sismember("bikes:racing:usa", "bike:1") { let res: bool = res; println!("{}", i32::from(res)); // >>> 1 } if let Ok(res) = r.sismember("bikes:racing:usa", "bike:2") { let res: bool = res; println!("{}", i32::from(res)); // >>> 0 }if let Ok(res) = r.sismember("bikes:racing:usa", "bike:1").await { let res: bool = res; println!("{}", i32::from(res)); // >>> 1 } if let Ok(res) = r.sismember("bikes:racing:usa", "bike:2").await { let res: bool = res; println!("{}", i32::from(res)); // >>> 0 } -
-
Which bikes are competing in both races?
Set intersection: Find common members across multiple sets using SINTER when you need to identify shared items (e.g., users in multiple groups)Redis CLI guideAlso, check out our other client tools Redis Insight and Redis for VS Code.r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3") r.sadd("bikes:racing:usa", "bike:1", "bike:4") res7 = r.sinter("bikes:racing:france", "bikes:racing:usa") print(res7) # >>> {'bike:1'}import { createClient } from 'redis'; const client = createClient(); await client.connect(); const res1 = await client.sAdd('bikes:racing:france', 'bike:1') console.log(res1) // >>> 1 const res2 = await client.sAdd('bikes:racing:france', 'bike:1') console.log(res2) // >>> 0 const res3 = await client.sAdd('bikes:racing:france', ['bike:2', 'bike:3']) console.log(res3) // >>> 2 const res4 = await client.sAdd('bikes:racing:usa', ['bike:1', 'bike:4']) console.log(res4) // >>> 2 await client.del('bikes:racing:france') await client.del('bikes:racing:usa') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) await client.sAdd('bikes:racing:usa', ['bike:1', 'bike:4']) const res5 = await client.sIsMember('bikes:racing:usa', 'bike:1') console.log(res5) // >>> 1 const res6 = await client.sIsMember('bikes:racing:usa', 'bike:2') console.log(res6) // >>> 0 await client.del('bikes:racing:france') await client.del('bikes:racing:usa') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) await client.sAdd('bikes:racing:usa', ['bike:1', 'bike:4']) const res7 = await client.sInter(['bikes:racing:france', 'bikes:racing:usa']) console.log(res7) // >>> {'bike:1'} await client.del('bikes:racing:france') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) const res8 = await client.sCard('bikes:racing:france') console.log(res8) // >>> 3 await client.del('bikes:racing:france') const res9 = await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) console.log(res9) // >>> 3 const res10 = await client.sMembers('bikes:racing:france') console.log(res10) // >>> ['bike:1', 'bike:2', 'bike:3'] // Recreate the set so this example runs on its own. await client.del('bikes:racing:france') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) const res11 = await client.sIsMember('bikes:racing:france', 'bike:1') console.log(res11) // >>> 1 const res12 = await client.smIsMember('bikes:racing:france', ['bike:2', 'bike:3', 'bike:4']) console.log(res12) // >>> [1, 1, 0] await client.del('bikes:racing:france') await client.del('bikes:racing:usa') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) await client.sAdd('bikes:racing:usa', ['bike:1', 'bike:4']) const res13 = await client.sDiff(['bikes:racing:france', 'bikes:racing:usa']) console.log(res13) // >>> [ 'bike:2', 'bike:3' ] await client.del('bikes:racing:france') await client.del('bikes:racing:usa') await client.del('bikes:racing:italy') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) await client.sAdd('bikes:racing:usa', ['bike:1', 'bike:4']) await client.sAdd('bikes:racing:italy', ['bike:1', 'bike:2', 'bike:3', 'bike:4']) const res14 = await client.sInter( ['bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy'] ) console.log(res14) // >>> ['bike:1'] const res15 = await client.sUnion( ['bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy'] ) console.log(res15) // >>> ['bike:1', 'bike:2', 'bike:3', 'bike:4'] const res16 = await client.sDiff(['bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy']) console.log(res16) // >>> [] const res17 = await client.sDiff(['bikes:racing:usa', 'bikes:racing:france']) console.log(res17) // >>> ['bike:4'] const res18 = await client.sDiff(['bikes:racing:france', 'bikes:racing:usa']) console.log(res18) // >>> ['bike:2', 'bike:3'] await client.del('bikes:racing:france') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3', 'bike:4', 'bike:5']) const res19 = await client.sRem('bikes:racing:france', 'bike:1') console.log(res19) // >>> 1 const res20 = await client.sPop('bikes:racing:france') console.log(res20) // >>> bike:3 or other random value const res21 = await client.sMembers('bikes:racing:france') console.log(res21) // >>> ['bike:2', 'bike:4', 'bike:5']; depends on previous result const res22 = await client.sRandMember('bikes:racing:france') console.log(res22) // >>> bike:4 or other random valuejedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3"); jedis.sadd("bikes:racing:usa", "bike:1", "bike:4"); Set<String> res7 = jedis.sinter("bikes:racing:france", "bikes:racing:usa"); System.out.println(res7); // >>> [bike:1]CompletableFuture<Void> sInter = asyncCommands.sinter("bikes:racing:france", "bikes:racing:usa") .thenAccept(res7 -> { System.out.println(res7); // >>> [bike:1] }).toCompletableFuture();-
Returns the intersect of multiple sets.
-
sinter(
- keys: K... // the keys.
-
sinter(
- channel: ValueStreamingChannel<V>, // the channel.
- keys: K... // the keys.
-
sinter(
Mono<List<String>> sInter = reactiveCommands.sinter("bikes:racing:france", "bikes:racing:usa").collectList() .doOnNext(result -> { System.out.println(result); // >>> [bike:1] });-
Returns the intersect of multiple sets.
-
sinter(
- keys: K... // the keys.
-
sinter(
- channel: ValueStreamingChannel<V>, // the channel.
- keys: K... // the keys.
-
sinter(
res7, err := rdb.SInter(ctx, "bikes:racing:france", "bikes:racing:usa").Result() if err != nil { panic(err) } fmt.Println(res7) // >>> [bike:1]long res7 = db.SetAdd("{bikes:racing}:france", ["bike:1", "bike:2", "bike:3"]); long res8 = db.SetAdd("{bikes:racing}:usa", ["bike:1", "bike:4"]); RedisValue[] res9 = db.SetCombine(SetOperation.Intersect, ["{bikes:racing}:france", "{bikes:racing}:usa"]); Console.WriteLine(string.Join(", ", res9)); // >>> bike:1-
Returns the intersect of multiple sets.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- first: RedisKey,
- second: RedisKey,
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- keys: RedisKey[], // The keys of the sets to operate on.
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- first: RedisKey,
- second: RedisKey,
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- keys: RedisKey[], // The keys of the sets to operate on.
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
$res7 = $r->sinter(['bikes:racing:france', 'bikes:racing:usa']); echo json_encode($res7) . PHP_EOL; // >>> ["bike:1"]r.del('bikes:racing:france', 'bikes:racing:usa') r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) r.sadd('bikes:racing:usa', ['bike:1', 'bike:4']) res7 = r.sinter('bikes:racing:france', 'bikes:racing:usa') puts res7.inspect # ["bike:1"]if let Ok(res) = r.sinter(&["bikes:racing:france", "bikes:racing:usa"]) { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:1"] }if let Ok(res) = r.sinter(&["bikes:racing:france", "bikes:racing:usa"]).await { let res: HashSet<String> = res; let res = sorted_set(res); println!("{res:?}"); // >>> ["bike:1"] } -
-
How many bikes are racing in France?
Foundational: Get the cardinality of a set using SCARD when you need to count unique items efficientlyRedis CLI guideAlso, check out our other client tools Redis Insight and Redis for VS Code.r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3") res8 = r.scard("bikes:racing:france") print(res8) # >>> 3await client.del('bikes:racing:france') await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) const res8 = await client.sCard('bikes:racing:france') console.log(res8) // >>> 3jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3"); long res8 = jedis.scard("bikes:racing:france"); System.out.println(res8); // >>> 3CompletableFuture<Void> sCard = asyncCommands.scard("bikes:racing:france").thenAccept(res8 -> { System.out.println(res8); // >>> 3 }).toCompletableFuture();Mono<Long> sCard = reactiveCommands.scard("bikes:racing:france").doOnNext(result -> { System.out.println(result); // >>> 3 });res8, err := rdb.SCard(ctx, "bikes:racing:france").Result() if err != nil { panic(err) } fmt.Println(res8) // >>> 3long res10 = db.SetAdd("bikes:racing:france", ["bike:1", "bike:2", "bike:3"]); long res11 = db.SetLength("bikes:racing:france"); Console.WriteLine(res11); // >>> 3-
Returns the number of members in a set.
-
SetLength(
- key: RedisKey, // The key of the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetLength(
- key: RedisKey, // The key of the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetLength(
$res8 = $r->scard('bikes:racing:france'); echo $res8 . PHP_EOL; // >>> 3r.del('bikes:racing:france') r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']) res8 = r.scard('bikes:racing:france') puts res8 # 3if let Ok(res) = r.scard("bikes:racing:france") { let res: usize = res; println!("{res}"); // >>> 3 }if let Ok(res) = r.scard("bikes:racing:france").await { let res: usize = res; println!("{res}"); // >>> 3 } -
Tutorial
The SADD command adds new elements to a set. It's also possible
to do a number of other operations against sets like testing if a given element
already exists, performing the intersection, union or difference between
multiple sets, and so forth.
r.delete("bikes:racing:france")
res9 = r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3")
print(res9) # >>> 3
res10 = r.smembers("bikes:racing:france")
print(res10) # >>> {'bike:1', 'bike:2', 'bike:3'}
await client.del('bikes:racing:france')
const res9 = await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3'])
console.log(res9) // >>> 3
const res10 = await client.sMembers('bikes:racing:france')
console.log(res10) // >>> ['bike:1', 'bike:2', 'bike:3']
jedis.del("bikes:racing:france");
long res9 = jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3");
System.out.println(res9); // >>> 3
Set<String> res10 = jedis.smembers("bikes:racing:france");
System.out.println(res10); // >>> [bike:1, bike:2, bike:3]
-
Deletes one or more keys.
-
del(
- keys: byte[]...
-
del(
- key: byte[]
-
del(
- keys: String...
-
del(
- key: String
-
del(
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: byte[],
- members: byte[]...
-
sadd(
- key: String,
- members: String...
-
sadd(
CompletableFuture<Void> sAddSMembers = asyncCommands.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3")
.thenCompose(res9 -> {
System.out.println(res9); // >>> 3
return asyncCommands.smembers("bikes:racing:france");
}).thenAccept(res10 -> {
System.out.println(res10); // >>> [bike:1, bike:2, bike:3]
}).toCompletableFuture();
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: K, // the key.
- members: V... // the member type: value.
-
sadd(
-
Returns all members of a set.
-
smembers(
- key: K // the keys.
-
smembers(
- channel: ValueStreamingChannel<V>, // the channel.
- key: K // the keys.
-
smembers(
Mono<Void> sAddSMembers = reactiveCommands.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3")
.doOnNext(result -> {
System.out.println(result); // >>> 3
}).flatMap(v -> reactiveCommands.smembers("bikes:racing:france").collectList()).doOnNext(result -> {
System.out.println(result); // >>> [bike:1, bike:2, bike:3]
}).then();
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: K, // the key.
- members: V... // the member type: value.
-
sadd(
-
Returns all members of a set.
-
smembers(
- key: K // the keys.
-
smembers(
- channel: ValueStreamingChannel<V>, // the channel.
- key: K // the keys.
-
smembers(
rdb.Del(ctx, "bikes:racing:france")
res9, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1", "bike:2", "bike:3").Result()
if err != nil {
panic(err)
}
fmt.Println(res9) // >>> 3
res10, err := rdb.SMembers(ctx, "bikes:racing:france").Result()
if err != nil {
panic(err)
}
// Sort the strings in the slice to make sure the output is lexicographical
sort.Strings(res10)
fmt.Println(res10) // >>> [bike:1 bike:2 bike:3]
db.KeyDelete("bikes:racing:france");
long res12 = db.SetAdd("bikes:racing:france", ["bike:1", "bike:2", "bike:3"]);
RedisValue[] res13 = db.SetMembers("bikes:racing:france");
Console.WriteLine(string.Join(", ", res13)); // >>> bike:3, bike:2, bike:1
-
Deletes one or more keys.
-
KeyDelete(
- key: RedisKey,
- flags: CommandFlags // The flags to use for this operation.
-
KeyDelete(
- keys: RedisKey[], // The keys to delete.
- flags: CommandFlags // The flags to use for this operation.
-
KeyDelete(
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
SetAdd(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The values to add to the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The values to add to the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
-
Returns all members of a set.
-
SetMembers(
- key: RedisKey, // The key of the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetMembers(
- key: RedisKey, // The key of the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetMembers(
$r->del('bikes:racing:france');
$res9 = $r->sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']);
echo $res9 . PHP_EOL;
// >>> 3
$res10 = $r->smembers('bikes:racing:france');
sort($res10);
echo json_encode($res10) . PHP_EOL;
// >>> ["bike:1","bike:2","bike:3"]
r.del('bikes:racing:france')
res9 = r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3'])
puts res9 # 3
res10 = r.smembers('bikes:racing:france')
puts res10.sort.inspect # ["bike:1", "bike:2", "bike:3"]
let _: usize = r.del("bikes:racing:france").unwrap_or(0);
if let Ok(res) = r.sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"]) {
let res: usize = res;
println!("{res}"); // >>> 3
}
if let Ok(res) = r.smembers("bikes:racing:france") {
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> ["bike:1", "bike:2", "bike:3"]
}
let _: usize = r.del("bikes:racing:france").await.unwrap_or(0);
if let Ok(res) = r.sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"]).await {
let res: usize = res;
println!("{res}"); // >>> 3
}
if let Ok(res) = r.smembers("bikes:racing:france").await {
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> ["bike:1", "bike:2", "bike:3"]
}
Here I've added three elements to my set and told Redis to return all the elements. There is no order guarantee with a set. Redis is free to return the elements in any order at every call.
Redis has commands to test for set membership. These commands can be used on single as well as multiple items:
-
SMISMEMBER ( @read , @set , @fast )Determines whether multiple members belong to a set.
# Recreate the set so this example runs on its own.
r.delete("bikes:racing:france")
r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3")
res11 = r.sismember("bikes:racing:france", "bike:1")
print(res11) # >>> 1
res12 = r.smismember("bikes:racing:france", "bike:2", "bike:3", "bike:4")
print(res12) # >>> [1, 1, 0]
-
SMISMEMBER ( @read , @set , @fast )Determines whether multiple members belong to a set.
-
smismember(
- name: KeyT,
- values: List,
- *args: List
-
smismember(
// Recreate the set so this example runs on its own.
await client.del('bikes:racing:france')
await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3'])
const res11 = await client.sIsMember('bikes:racing:france', 'bike:1')
console.log(res11) // >>> 1
const res12 = await client.smIsMember('bikes:racing:france', ['bike:2', 'bike:3', 'bike:4'])
console.log(res12) // >>> [1, 1, 0]
-
SMISMEMBER ( @read , @set , @fast )Determines whether multiple members belong to a set.
-
SMISMEMBER(
- key: RedisArgument,
- members: Array<RedisArgument>
-
SMISMEMBER(
// Recreate the set so this example runs on its own.
jedis.del("bikes:racing:france");
jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3");
boolean res11 = jedis.sismember("bikes:racing:france", "bike:1");
System.out.println(res11); // >>> true
List<Boolean> res12 = jedis.smismember("bikes:racing:france", "bike:2", "bike:3", "bike:4");
System.out.println(res12); // >>> [true,true,false]
-
Deletes one or more keys.
-
del(
- keys: byte[]...
-
del(
- key: byte[]
-
del(
- keys: String...
-
del(
- key: String
-
del(
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: byte[],
- members: byte[]...
-
sadd(
- key: String,
- members: String...
-
sadd(
-
Determines whether a member belongs to a set.
-
sismember(
- key: byte[],
- member: byte[]
-
sismember(
- key: String,
- member: String
-
sismember(
-
SMISMEMBER ( @read , @set , @fast )Determines whether multiple members belong to a set.
-
smismember(
- key: byte[],
- members: byte[]...
-
smismember(
- key: String,
- members: String...
-
smismember(
// Recreate the set so this example runs on its own. The chain is
// ordered, so the DEL + SADD complete before the reads below.
CompletableFuture<Void> sMIsMember = asyncCommands.del("bikes:racing:france")
.thenCompose(d -> asyncCommands.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3"))
.thenCompose(a -> asyncCommands.sismember("bikes:racing:france", "bike:1")).thenCompose(res11 -> {
System.out.println(res11); // >>> true
return asyncCommands.smismember("bikes:racing:france", "bike:2", "bike:3", "bike:4");
}).thenAccept(res12 -> {
System.out.println(res12); // >>> [true, true, false]
}).toCompletableFuture();
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: K, // the key.
- members: V... // the member type: value.
-
sadd(
-
Determines whether a member belongs to a set.
-
sismember(
- key: K, // the key.
- member: V // the member type: value.
-
sismember(
-
SMISMEMBER ( @read , @set , @fast )Determines whether multiple members belong to a set.
-
smismember(
- key: K, // the key.
- members: V... // the member type: value.
-
smismember(
// Recreate the set so this example runs on its own. Block it
// sequentially: a DEL inside the shared Mono.when() below would
// race the sibling reads on the same key.
reactiveCommands.del("bikes:racing:france")
.then(reactiveCommands.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3"))
.block();
Mono<Boolean> sIsMember3 = reactiveCommands.sismember("bikes:racing:france", "bike:1").doOnNext(result -> {
System.out.println(result); // >>> true
});
Mono<List<Boolean>> sMIsMember = reactiveCommands.smismember("bikes:racing:france", "bike:2", "bike:3", "bike:4")
.collectList().doOnNext(result -> {
System.out.println(result); // >>> [true, true, false]
});
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: K, // the key.
- members: V... // the member type: value.
-
sadd(
-
Determines whether a member belongs to a set.
-
sismember(
- key: K, // the key.
- member: V // the member type: value.
-
sismember(
-
SMISMEMBER ( @read , @set , @fast )Determines whether multiple members belong to a set.
-
smismember(
- key: K, // the key.
- members: V... // the member type: value.
-
smismember(
res11, err := rdb.SIsMember(ctx, "bikes:racing:france", "bike:1").Result()
if err != nil {
panic(err)
}
fmt.Println(res11) // >>> true
res12, err := rdb.SMIsMember(ctx, "bikes:racing:france", "bike:2", "bike:3", "bike:4").Result()
if err != nil {
panic(err)
}
fmt.Println(res12) // >>> [true true false]
-
SMISMEMBER ( @read , @set , @fast )Determines whether multiple members belong to a set.
-
SMIsMember(
- ctx: context.Context,
- key: string,
- members: ...interface{}
-
SMIsMember(
// Recreate the set so this example runs on its own.
db.KeyDelete("bikes:racing:france");
db.SetAdd("bikes:racing:france", ["bike:1", "bike:2", "bike:3"]);
bool res14 = db.SetContains("bikes:racing:france", "bike:1");
Console.WriteLine(res14); // >>> true
bool[] res15 = db.SetContains("bikes:racing:france", ["bike:2", "bike:3", "bike:4"]);
Console.WriteLine(string.Join(", ", res15)); // >>> True, True, False
-
Deletes one or more keys.
-
KeyDelete(
- key: RedisKey,
- flags: CommandFlags // The flags to use for this operation.
-
KeyDelete(
- keys: RedisKey[], // The keys to delete.
- flags: CommandFlags // The flags to use for this operation.
-
KeyDelete(
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
SetAdd(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The values to add to the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The values to add to the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
-
Determines whether a member belongs to a set.
-
SetContains(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetContains(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The members to check for.
- flags: CommandFlags // The flags to use for this operation.
-
SetContains(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetContains(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The members to check for.
- flags: CommandFlags // The flags to use for this operation.
-
SetContains(
-
SMISMEMBER ( @read , @set , @fast )Determines whether multiple members belong to a set.
-
SetContains(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetContains(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The members to check for.
- flags: CommandFlags // The flags to use for this operation.
-
SetContains(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetContains(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The members to check for.
- flags: CommandFlags // The flags to use for this operation.
-
SetContains(
// Recreate the set so this example runs on its own.
$r->del('bikes:racing:france');
$r->sadd('bikes:racing:france', 'bike:1', 'bike:2', 'bike:3');
$res11 = $r->sismember('bikes:racing:france', 'bike:1');
echo $res11 . PHP_EOL;
// >>> 1
$res12 = $r->smismember('bikes:racing:france', 'bike:2', 'bike:3', 'bike:4');
echo json_encode($res12) . PHP_EOL;
// >>> [1,1,0]
-
SMISMEMBER ( @read , @set , @fast )Determines whether multiple members belong to a set.
-
smismember(
- $key: string,
- $members: string ...
-
smismember(
# Recreate the set so this example runs on its own.
r.del('bikes:racing:france')
r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3'])
res11 = r.sismember('bikes:racing:france', 'bike:1')
puts res11 # true
res12 = r.smismember('bikes:racing:france', 'bike:2', 'bike:3', 'bike:4')
puts res12.inspect # [true, true, false]
-
SMISMEMBER ( @read , @set , @fast )Determines whether multiple members belong to a set.
-
smismember(
- key: String,
- *members: String, Array<String>
-
smismember(
// Recreate the set so this example runs on its own.
let _: usize = r.del("bikes:racing:france").unwrap_or(0);
let _: usize = r
.sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"])
.unwrap_or(0);
if let Ok(res) = r.sismember("bikes:racing:france", "bike:1") {
let res: bool = res;
println!("{}", i32::from(res)); // >>> 1
}
if let Ok(res) = r.smismember("bikes:racing:france", &["bike:2", "bike:3", "bike:4"]) {
let res: Vec<bool> = res;
let res: Vec<i32> = res.into_iter().map(i32::from).collect();
println!("{res:?}"); // >>> [1, 1, 0]
}
-
SMISMEMBER ( @read , @set , @fast )Determines whether multiple members belong to a set.
-
smismember(
- key: K,
- members: M
-
smismember(
// Recreate the set so this example runs on its own.
let _: usize = r.del("bikes:racing:france").await.unwrap_or(0);
let _: usize = r
.sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"])
.await
.unwrap_or(0);
if let Ok(res) = r.sismember("bikes:racing:france", "bike:1").await {
let res: bool = res;
println!("{}", i32::from(res)); // >>> 1
}
if let Ok(res) = r
.smismember("bikes:racing:france", &["bike:2", "bike:3", "bike:4"])
.await
{
let res: Vec<bool> = res;
let res: Vec<i32> = res.into_iter().map(i32::from).collect();
println!("{res:?}"); // >>> [1, 1, 0]
}
-
SMISMEMBER ( @read , @set , @fast )Determines whether multiple members belong to a set.
-
smismember(
- key: K,
- members: M
-
smismember(
We can also find the difference between two sets. For instance, we may want to know which bikes are racing in France but not in the USA:
r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3")
r.sadd("bikes:racing:usa", "bike:1", "bike:4")
res13 = r.sdiff("bikes:racing:france", "bikes:racing:usa")
print(res13) # >>> {'bike:2', 'bike:3'}
await client.del('bikes:racing:france')
await client.del('bikes:racing:usa')
await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3'])
await client.sAdd('bikes:racing:usa', ['bike:1', 'bike:4'])
const res13 = await client.sDiff(['bikes:racing:france', 'bikes:racing:usa'])
console.log(res13) // >>> [ 'bike:2', 'bike:3' ]
jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3");
jedis.sadd("bikes:racing:usa", "bike:1", "bike:4");
Set<String> res13 = jedis.sdiff("bikes:racing:france", "bikes:racing:usa");
System.out.println(res13); // >>> [bike:2, bike:3]
-
Deletes one or more keys.
-
del(
- keys: byte[]...
-
del(
- key: byte[]
-
del(
- keys: String...
-
del(
- key: String
-
del(
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: byte[],
- members: byte[]...
-
sadd(
- key: String,
- members: String...
-
sadd(
CompletableFuture<Void> sDiff = asyncCommands.sdiff("bikes:racing:france", "bikes:racing:usa")
.thenAccept(res13 -> {
System.out.println(res13); // >>> [bike:2, bike:3]
}).toCompletableFuture();
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: K, // the key.
- members: V... // the member type: value.
-
sadd(
-
Returns the difference of multiple sets.
-
sdiff(
- keys: K... // the keys.
-
sdiff(
- channel: ValueStreamingChannel<V>, // the channel.
- keys: K... // the keys.
-
sdiff(
Mono<List<String>> sDiff = reactiveCommands.sdiff("bikes:racing:france", "bikes:racing:usa").collectList()
.doOnNext(result -> {
System.out.println(result); // >>> [bike:2, bike:3]
});
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: K, // the key.
- members: V... // the member type: value.
-
sadd(
-
Returns the difference of multiple sets.
-
sdiff(
- keys: K... // the keys.
-
sdiff(
- channel: ValueStreamingChannel<V>, // the channel.
- keys: K... // the keys.
-
sdiff(
_, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1", "bike:2", "bike:3").Result()
if err != nil {
panic(err)
}
_, err = rdb.SAdd(ctx, "bikes:racing:usa", "bike:1", "bike:4").Result()
res13, err := rdb.SDiff(ctx, "bikes:racing:france", "bikes:racing:usa").Result()
if err != nil {
panic(err)
}
// Sort the strings in the slice to make sure the output is lexicographical
sort.Strings(res13)
fmt.Println(res13) // >>> [bike:2 bike:3]
long res16 = db.SetAdd("{bikes:racing}:france", ["bike:1", "bike:2", "bike:3"]);
long res17 = db.SetAdd("{bikes:racing}:usa", ["bike:1", "bike:4"]);
RedisValue[] res18 = db.SetCombine(SetOperation.Difference, ["{bikes:racing}:france", "{bikes:racing}:usa"]);
Console.WriteLine(string.Join(", ", res18)); // >>> bike:2, bike:3
-
Deletes one or more keys.
-
KeyDelete(
- key: RedisKey,
- flags: CommandFlags // The flags to use for this operation.
-
KeyDelete(
- keys: RedisKey[], // The keys to delete.
- flags: CommandFlags // The flags to use for this operation.
-
KeyDelete(
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
SetAdd(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The values to add to the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The values to add to the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
-
Returns the difference of multiple sets.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- first: RedisKey,
- second: RedisKey,
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- keys: RedisKey[], // The keys of the sets to operate on.
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- first: RedisKey,
- second: RedisKey,
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- keys: RedisKey[], // The keys of the sets to operate on.
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
$r->sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']);
$r->sadd('bikes:racing:usa', ['bike:1', 'bike:4']);
$res13 = $r->sdiff(['bikes:racing:france', 'bikes:racing:usa']);
sort($res13);
echo json_encode($res13) . PHP_EOL;
// >>> ["bike:2","bike:3"]
r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3'])
r.sadd('bikes:racing:usa', ['bike:1', 'bike:4'])
res13 = r.sdiff('bikes:racing:france', 'bikes:racing:usa')
puts res13.sort.inspect # ["bike:2", "bike:3"]
let _: usize = r.del("bikes:racing:france").unwrap_or(0);
let _: usize = r.del("bikes:racing:usa").unwrap_or(0);
let _: usize = r.sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"]).unwrap_or(0);
let _: usize = r.sadd("bikes:racing:usa", &["bike:1", "bike:4"]).unwrap_or(0);
if let Ok(res) = r.sdiff(&["bikes:racing:france", "bikes:racing:usa"]) {
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> ["bike:2", "bike:3"]
}
let _: usize = r.del("bikes:racing:france").await.unwrap_or(0);
let _: usize = r.del("bikes:racing:usa").await.unwrap_or(0);
let _: usize = r
.sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"])
.await
.unwrap_or(0);
let _: usize = r
.sadd("bikes:racing:usa", &["bike:1", "bike:4"])
.await
.unwrap_or(0);
if let Ok(res) = r.sdiff(&["bikes:racing:france", "bikes:racing:usa"]).await {
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> ["bike:2", "bike:3"]
}
There are other non trivial operations that are still easy to implement
using the right Redis commands. For instance we may want a list of all the
bikes racing in France, the USA, and some other races. We can do this using
the SINTER command, which performs the intersection between different
sets. In addition to intersection you can also perform
unions, difference, and more. For example
if we add a third race we can see some of these commands in action:
r.delete("bikes:racing:france")
r.delete("bikes:racing:usa")
r.delete("bikes:racing:italy")
r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3")
r.sadd("bikes:racing:usa", "bike:1", "bike:4")
r.sadd("bikes:racing:italy", "bike:1", "bike:2", "bike:3", "bike:4")
res13 = r.sinter("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy")
print(res13) # >>> {'bike:1'}
res14 = r.sunion("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy")
print(res14) # >>> {'bike:1', 'bike:2', 'bike:3', 'bike:4'}
res15 = r.sdiff("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy")
print(res15) # >>> set()
res16 = r.sdiff("bikes:racing:usa", "bikes:racing:france")
print(res16) # >>> {'bike:4'}
res17 = r.sdiff("bikes:racing:france", "bikes:racing:usa")
print(res17) # >>> {'bike:2', 'bike:3'}
await client.del('bikes:racing:france')
await client.del('bikes:racing:usa')
await client.del('bikes:racing:italy')
await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3'])
await client.sAdd('bikes:racing:usa', ['bike:1', 'bike:4'])
await client.sAdd('bikes:racing:italy', ['bike:1', 'bike:2', 'bike:3', 'bike:4'])
const res14 = await client.sInter(
['bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy']
)
console.log(res14) // >>> ['bike:1']
const res15 = await client.sUnion(
['bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy']
)
console.log(res15) // >>> ['bike:1', 'bike:2', 'bike:3', 'bike:4']
const res16 = await client.sDiff(['bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy'])
console.log(res16) // >>> []
const res17 = await client.sDiff(['bikes:racing:usa', 'bikes:racing:france'])
console.log(res17) // >>> ['bike:4']
const res18 = await client.sDiff(['bikes:racing:france', 'bikes:racing:usa'])
console.log(res18) // >>> ['bike:2', 'bike:3']
jedis.del("bikes:racing:france");
jedis.del("bikes:racing:usa");
jedis.del("bikes:racing:italy");
jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3");
jedis.sadd("bikes:racing:usa", "bike:1", "bike:4");
jedis.sadd("bikes:racing:italy", "bike:1", "bike:2", "bike:3", "bike:4");
Set<String> res14 = jedis.sinter("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy");
System.out.println(res14); // >>> [bike:1]
Set<String> res15 = jedis.sunion("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy");
System.out.println(res15); // >>> [bike:1, bike:2, bike:3, bike:4]
Set<String> res16 = jedis.sdiff("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy");
System.out.println(res16); // >>> []
Set<String> res17 = jedis.sdiff("bikes:racing:usa", "bikes:racing:france");
System.out.println(res17); // >>> [bike:4]
Set<String> res18 = jedis.sdiff("bikes:racing:france", "bikes:racing:usa");
System.out.println(res18); // >>> [bike:2, bike:3]
-
Deletes one or more keys.
-
del(
- keys: byte[]...
-
del(
- key: byte[]
-
del(
- keys: String...
-
del(
- key: String
-
del(
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: byte[],
- members: byte[]...
-
sadd(
- key: String,
- members: String...
-
sadd(
CompletableFuture<Void> multisets = asyncCommands.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3")
.thenCompose(res14 -> {
System.out.println(res14); // >>> 0
return asyncCommands.sadd("bikes:racing:usa", "bike:1", "bike:4");
}).thenCompose(res15 -> {
System.out.println(res15); // >>> 0
return asyncCommands.sadd("bikes:racing:italy", "bike:1", "bike:2", "bike:3", "bike:4");
}).thenCompose(res16 -> {
System.out.println(res16); // >>> 4
return asyncCommands.sinter("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy");
}).thenCompose(res17 -> {
System.out.println(res17); // >>> [bike:1]
return asyncCommands.sunion("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy");
}).thenCompose(res18 -> {
System.out.println(res18); // >>> [bike:1, bike:2, bike:3, bike:4]
return asyncCommands.sdiff("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy");
}).thenCompose(res19 -> {
System.out.println(res19); // >>> []
return asyncCommands.sdiff("bikes:racing:usa", "bikes:racing:france");
}).thenCompose(res20 -> {
System.out.println(res20); // >>> [bike:4]
return asyncCommands.sdiff("bikes:racing:france", "bikes:racing:usa");
}).thenAccept(res21 -> {
System.out.println(res21); // >>> [bike:2, bike:3]
}).toCompletableFuture();
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: K, // the key.
- members: V... // the member type: value.
-
sadd(
-
Returns the intersect of multiple sets.
-
sinter(
- keys: K... // the keys.
-
sinter(
- channel: ValueStreamingChannel<V>, // the channel.
- keys: K... // the keys.
-
sinter(
-
Returns the union of multiple sets.
-
sunion(
- keys: K... // the keys.
-
sunion(
- channel: ValueStreamingChannel<V>, // streaming channel that receives a call for every value.
- keys: K... // the keys.
-
sunion(
-
Returns the difference of multiple sets.
-
sdiff(
- keys: K... // the keys.
-
sdiff(
- channel: ValueStreamingChannel<V>, // the channel.
- keys: K... // the keys.
-
sdiff(
Mono<Void> add3sets = reactiveCommands.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3")
.doOnNext(result -> {
System.out.println(result); // >>> 0
}).flatMap(v -> reactiveCommands.sadd("bikes:racing:usa", "bike:1", "bike:4")).doOnNext(result -> {
System.out.println(result); // >>> 0
}).flatMap(v -> reactiveCommands.sadd("bikes:racing:italy", "bike:1", "bike:2", "bike:3", "bike:4"))
.doOnNext(result -> {
System.out.println(result); // >>> 4,
}).then();
add3sets.block();
Mono<List<String>> multisets1 = reactiveCommands
.sinter("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy").collectList().doOnNext(result -> {
System.out.println(result); // >>> [bike:1]
});
Mono<List<String>> multisets2 = reactiveCommands
.sunion("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy").collectList().doOnNext(result -> {
System.out.println(result); // >>> [bike:1, bike:2, bike:3, bike:4]
});
Mono<List<String>> multisets3 = reactiveCommands
.sdiff("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy").collectList().doOnNext(result -> {
System.out.println(result); // >>> []
});
Mono<List<String>> multisets4 = reactiveCommands.sdiff("bikes:racing:usa", "bikes:racing:france").collectList()
.doOnNext(result -> {
System.out.println(result); // >>> [bike:4]
});
Mono<List<String>> multisets5 = reactiveCommands.sdiff("bikes:racing:france", "bikes:racing:usa").collectList()
.doOnNext(result -> {
System.out.println(result); // >>> [bike:2, bike:3]
});
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: K, // the key.
- members: V... // the member type: value.
-
sadd(
-
Returns the intersect of multiple sets.
-
sinter(
- keys: K... // the keys.
-
sinter(
- channel: ValueStreamingChannel<V>, // the channel.
- keys: K... // the keys.
-
sinter(
-
Returns the union of multiple sets.
-
sunion(
- keys: K... // the keys.
-
sunion(
- channel: ValueStreamingChannel<V>, // streaming channel that receives a call for every value.
- keys: K... // the keys.
-
sunion(
-
Returns the difference of multiple sets.
-
sdiff(
- keys: K... // the keys.
-
sdiff(
- channel: ValueStreamingChannel<V>, // the channel.
- keys: K... // the keys.
-
sdiff(
rdb.Del(ctx, "bikes:racing:france")
rdb.Del(ctx, "bikes:racing:usa")
rdb.Del(ctx, "bikes:racing:italy")
_, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1", "bike:2", "bike:3").Result()
if err != nil {
panic(err)
}
_, err = rdb.SAdd(ctx, "bikes:racing:usa", "bike:1", "bike:4").Result()
if err != nil {
panic(err)
}
_, err = rdb.SAdd(ctx, "bikes:racing:italy", "bike:1", "bike:2", "bike:3", "bike:4").Result()
if err != nil {
panic(err)
}
res14, err := rdb.SInter(ctx, "bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy").Result()
if err != nil {
panic(err)
}
fmt.Println(res14) // >>> [bike:1]
res15, err := rdb.SUnion(ctx, "bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy").Result()
if err != nil {
panic(err)
}
// Sort the strings in the slice to make sure the output is lexicographical
sort.Strings(res15)
fmt.Println(res15) // >>> [bike:1 bike:2 bike:3 bike:4]
res16, err := rdb.SDiff(ctx, "bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy").Result()
if err != nil {
panic(err)
}
fmt.Println(res16) // >>> []
res17, err := rdb.SDiff(ctx, "bikes:racing:usa", "bikes:racing:france").Result()
if err != nil {
panic(err)
}
fmt.Println(res17) // >>> [bike:4]
res18, err := rdb.SDiff(ctx, "bikes:racing:france", "bikes:racing:usa").Result()
if err != nil {
panic(err)
}
// Sort the strings in the slice to make sure the output is lexicographical
sort.Strings(res18)
fmt.Println(res18) // >>> [bike:2 bike:3]
db.KeyDelete("{bikes:racing}:france");
db.KeyDelete("{bikes:racing}:usa");
db.KeyDelete("{bikes:racing}:italy");
long res19 = db.SetAdd("{bikes:racing}:france", ["bike:1", "bike:2", "bike:3"]);
long res20 = db.SetAdd("{bikes:racing}:usa", ["bike:1", "bike:4"]);
long res21 = db.SetAdd("{bikes:racing}:italy", ["bike:1", "bike:2", "bike:3", "bike:4"]);
RedisValue[] res22 = db.SetCombine(SetOperation.Intersect, ["{bikes:racing}:france", "{bikes:racing}:usa", "{bikes:racing}:italy"
]);
Console.WriteLine(string.Join(", ", res22)); // >>> bike:1
RedisValue[] res23 = db.SetCombine(SetOperation.Union, ["{bikes:racing}:france", "{bikes:racing}:usa", "{bikes:racing}:italy"
]);
Console.WriteLine(string.Join(", ", res23)); // >>> bike:1, bike:2, bike:3, bike:4
RedisValue[] res24 = db.SetCombine(SetOperation.Difference, ["{bikes:racing}:france", "{bikes:racing}:usa", "{bikes:racing}:italy"
]);
Console.WriteLine(string.Join(", ", res24)); // >>> <empty set>
RedisValue[] res25 = db.SetCombine(SetOperation.Difference, ["{bikes:racing}:usa", "{bikes:racing}:france"]);
Console.WriteLine(string.Join(", ", res25)); // >>> bike:4
RedisValue[] res26 = db.SetCombine(SetOperation.Difference, ["{bikes:racing}:france", "{bikes:racing}:usa"]);
Console.WriteLine(string.Join(", ", res26)); // >>> bike:2, bike:3
-
Deletes one or more keys.
-
KeyDelete(
- key: RedisKey,
- flags: CommandFlags // The flags to use for this operation.
-
KeyDelete(
- keys: RedisKey[], // The keys to delete.
- flags: CommandFlags // The flags to use for this operation.
-
KeyDelete(
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
SetAdd(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The values to add to the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The values to add to the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
-
Returns the intersect of multiple sets.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- first: RedisKey,
- second: RedisKey,
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- keys: RedisKey[], // The keys of the sets to operate on.
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- first: RedisKey,
- second: RedisKey,
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- keys: RedisKey[], // The keys of the sets to operate on.
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
-
Returns the union of multiple sets.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- first: RedisKey,
- second: RedisKey,
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- keys: RedisKey[], // The keys of the sets to operate on.
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- first: RedisKey,
- second: RedisKey,
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- keys: RedisKey[], // The keys of the sets to operate on.
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
-
Returns the difference of multiple sets.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- first: RedisKey,
- second: RedisKey,
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- keys: RedisKey[], // The keys of the sets to operate on.
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- first: RedisKey,
- second: RedisKey,
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
- operation: SetOperation, // The operation to perform.
- keys: RedisKey[], // The keys of the sets to operate on.
- flags: CommandFlags // The flags to use for this operation.
-
SetCombine(
$r->del('bikes:racing:france');
$r->del('bikes:racing:usa');
$r->del('bikes:racing:italy');
$r->sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3']);
$r->sadd('bikes:racing:usa', ['bike:1', 'bike:4']);
$r->sadd('bikes:racing:italy', ['bike:1', 'bike:2', 'bike:3', 'bike:4']);
$res14 = $r->sinter(['bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy']);
echo json_encode($res14) . PHP_EOL;
// >>> ["bike:1"]
$res15 = $r->sunion(['bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy']);
sort($res15);
echo json_encode($res15) . PHP_EOL;
// >>> ["bike:1","bike:2","bike:3","bike:4"]
$res16 = $r->sdiff(['bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy']);
echo json_encode($res16) . PHP_EOL;
// >>> []
$res17 = $r->sdiff(['bikes:racing:usa', 'bikes:racing:france']);
echo json_encode($res17) . PHP_EOL;
// >>> ["bike:4"]
$res18 = $r->sdiff(['bikes:racing:france', 'bikes:racing:usa']);
sort($res18);
echo json_encode($res18) . PHP_EOL;
// >>> ["bike:2","bike:3"]
r.del('bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy')
r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3'])
r.sadd('bikes:racing:usa', ['bike:1', 'bike:4'])
r.sadd('bikes:racing:italy', ['bike:1', 'bike:2', 'bike:3', 'bike:4'])
res14 = r.sinter('bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy')
puts res14.inspect # ["bike:1"]
res15 = r.sunion('bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy')
puts res15.sort.inspect # ["bike:1", "bike:2", "bike:3", "bike:4"]
res16 = r.sdiff('bikes:racing:france', 'bikes:racing:usa', 'bikes:racing:italy')
puts res16.inspect # []
res17 = r.sdiff('bikes:racing:france', 'bikes:racing:usa')
puts res17.sort.inspect # ["bike:2", "bike:3"]
res18 = r.sdiff('bikes:racing:usa', 'bikes:racing:france')
puts res18.inspect # ["bike:4"]
let _: usize = r.del(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"]).unwrap_or(0);
let _: usize = r.sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"]).unwrap_or(0);
let _: usize = r.sadd("bikes:racing:usa", &["bike:1", "bike:4"]).unwrap_or(0);
let _: usize = r.sadd("bikes:racing:italy", &["bike:1", "bike:2", "bike:3", "bike:4"]).unwrap_or(0);
if let Ok(res) =
r.sinter(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"])
{
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> ["bike:1"]
}
if let Ok(res) =
r.sunion(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"])
{
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> ["bike:1", "bike:2", "bike:3", "bike:4"]
}
if let Ok(res) =
r.sdiff(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"])
{
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> []
}
if let Ok(res) = r.sdiff(&["bikes:racing:france", "bikes:racing:usa"]) {
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> ["bike:2", "bike:3"]
}
if let Ok(res) = r.sdiff(&["bikes:racing:usa", "bikes:racing:france"]) {
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> ["bike:4"]
}
let _: usize = r
.del(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"])
.await
.unwrap_or(0);
let _: usize = r
.sadd("bikes:racing:france", &["bike:1", "bike:2", "bike:3"])
.await
.unwrap_or(0);
let _: usize = r
.sadd("bikes:racing:usa", &["bike:1", "bike:4"])
.await
.unwrap_or(0);
let _: usize = r
.sadd("bikes:racing:italy", &["bike:1", "bike:2", "bike:3", "bike:4"])
.await
.unwrap_or(0);
if let Ok(res) = r
.sinter(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"])
.await
{
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> ["bike:1"]
}
if let Ok(res) = r
.sunion(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"])
.await
{
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> ["bike:1", "bike:2", "bike:3", "bike:4"]
}
if let Ok(res) = r
.sdiff(&["bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy"])
.await
{
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> []
}
if let Ok(res) = r.sdiff(&["bikes:racing:france", "bikes:racing:usa"]).await {
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> ["bike:2", "bike:3"]
}
if let Ok(res) = r.sdiff(&["bikes:racing:usa", "bikes:racing:france"]).await {
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> ["bike:4"]
}
You'll note that the SDIFF command returns an empty array when the
difference between all sets is empty. You'll also note that the order of sets
passed to SDIFF matters, since the difference is not commutative.
When you want to remove items from a set, you can use the SREM command to
remove one or more items from a set, or you can use the SPOP command to
remove a random item from a set. You can also return a random item from a
set without removing it using the SRANDMEMBER command:
-
SRANDMEMBER ( @read , @set , @slow )Get one or multiple random members from a set
r.delete("bikes:racing:france")
r.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3", "bike:4", "bike:5")
res18 = r.srem("bikes:racing:france", "bike:1")
print(res18) # >>> 1
res19 = r.spop("bikes:racing:france")
print(res19) # >>> bike:3
res20 = r.smembers("bikes:racing:france")
print(res20) # >>> {'bike:2', 'bike:4', 'bike:5'}
res21 = r.srandmember("bikes:racing:france")
print(res21) # >>> bike:4
-
SRANDMEMBER ( @read , @set , @slow )Get one or multiple random members from a set
-
srandmember(
- name: KeyT,
- number: Optional[int] = None
-
srandmember(
await client.del('bikes:racing:france')
await client.sAdd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3', 'bike:4', 'bike:5'])
const res19 = await client.sRem('bikes:racing:france', 'bike:1')
console.log(res19) // >>> 1
const res20 = await client.sPop('bikes:racing:france')
console.log(res20) // >>> bike:3 or other random value
const res21 = await client.sMembers('bikes:racing:france')
console.log(res21) // >>> ['bike:2', 'bike:4', 'bike:5']; depends on previous result
const res22 = await client.sRandMember('bikes:racing:france')
console.log(res22) // >>> bike:4 or other random value
-
SRANDMEMBER ( @read , @set , @slow )Get one or multiple random members from a set
-
SRANDMEMBER(
- key: RedisArgument
-
SRANDMEMBER(
jedis.del("bikes:racing:france");
jedis.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3", "bike:4", "bike:5");
long res19 = jedis.srem("bikes:racing:france", "bike:1");
System.out.println(res18); // >>> 1
String res20 = jedis.spop("bikes:racing:france");
System.out.println(res20); // >>> bike:3
Set<String> res21 = jedis.smembers("bikes:racing:france");
System.out.println(res21); // >>> [bike:2, bike:4, bike:5]
String res22 = jedis.srandmember("bikes:racing:france");
System.out.println(res22); // >>> bike:4
-
Deletes one or more keys.
-
del(
- keys: byte[]...
-
del(
- key: byte[]
-
del(
- keys: String...
-
del(
- key: String
-
del(
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: byte[],
- members: byte[]...
-
sadd(
- key: String,
- members: String...
-
sadd(
-
Removes one or more members from a set. Deletes the set if the last member was removed.
-
srem(
- key: byte[],
- members: byte[]...
-
srem(
- key: String,
- members: String...
-
srem(
-
SRANDMEMBER ( @read , @set , @slow )Get one or multiple random members from a set
-
srandmember(
- key: String
-
srandmember(
- key: String,
- count: int // If negative the behavior changes and the command is allowed to return the same element multiple times
-
srandmember(
CompletableFuture<Void> sRem = asyncCommands
.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3", "bike:4", "bike:5").thenCompose(res22 -> {
System.out.println(res22); // >>> 2
return asyncCommands.srem("bikes:racing:france", "bike:1");
}).thenCompose(res23 -> {
System.out.println(res23); // >>> 1
return asyncCommands.spop("bikes:racing:france");
}).thenCompose(res24 -> {
System.out.println(res24); // >>> bike:3 (for example)
return asyncCommands.smembers("bikes:racing:france");
}).thenCompose(res25 -> {
System.out.println(res25); // >>> [bike:2, bike:4, bike:5] (for example)
return asyncCommands.srandmember("bikes:racing:france");
}).thenAccept(res26 -> {
System.out.println(res26); // >>> bike:4 (for example)
}).toCompletableFuture();
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: K, // the key.
- members: V... // the member type: value.
-
sadd(
-
Removes one or more members from a set. Deletes the set if the last member was removed.
-
srem(
- key: K, // the key.
- members: V... // the member type: value.
-
srem(
-
Returns one or more random members from a set after removing them. Deletes the set if the last member was popped.
-
spop(
- key: K // the key.
-
spop(
- key: K, // the key.
- count: long // number of members to pop.
-
spop(
-
Returns all members of a set.
-
smembers(
- key: K // the keys.
-
smembers(
- channel: ValueStreamingChannel<V>, // the channel.
- key: K // the keys.
-
smembers(
-
SRANDMEMBER ( @read , @set , @slow )Get one or multiple random members from a set
-
srandmember(
- key: K // the key.
-
srandmember(
- key: K, // the key.
- count: long // the count.
-
srandmember(
- channel: ValueStreamingChannel<V>, // streaming channel that receives a call for every value.
- key: K, // the key.
- count: long // the count.
-
srandmember(
Mono<Void> sRem = reactiveCommands.sadd("bikes:racing:france", "bike:1", "bike:2", "bike:3", "bike:4", "bike:5")
.doOnNext(result -> {
System.out.println(result); // >>> 2
}).flatMap(v -> reactiveCommands.srem("bikes:racing:france", "bike:1")).doOnNext(result -> {
System.out.println(result); // >>> 1
}).flatMap(v -> reactiveCommands.spop("bikes:racing:france")).doOnNext(result -> {
System.out.println(result); // >>> bike:3 (for example)
}).flatMap(v -> reactiveCommands.smembers("bikes:racing:france").collectList()).doOnNext(result -> {
System.out.println(result); // >>> [bike:2, bike:4, bike:5] (for example)
}).flatMap(v -> reactiveCommands.srandmember("bikes:racing:france")).doOnNext(result -> {
System.out.println(result); // >>> bike:4 (for example)
}).then();
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
sadd(
- key: K, // the key.
- members: V... // the member type: value.
-
sadd(
-
Removes one or more members from a set. Deletes the set if the last member was removed.
-
srem(
- key: K, // the key.
- members: V... // the member type: value.
-
srem(
-
Returns one or more random members from a set after removing them. Deletes the set if the last member was popped.
-
spop(
- key: K // the key.
-
spop(
- key: K, // the key.
- count: long // number of members to pop.
-
spop(
-
Returns all members of a set.
-
smembers(
- key: K // the keys.
-
smembers(
- channel: ValueStreamingChannel<V>, // the channel.
- key: K // the keys.
-
smembers(
-
SRANDMEMBER ( @read , @set , @slow )Get one or multiple random members from a set
-
srandmember(
- key: K // the key.
-
srandmember(
- key: K, // the key.
- count: long // the count.
-
srandmember(
- channel: ValueStreamingChannel<V>, // streaming channel that receives a call for every value.
- key: K, // the key.
- count: long // the count.
-
srandmember(
rdb.Del(ctx, "bikes:racing:france")
_, err := rdb.SAdd(ctx, "bikes:racing:france", "bike:1", "bike:2", "bike:3", "bike:4", "bike:5").Result()
if err != nil {
panic(err)
}
res19, err := rdb.SRem(ctx, "bikes:racing:france", "bike:1").Result()
if err != nil {
panic(err)
}
fmt.Println(res19) // >>> 1
res20, err := rdb.SPop(ctx, "bikes:racing:france").Result()
if err != nil {
panic(err)
}
fmt.Println(res20) // >>> <random element>
res21, err := rdb.SMembers(ctx, "bikes:racing:france").Result()
if err != nil {
panic(err)
}
fmt.Println(res21) // >>> <remaining elements>
res22, err := rdb.SRandMember(ctx, "bikes:racing:france").Result()
if err != nil {
panic(err)
}
fmt.Println(res22) // >>> <random element>
-
SRANDMEMBER ( @read , @set , @slow )Get one or multiple random members from a set
-
SRandMember(
- ctx: context.Context,
- key: string
-
SRandMember(
db.KeyDelete("bikes:racing:france");
long res27 = db.SetAdd("bikes:racing:france", ["bike:1", "bike:2", "bike:3", "bike:4", "bike:5"]);
bool res28 = db.SetRemove("bikes:racing:france", "bike:1");
Console.WriteLine(res28); // >>> True
RedisValue res29 = db.SetPop("bikes:racing:france");
Console.WriteLine(res29); // >>> bike:3
RedisValue[] res30 = db.SetMembers("bikes:racing:france");
Console.WriteLine(string.Join(", ", res30)); // >>> bike:2, bike:4, bike:5
RedisValue res31 = db.SetRandomMember("bikes:racing:france");
Console.WriteLine(res31); // >>> bike:4
-
Deletes one or more keys.
-
KeyDelete(
- key: RedisKey,
- flags: CommandFlags // The flags to use for this operation.
-
KeyDelete(
- keys: RedisKey[], // The keys to delete.
- flags: CommandFlags // The flags to use for this operation.
-
KeyDelete(
-
Adds one or more members to a set. Creates the key if it doesn't exist.
-
SetAdd(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The values to add to the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The values to add to the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetAdd(
-
Removes one or more members from a set. Deletes the set if the last member was removed.
-
SetRemove(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetRemove(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The values to remove.
- flags: CommandFlags // The flags to use for this operation.
-
SetRemove(
- key: RedisKey, // The key of the set.
- value: RedisValue,
- flags: CommandFlags // The flags to use for this operation.
-
SetRemove(
- key: RedisKey, // The key of the set.
- values: RedisValue[], // The values to remove.
- flags: CommandFlags // The flags to use for this operation.
-
SetRemove(
-
Returns one or more random members from a set after removing them. Deletes the set if the last member was popped.
-
SetPop(
- key: RedisKey, // The key of the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetPop(
- key: RedisKey, // The key of the set.
- count: long, // The number of elements to return.
- flags: CommandFlags // The flags to use for this operation.
-
SetPop(
- key: RedisKey, // The key of the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetPop(
- key: RedisKey, // The key of the set.
- count: long, // The number of elements to return.
- flags: CommandFlags // The flags to use for this operation.
-
SetPop(
-
Returns all members of a set.
-
SetMembers(
- key: RedisKey, // The key of the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetMembers(
- key: RedisKey, // The key of the set.
- flags: CommandFlags // The flags to use for this operation.
-
SetMembers(
-
SRANDMEMBER ( @read , @set , @slow )Get one or multiple random members from a set
$r->del('bikes:racing:france');
$r->sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3', 'bike:4', 'bike:5']);
$res19 = $r->srem('bikes:racing:france', ['bike:1']);
echo $res19 . PHP_EOL;
// >>> 1
$res20 = $r->spop('bikes:racing:france');
echo $res20 . PHP_EOL;
// >>> bike:3 (for example)
$res21 = $r->smembers('bikes:racing:france');
sort($res21);
echo json_encode($res21) . PHP_EOL;
// >>> ["bike:2","bike:4","bike:5"]
$res22 = $r->srandmember('bikes:racing:france');
echo $res22 . PHP_EOL;
// >>> bike:4 (for example)
-
SRANDMEMBER ( @read , @set , @slow )Get one or multiple random members from a set
-
srandmember(
- $key: string,
- ?int $count = null: Any
-
srandmember(
r.del('bikes:racing:france')
r.sadd('bikes:racing:france', ['bike:1', 'bike:2', 'bike:3', 'bike:4', 'bike:5'])
res19 = r.srem('bikes:racing:france', ['bike:1'])
puts res19 # 1
res20 = r.spop('bikes:racing:france')
puts res20 # bike:3, for example
res21 = r.smembers('bikes:racing:france')
puts res21.sort.inspect # Remaining members, in no particular order
res22 = r.srandmember('bikes:racing:france')
puts res22 # bike:4, for example
-
SRANDMEMBER ( @read , @set , @slow )Get one or multiple random members from a set
-
srandmember(
- key: String,
- count: Integer
-
srandmember(
let _: usize = r.del("bikes:racing:france").unwrap_or(0);
let _: usize = r
.sadd(
"bikes:racing:france",
&["bike:1", "bike:2", "bike:3", "bike:4", "bike:5"],
)
.unwrap_or(0);
if let Ok(res) = r.srem("bikes:racing:france", "bike:1") {
let res: usize = res;
println!("{res}"); // >>> 1
}
if let Ok(res) = r.spop("bikes:racing:france") {
let res: Option<String> = res;
match res {
Some(res) => println!("{res}"), // >>> bike:3 (for example)
None => println!("(nil)"),
}
}
if let Ok(res) = r.smembers("bikes:racing:france") {
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> ["bike:2", "bike:4", "bike:5"] (for example)
}
if let Ok(res) = r.srandmember("bikes:racing:france") {
let res: Option<String> = res;
match res {
Some(res) => println!("{res}"), // >>> bike:4 (for example)
None => println!("(nil)"),
}
}
-
SRANDMEMBER ( @read , @set , @slow )Get one or multiple random members from a set
-
srandmember(
- key: K
-
srandmember(
let _: usize = r.del("bikes:racing:france").await.unwrap_or(0);
let _: usize = r
.sadd(
"bikes:racing:france",
&["bike:1", "bike:2", "bike:3", "bike:4", "bike:5"],
)
.await
.unwrap_or(0);
if let Ok(res) = r.srem("bikes:racing:france", "bike:1").await {
let res: usize = res;
println!("{res}"); // >>> 1
}
if let Ok(res) = r.spop("bikes:racing:france").await {
let res: Option<String> = res;
match res {
Some(res) => println!("{res}"), // >>> bike:3 (for example)
None => println!("(nil)"),
}
}
if let Ok(res) = r.smembers("bikes:racing:france").await {
let res: HashSet<String> = res;
let res = sorted_set(res);
println!("{res:?}"); // >>> ["bike:2", "bike:4", "bike:5"] (for example)
}
if let Ok(res) = r.srandmember("bikes:racing:france").await {
let res: Option<String> = res;
match res {
Some(res) => println!("{res}"), // >>> bike:4 (for example)
None => println!("(nil)"),
}
}
-
SRANDMEMBER ( @read , @set , @slow )Get one or multiple random members from a set
-
srandmember(
- key: K
-
srandmember(
Limits
The max size of a Redis set is 2^32 - 1 (4,294,967,295) members.
Performance
Most set operations, including adding, removing, and checking whether an item is a set member, are O(1).
This means that they're highly efficient.
However, for large sets with hundreds of thousands of members or more, you should exercise caution when running the SMEMBERS command.
This command is O(n) and returns the entire set in a single response.
As an alternative, consider the SSCAN, which lets you retrieve all members of a set iteratively.
Alternatives
Sets membership checks on large datasets (or on streaming data) can use a lot of memory. If you're concerned about memory usage and don't need perfect precision, consider a Bloom filter or Cuckoo filter as an alternative to a set.
Redis sets are frequently used as a kind of index. If you need to index and query your data, consider the JSON data type and the Redis Search features.
Learn more
- Redis Sets Explained and Redis Sets Elaborated are two short but thorough video explainers covering Redis sets.
- Redis University's RU101 explores Redis sets in detail.