SADD
SADD key member [member ...]
- Available since:
- Redis Open Source 1.0.0
- Time complexity:
- O(1) for each element added, so O(N) to add N elements when the command is called with multiple arguments.
- ACL categories:
-
@write,@set,@fast, - Compatibility:
- Redis Software and Redis Cloud compatibility
Add the specified members to the set stored at key.
Specified members that are already a member of this set are ignored.
If key does not exist, a new set is created before adding the specified
members.
An error is returned when the value stored at key is not a set.
Required arguments
key
The name of the key that holds the set.
member [member ...]
One or more members to add to the set.
Examples
Foundational: Add one or more members to a set using SADD (creates set if needed, ignores duplicates, returns count of new members)
res1 = r.sadd("myset", "Hello", "World")
print(res1) # >>> 2
res2 = r.sadd("myset", "World")
print(res2) # >>> 0
res3 = r.smembers("myset")
print(res3) # >>> {'Hello', 'World'}
import redis
r = redis.Redis(decode_responses=True)
res1 = r.sadd("myset", "Hello", "World")
print(res1) # >>> 2
res2 = r.sadd("myset", "World")
print(res2) # >>> 0
res3 = r.smembers("myset")
print(res3) # >>> {'Hello', 'World'}
res4 = r.sadd("myset", "Hello", "World")
print(res4) # >>> 2
res5 = r.smembers("myset")
print(res5) # >>> {'Hello', 'World'}
const res1 = await client.sAdd('myset', ['Hello', 'World']);
console.log(res1); // 2
const res2 = await client.sAdd('myset', ['World']);
console.log(res2); // 0
const res3 = await client.sMembers('myset')
console.log(res3); // ['Hello', 'World']
import { createClient } from 'redis';
const client = createClient();
await client.connect().catch(console.error);
const res1 = await client.sAdd('myset', ['Hello', 'World']);
console.log(res1); // 2
const res2 = await client.sAdd('myset', ['World']);
console.log(res2); // 0
const res3 = await client.sMembers('myset')
console.log(res3); // ['Hello', 'World']
const res4 = await client.sAdd('myset', ['Hello', 'World']);
console.log(res4); // 2
const res5 = await client.sMembers('myset')
console.log(res5); // ['Hello', 'World']
await client.close();
const res1 = await redis.sadd('myset', 'Hello', 'World');
console.log(res1); // >>> 2
const res2 = await redis.sadd('myset', 'World');
console.log(res2); // >>> 0
const res3 = await redis.smembers('myset');
console.log(res3); // >>> ['Hello', 'World']
import assert from 'node:assert';
import { Redis } from 'ioredis';
const redis = new Redis();
const res1 = await redis.sadd('myset', 'Hello', 'World');
console.log(res1); // >>> 2
const res2 = await redis.sadd('myset', 'World');
console.log(res2); // >>> 0
const res3 = await redis.smembers('myset');
console.log(res3); // >>> ['Hello', 'World']
const res4 = await redis.sadd('myset', 'Hello', 'World');
console.log(res4); // >>> 2
const res5 = await redis.smembers('myset');
console.log(res5); // >>> ['Hello', 'World']
redis.disconnect();
long sAddResult1 = jedis.sadd("myset", "Hello");
System.out.println(sAddResult1); // >>> 1
long sAddResult2 = jedis.sadd("myset", "World");
System.out.println(sAddResult2); // >>> 1
long sAddResult3 = jedis.sadd("myset", "World");
System.out.println(sAddResult3); // >>> 0
Set<String> sAddResult4 = jedis.smembers("myset");
System.out.println(sAddResult4.stream().sorted().collect(toList()));
// >>> [Hello, World]
import static java.util.stream.Collectors.toList;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.Set;
import redis.clients.jedis.RedisClient;
public class CmdsSetExample {
public void run() {
RedisClient jedis = RedisClient.create("redis://localhost:6379");
long sAddResult1 = jedis.sadd("myset", "Hello");
System.out.println(sAddResult1); // >>> 1
long sAddResult2 = jedis.sadd("myset", "World");
System.out.println(sAddResult2); // >>> 1
long sAddResult3 = jedis.sadd("myset", "World");
System.out.println(sAddResult3); // >>> 0
Set<String> sAddResult4 = jedis.smembers("myset");
System.out.println(sAddResult4.stream().sorted().collect(toList()));
// >>> [Hello, World]
long sMembersResult1 = jedis.sadd("myset", "Hello", "World");
System.out.println(sMembersResult1); // >>> 2
Set<String> sMembersResult2 = jedis.smembers("myset");
System.out.println(sMembersResult2.stream().sorted().collect(toList()));
// >>> [Hello, World]
jedis.close();
}
}
CompletableFuture<Void> sadd = asyncCommands.sadd("myset", "Hello").thenCompose(r -> {
System.out.println(r); // >>> 1
return asyncCommands.sadd("myset", "World");
}).thenCompose(r -> {
System.out.println(r); // >>> 1
return asyncCommands.sadd("myset", "World");
}).thenCompose(r -> {
System.out.println(r); // >>> 0
return asyncCommands.smembers("myset");
})
.thenAccept(System.out::println)
// >>> [Hello, World]
.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.concurrent.CompletableFuture;
import static java.util.stream.Collectors.toList;
public class CmdsSetExample {
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("myset", "Hello").thenCompose(r -> {
System.out.println(r); // >>> 1
return asyncCommands.sadd("myset", "World");
}).thenCompose(r -> {
System.out.println(r); // >>> 1
return asyncCommands.sadd("myset", "World");
}).thenCompose(r -> {
System.out.println(r); // >>> 0
return asyncCommands.smembers("myset");
})
.thenAccept(System.out::println)
// >>> [Hello, World]
.toCompletableFuture();
sadd.join();
CompletableFuture<Void> smembers = asyncCommands.sadd("myset", "Hello", "World").thenCompose(r -> {
return asyncCommands.smembers("myset");
})
.thenAccept(System.out::println)
// >>> [Hello, World]
.toCompletableFuture();
smembers.join();
} finally {
redisClient.shutdown();
}
}
}
Mono<Void> sadd = reactiveCommands.sadd("myset", "Hello").doOnNext(r -> {
System.out.println(r); // >>> 1
}).flatMap(r -> reactiveCommands.sadd("myset", "World")).doOnNext(r -> {
System.out.println(r); // >>> 1
}).flatMap(r -> reactiveCommands.sadd("myset", "World")).doOnNext(r -> {
System.out.println(r); // >>> 0
}).flatMap(r -> reactiveCommands.smembers("myset").collectList()).doOnNext(r -> {
System.out.println(r); // >>> [Hello, World]
}).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;
public class CmdsSetExample {
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("myset", "Hello").doOnNext(r -> {
System.out.println(r); // >>> 1
}).flatMap(r -> reactiveCommands.sadd("myset", "World")).doOnNext(r -> {
System.out.println(r); // >>> 1
}).flatMap(r -> reactiveCommands.sadd("myset", "World")).doOnNext(r -> {
System.out.println(r); // >>> 0
}).flatMap(r -> reactiveCommands.smembers("myset").collectList()).doOnNext(r -> {
System.out.println(r); // >>> [Hello, World]
}).then();
sadd.block();
Mono<Void> smembers = reactiveCommands.sadd("myset", "Hello", "World").doOnNext(r -> {
System.out.println(r); // >>> 2
}).flatMap(r -> reactiveCommands.smembers("myset").collectList()).doOnNext(r -> {
System.out.println(r); // >>> [Hello, World]
}).then();
smembers.block();
} finally {
redisClient.shutdown();
}
}
}
sAddResult1, err := rdb.SAdd(ctx, "myset", "Hello").Result()
if err != nil {
panic(err)
}
fmt.Println(sAddResult1) // >>> 1
sAddResult2, err := rdb.SAdd(ctx, "myset", "World").Result()
if err != nil {
panic(err)
}
fmt.Println(sAddResult2) // >>> 1
sAddResult3, err := rdb.SAdd(ctx, "myset", "World").Result()
if err != nil {
panic(err)
}
fmt.Println(sAddResult3) // >>> 0
sMembersResult, err := rdb.SMembers(ctx, "myset").Result()
if err != nil {
panic(err)
}
fmt.Println(sMembersResult) // >>> [Hello World]
package example_commands_test
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
func ExampleClient_sadd_cmd() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
sAddResult1, err := rdb.SAdd(ctx, "myset", "Hello").Result()
if err != nil {
panic(err)
}
fmt.Println(sAddResult1) // >>> 1
sAddResult2, err := rdb.SAdd(ctx, "myset", "World").Result()
if err != nil {
panic(err)
}
fmt.Println(sAddResult2) // >>> 1
sAddResult3, err := rdb.SAdd(ctx, "myset", "World").Result()
if err != nil {
panic(err)
}
fmt.Println(sAddResult3) // >>> 0
sMembersResult, err := rdb.SMembers(ctx, "myset").Result()
if err != nil {
panic(err)
}
fmt.Println(sMembersResult) // >>> [Hello World]
}
func ExampleClient_smembers_cmd() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
sAddResult, err := rdb.SAdd(ctx, "myset", "Hello", "World").Result()
if err != nil {
panic(err)
}
fmt.Println(sAddResult) // >>> 2
sMembersResult, err := rdb.SMembers(ctx, "myset").Result()
if err != nil {
panic(err)
}
fmt.Println(sMembersResult) // >>> [Hello World]
}
bool sAddResult1 = db.SetAdd("myset", "Hello");
Console.WriteLine(sAddResult1); // >>> True
bool sAddResult2 = db.SetAdd("myset", "World");
Console.WriteLine(sAddResult2); // >>> True
bool sAddResult3 = db.SetAdd("myset", "World");
Console.WriteLine(sAddResult2); // >>> False
RedisValue[] sAddResult4 = db.SetMembers("myset");
Array.Sort(sAddResult4);
Console.WriteLine(string.Join(", ", sAddResult4));
// >>> Hello, World
using StackExchange.Redis;
public class CmdsSetExample
{
public void Run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
bool sAddResult1 = db.SetAdd("myset", "Hello");
Console.WriteLine(sAddResult1); // >>> True
bool sAddResult2 = db.SetAdd("myset", "World");
Console.WriteLine(sAddResult2); // >>> True
bool sAddResult3 = db.SetAdd("myset", "World");
Console.WriteLine(sAddResult2); // >>> False
RedisValue[] sAddResult4 = db.SetMembers("myset");
Array.Sort(sAddResult4);
Console.WriteLine(string.Join(", ", sAddResult4));
// >>> Hello, World
long sMembersResult1 = db.SetAdd(
"myset", ["Hello", "World"]
);
Console.WriteLine(sMembersResult1); // >>> 2
RedisValue[] sMembersResult2 = db.SetMembers("myset");
Array.Sort(sMembersResult2);
Console.WriteLine(string.Join(", ", sMembersResult2));
// >>> Hello, World
}
}
$res1 = $r->sadd('myset', ['Hello', 'World']);
echo $res1 . PHP_EOL;
// >>> 2
$res2 = $r->sadd('myset', ['World']);
echo $res2 . PHP_EOL;
// >>> 0
$res3 = $r->smembers('myset');
sort($res3);
echo json_encode($res3) . PHP_EOL;
// >>> ["Hello","World"]
<?php
require 'vendor/autoload.php';
use Predis\Client as PredisClient;
class CmdSetTest
{
public function testCmdSet() {
$r = new PredisClient([
'scheme' => 'tcp',
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'database' => 0,
]);
$res1 = $r->sadd('myset', ['Hello', 'World']);
echo $res1 . PHP_EOL;
// >>> 2
$res2 = $r->sadd('myset', ['World']);
echo $res2 . PHP_EOL;
// >>> 0
$res3 = $r->smembers('myset');
sort($res3);
echo json_encode($res3) . PHP_EOL;
// >>> ["Hello","World"]
$res4 = $r->sadd('myset', ['Hello', 'World']);
echo $res4 . PHP_EOL;
// >>> 2
$res5 = $r->smembers('myset');
sort($res5);
echo json_encode($res5) . PHP_EOL;
// >>> ["Hello","World"]
}
}
res1 = r.sadd('myset', ['Hello', 'World'])
puts res1 # >>> 2
res2 = r.sadd('myset', ['World'])
puts res2 # >>> 0
res3 = r.smembers('myset')
puts res3.inspect # >>> ["Hello", "World"]
require 'redis'
r = Redis.new
res1 = r.sadd('myset', ['Hello', 'World'])
puts res1 # >>> 2
res2 = r.sadd('myset', ['World'])
puts res2 # >>> 0
res3 = r.smembers('myset')
puts res3.inspect # >>> ["Hello", "World"]
res4 = r.sadd('myset', ['Hello', 'World'])
puts res4 # >>> 2
res5 = r.smembers('myset')
puts res5.inspect # >>> ["Hello", "World"]
if let Ok(res1) = r.sadd("myset", &["Hello", "World"]) {
let res1: i32 = res1;
println!("{res1}"); // >>> 2
}
if let Ok(res2) = r.sadd("myset", "World") {
let res2: i32 = res2;
println!("{res2}"); // >>> 0
}
if let Ok(res3) = r.smembers("myset") {
let res3: HashSet<String> = res3;
println!("{res3:?}"); // >>> {"Hello", "World"}
}
mod cmds_set_tests {
use redis::Commands;
use std::collections::HashSet;
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(res1) = r.sadd("myset", &["Hello", "World"]) {
let res1: i32 = res1;
println!("{res1}"); // >>> 2
}
if let Ok(res2) = r.sadd("myset", "World") {
let res2: i32 = res2;
println!("{res2}"); // >>> 0
}
if let Ok(res3) = r.smembers("myset") {
let res3: HashSet<String> = res3;
println!("{res3:?}"); // >>> {"Hello", "World"}
}
if let Ok(res4) = r.sadd("myset", &["Hello", "World"]) {
let res4: i32 = res4;
println!("{res4}"); // >>> 2
}
if let Ok(res5) = r.smembers("myset") {
let res5: HashSet<String> = res5;
println!("{res5:?}"); // >>> {"Hello", "World"}
}
}
}
if let Ok(res1) = r.sadd("myset", &["Hello", "World"]).await {
let res1: i32 = res1;
println!("{res1}"); // >>> 2
}
if let Ok(res2) = r.sadd("myset", "World").await {
let res2: i32 = res2;
println!("{res2}"); // >>> 0
}
if let Ok(res3) = r.smembers("myset").await {
let res3: HashSet<String> = res3;
println!("{res3:?}"); // >>> {"Hello", "World"}
}
mod cmds_set_tests {
use redis::AsyncCommands;
use std::collections::HashSet;
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(res1) = r.sadd("myset", &["Hello", "World"]).await {
let res1: i32 = res1;
println!("{res1}"); // >>> 2
}
if let Ok(res2) = r.sadd("myset", "World").await {
let res2: i32 = res2;
println!("{res2}"); // >>> 0
}
if let Ok(res3) = r.smembers("myset").await {
let res3: HashSet<String> = res3;
println!("{res3:?}"); // >>> {"Hello", "World"}
}
if let Ok(res4) = r.sadd("myset", &["Hello", "World"]).await {
let res4: i32 = res4;
println!("{res4}"); // >>> 2
}
if let Ok(res5) = r.smembers("myset").await {
let res5: HashSet<String> = res5;
println!("{res5:?}"); // >>> {"Hello", "World"}
}
}
}
Redis Software and Redis Cloud compatibility
| Redis Software |
Redis Cloud |
Notes |
|---|---|---|
| ✅ Standard |
✅ Standard |
Return information
Integer reply: the number of elements that were added to the set, not including all the elements already present in the set.
History
- Starting with Redis version 2.4.0: Accepts multiple
memberarguments.