Redis strings store sequences of bytes, including text, serialized objects, and binary arrays.
As such, strings are the simplest type of value you can associate with
a Redis key.
They're often used for caching, but they support additional functionality that lets you implement counters and perform bitwise operations, too.
Since Redis keys are strings, when we use the string type as a value too,
we are mapping a string to another string. The string data type is useful
for a number of use cases, like caching HTML fragments or pages.
importassertfrom'assert';import{createClient}from'redis';constclient=awaitcreateClient();awaitclient.connect();constres1=awaitclient.set("bike:1","Deimos");console.log(res1);// OK
constres2=awaitclient.get("bike:1");console.log(res2);// Deimos
constres3=awaitclient.set("bike:1","bike",{'NX':true});console.log(res3);// null
console.log(awaitclient.get("bike:1"));// Deimos
constres4=awaitclient.set("bike:1","bike",{'XX':true});console.log(res4);// OK
constres5=awaitclient.mSet([["bike:1","Deimos"],["bike:2","Ares"],["bike:3","Vanth"]]);console.log(res5);// OK
constres6=awaitclient.mGet(["bike:1","bike:2","bike:3"]);console.log(res6);// ['Deimos', 'Ares', 'Vanth']
awaitclient.set("total_crashes",0);constres7=awaitclient.incr("total_crashes");console.log(res7);// 1
constres8=awaitclient.incrBy("total_crashes",10);console.log(res8);// 11
packageio.redis.examples;importredis.clients.jedis.UnifiedJedis;importredis.clients.jedis.params.SetParams;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;publicclassStringExample{publicvoidrun(){try(UnifiedJedisjedis=newUnifiedJedis("redis://localhost:6379")){Stringres1=jedis.set("bike:1","Deimos");System.out.println(res1);// OK
Stringres2=jedis.get("bike:1");System.out.println(res2);// Deimos
Longres3=jedis.setnx("bike:1","bike");System.out.println(res3);// 0 (because key already exists)
System.out.println(jedis.get("bike:1"));// Deimos (value is unchanged)
Stringres4=jedis.set("bike:1","bike",SetParams.setParams().xx());// set the value to "bike" if it
// already
// exists
System.out.println(res4);// OK
Stringres5=jedis.mset("bike:1","Deimos","bike:2","Ares","bike:3","Vanth");System.out.println(res5);// OK
List<String>res6=jedis.mget("bike:1","bike:2","bike:3");System.out.println(res6);// [Deimos, Ares, Vanth]
jedis.set("total_crashes","0");Longres7=jedis.incr("total_crashes");System.out.println(res7);// 1
Longres8=jedis.incrBy("total_crashes",10);System.out.println(res8);// 11
}}}
packageexample_commands_testimport("context""fmt""github.com/redis/go-redis/v9")funcExampleClient_set_get(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res1,err:=rdb.Set(ctx,"bike:1","Deimos",0).Result()iferr!=nil{panic(err)}fmt.Println(res1)// >>> OK
res2,err:=rdb.Get(ctx,"bike:1").Result()iferr!=nil{panic(err)}fmt.Println(res2)// >>> Deimos
}funcExampleClient_setnx_xx(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res3,err:=rdb.SetNX(ctx,"bike:1","bike",0).Result()iferr!=nil{panic(err)}fmt.Println(res3)// >>> false
res4,err:=rdb.Get(ctx,"bike:1").Result()iferr!=nil{panic(err)}fmt.Println(res4)// >>> Deimos
res5,err:=rdb.SetXX(ctx,"bike:1","bike",0).Result()iferr!=nil{panic(err)}fmt.Println(res5)// >>> OK
}funcExampleClient_mset(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res6,err:=rdb.MSet(ctx,"bike:1","Deimos","bike:2","Ares","bike:3","Vanth").Result()iferr!=nil{panic(err)}fmt.Println(res6)// >>> OK
res7,err:=rdb.MGet(ctx,"bike:1","bike:2","bike:3").Result()iferr!=nil{panic(err)}fmt.Println(res7)// >>> [Deimos Ares Vanth]
}funcExampleClient_incr(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res8,err:=rdb.Set(ctx,"total_crashes","0",0).Result()iferr!=nil{panic(err)}fmt.Println(res8)// >>> OK
res9,err:=rdb.Incr(ctx,"total_crashes").Result()iferr!=nil{panic(err)}fmt.Println(res9)// >>> 1
res10,err:=rdb.IncrBy(ctx,"total_crashes",10).Result()iferr!=nil{panic(err)}fmt.Println(res10)// >>> 11
}
As you can see using the SET and the GET commands are the way we set
and retrieve a string value. Note that SET will replace any existing value
already stored into the key, in the case that the key already exists, even if
the key is associated with a non-string value. So SET performs an assignment.
Values can be strings (including binary data) of every kind, for instance you
can store a jpeg image inside a value. A value can't be bigger than 512 MB.
The SET command has interesting options, that are provided as additional
arguments. For example, I may ask SET to fail if the key already exists,
or the opposite, that it only succeed if the key already exists:
> set bike:1 bike nx
(nil)
> set bike:1 bike xx
OK
importassertfrom'assert';import{createClient}from'redis';constclient=awaitcreateClient();awaitclient.connect();constres1=awaitclient.set("bike:1","Deimos");console.log(res1);// OK
constres2=awaitclient.get("bike:1");console.log(res2);// Deimos
constres3=awaitclient.set("bike:1","bike",{'NX':true});console.log(res3);// null
console.log(awaitclient.get("bike:1"));// Deimos
constres4=awaitclient.set("bike:1","bike",{'XX':true});console.log(res4);// OK
constres5=awaitclient.mSet([["bike:1","Deimos"],["bike:2","Ares"],["bike:3","Vanth"]]);console.log(res5);// OK
constres6=awaitclient.mGet(["bike:1","bike:2","bike:3"]);console.log(res6);// ['Deimos', 'Ares', 'Vanth']
awaitclient.set("total_crashes",0);constres7=awaitclient.incr("total_crashes");console.log(res7);// 1
constres8=awaitclient.incrBy("total_crashes",10);console.log(res8);// 11
packageio.redis.examples;importredis.clients.jedis.UnifiedJedis;importredis.clients.jedis.params.SetParams;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;publicclassStringExample{publicvoidrun(){try(UnifiedJedisjedis=newUnifiedJedis("redis://localhost:6379")){Stringres1=jedis.set("bike:1","Deimos");System.out.println(res1);// OK
Stringres2=jedis.get("bike:1");System.out.println(res2);// Deimos
Longres3=jedis.setnx("bike:1","bike");System.out.println(res3);// 0 (because key already exists)
System.out.println(jedis.get("bike:1"));// Deimos (value is unchanged)
Stringres4=jedis.set("bike:1","bike",SetParams.setParams().xx());// set the value to "bike" if it
// already
// exists
System.out.println(res4);// OK
Stringres5=jedis.mset("bike:1","Deimos","bike:2","Ares","bike:3","Vanth");System.out.println(res5);// OK
List<String>res6=jedis.mget("bike:1","bike:2","bike:3");System.out.println(res6);// [Deimos, Ares, Vanth]
jedis.set("total_crashes","0");Longres7=jedis.incr("total_crashes");System.out.println(res7);// 1
Longres8=jedis.incrBy("total_crashes",10);System.out.println(res8);// 11
}}}
packageexample_commands_testimport("context""fmt""github.com/redis/go-redis/v9")funcExampleClient_set_get(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res1,err:=rdb.Set(ctx,"bike:1","Deimos",0).Result()iferr!=nil{panic(err)}fmt.Println(res1)// >>> OK
res2,err:=rdb.Get(ctx,"bike:1").Result()iferr!=nil{panic(err)}fmt.Println(res2)// >>> Deimos
}funcExampleClient_setnx_xx(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res3,err:=rdb.SetNX(ctx,"bike:1","bike",0).Result()iferr!=nil{panic(err)}fmt.Println(res3)// >>> false
res4,err:=rdb.Get(ctx,"bike:1").Result()iferr!=nil{panic(err)}fmt.Println(res4)// >>> Deimos
res5,err:=rdb.SetXX(ctx,"bike:1","bike",0).Result()iferr!=nil{panic(err)}fmt.Println(res5)// >>> OK
}funcExampleClient_mset(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res6,err:=rdb.MSet(ctx,"bike:1","Deimos","bike:2","Ares","bike:3","Vanth").Result()iferr!=nil{panic(err)}fmt.Println(res6)// >>> OK
res7,err:=rdb.MGet(ctx,"bike:1","bike:2","bike:3").Result()iferr!=nil{panic(err)}fmt.Println(res7)// >>> [Deimos Ares Vanth]
}funcExampleClient_incr(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res8,err:=rdb.Set(ctx,"total_crashes","0",0).Result()iferr!=nil{panic(err)}fmt.Println(res8)// >>> OK
res9,err:=rdb.Incr(ctx,"total_crashes").Result()iferr!=nil{panic(err)}fmt.Println(res9)// >>> 1
res10,err:=rdb.IncrBy(ctx,"total_crashes",10).Result()iferr!=nil{panic(err)}fmt.Println(res10)// >>> 11
}
There are a number of other commands for operating on strings. For example
the GETSET command sets a key to a new value, returning the old value as the
result. You can use this command, for example, if you have a
system that increments a Redis key using INCR
every time your web site receives a new visitor. You may want to collect this
information once every hour, without losing a single increment.
You can GETSET the key, assigning it the new value of "0" and reading the
old value back.
The ability to set or retrieve the value of multiple keys in a single
command is also useful for reduced latency. For this reason there are
the MSET and MGET commands:
importassertfrom'assert';import{createClient}from'redis';constclient=awaitcreateClient();awaitclient.connect();constres1=awaitclient.set("bike:1","Deimos");console.log(res1);// OK
constres2=awaitclient.get("bike:1");console.log(res2);// Deimos
constres3=awaitclient.set("bike:1","bike",{'NX':true});console.log(res3);// null
console.log(awaitclient.get("bike:1"));// Deimos
constres4=awaitclient.set("bike:1","bike",{'XX':true});console.log(res4);// OK
constres5=awaitclient.mSet([["bike:1","Deimos"],["bike:2","Ares"],["bike:3","Vanth"]]);console.log(res5);// OK
constres6=awaitclient.mGet(["bike:1","bike:2","bike:3"]);console.log(res6);// ['Deimos', 'Ares', 'Vanth']
awaitclient.set("total_crashes",0);constres7=awaitclient.incr("total_crashes");console.log(res7);// 1
constres8=awaitclient.incrBy("total_crashes",10);console.log(res8);// 11
packageio.redis.examples;importredis.clients.jedis.UnifiedJedis;importredis.clients.jedis.params.SetParams;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;publicclassStringExample{publicvoidrun(){try(UnifiedJedisjedis=newUnifiedJedis("redis://localhost:6379")){Stringres1=jedis.set("bike:1","Deimos");System.out.println(res1);// OK
Stringres2=jedis.get("bike:1");System.out.println(res2);// Deimos
Longres3=jedis.setnx("bike:1","bike");System.out.println(res3);// 0 (because key already exists)
System.out.println(jedis.get("bike:1"));// Deimos (value is unchanged)
Stringres4=jedis.set("bike:1","bike",SetParams.setParams().xx());// set the value to "bike" if it
// already
// exists
System.out.println(res4);// OK
Stringres5=jedis.mset("bike:1","Deimos","bike:2","Ares","bike:3","Vanth");System.out.println(res5);// OK
List<String>res6=jedis.mget("bike:1","bike:2","bike:3");System.out.println(res6);// [Deimos, Ares, Vanth]
jedis.set("total_crashes","0");Longres7=jedis.incr("total_crashes");System.out.println(res7);// 1
Longres8=jedis.incrBy("total_crashes",10);System.out.println(res8);// 11
}}}
packageexample_commands_testimport("context""fmt""github.com/redis/go-redis/v9")funcExampleClient_set_get(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res1,err:=rdb.Set(ctx,"bike:1","Deimos",0).Result()iferr!=nil{panic(err)}fmt.Println(res1)// >>> OK
res2,err:=rdb.Get(ctx,"bike:1").Result()iferr!=nil{panic(err)}fmt.Println(res2)// >>> Deimos
}funcExampleClient_setnx_xx(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res3,err:=rdb.SetNX(ctx,"bike:1","bike",0).Result()iferr!=nil{panic(err)}fmt.Println(res3)// >>> false
res4,err:=rdb.Get(ctx,"bike:1").Result()iferr!=nil{panic(err)}fmt.Println(res4)// >>> Deimos
res5,err:=rdb.SetXX(ctx,"bike:1","bike",0).Result()iferr!=nil{panic(err)}fmt.Println(res5)// >>> OK
}funcExampleClient_mset(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res6,err:=rdb.MSet(ctx,"bike:1","Deimos","bike:2","Ares","bike:3","Vanth").Result()iferr!=nil{panic(err)}fmt.Println(res6)// >>> OK
res7,err:=rdb.MGet(ctx,"bike:1","bike:2","bike:3").Result()iferr!=nil{panic(err)}fmt.Println(res7)// >>> [Deimos Ares Vanth]
}funcExampleClient_incr(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res8,err:=rdb.Set(ctx,"total_crashes","0",0).Result()iferr!=nil{panic(err)}fmt.Println(res8)// >>> OK
res9,err:=rdb.Incr(ctx,"total_crashes").Result()iferr!=nil{panic(err)}fmt.Println(res9)// >>> 1
res10,err:=rdb.IncrBy(ctx,"total_crashes",10).Result()iferr!=nil{panic(err)}fmt.Println(res10)// >>> 11
}
importassertfrom'assert';import{createClient}from'redis';constclient=awaitcreateClient();awaitclient.connect();constres1=awaitclient.set("bike:1","Deimos");console.log(res1);// OK
constres2=awaitclient.get("bike:1");console.log(res2);// Deimos
constres3=awaitclient.set("bike:1","bike",{'NX':true});console.log(res3);// null
console.log(awaitclient.get("bike:1"));// Deimos
constres4=awaitclient.set("bike:1","bike",{'XX':true});console.log(res4);// OK
constres5=awaitclient.mSet([["bike:1","Deimos"],["bike:2","Ares"],["bike:3","Vanth"]]);console.log(res5);// OK
constres6=awaitclient.mGet(["bike:1","bike:2","bike:3"]);console.log(res6);// ['Deimos', 'Ares', 'Vanth']
awaitclient.set("total_crashes",0);constres7=awaitclient.incr("total_crashes");console.log(res7);// 1
constres8=awaitclient.incrBy("total_crashes",10);console.log(res8);// 11
packageio.redis.examples;importredis.clients.jedis.UnifiedJedis;importredis.clients.jedis.params.SetParams;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;publicclassStringExample{publicvoidrun(){try(UnifiedJedisjedis=newUnifiedJedis("redis://localhost:6379")){Stringres1=jedis.set("bike:1","Deimos");System.out.println(res1);// OK
Stringres2=jedis.get("bike:1");System.out.println(res2);// Deimos
Longres3=jedis.setnx("bike:1","bike");System.out.println(res3);// 0 (because key already exists)
System.out.println(jedis.get("bike:1"));// Deimos (value is unchanged)
Stringres4=jedis.set("bike:1","bike",SetParams.setParams().xx());// set the value to "bike" if it
// already
// exists
System.out.println(res4);// OK
Stringres5=jedis.mset("bike:1","Deimos","bike:2","Ares","bike:3","Vanth");System.out.println(res5);// OK
List<String>res6=jedis.mget("bike:1","bike:2","bike:3");System.out.println(res6);// [Deimos, Ares, Vanth]
jedis.set("total_crashes","0");Longres7=jedis.incr("total_crashes");System.out.println(res7);// 1
Longres8=jedis.incrBy("total_crashes",10);System.out.println(res8);// 11
}}}
packageexample_commands_testimport("context""fmt""github.com/redis/go-redis/v9")funcExampleClient_set_get(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res1,err:=rdb.Set(ctx,"bike:1","Deimos",0).Result()iferr!=nil{panic(err)}fmt.Println(res1)// >>> OK
res2,err:=rdb.Get(ctx,"bike:1").Result()iferr!=nil{panic(err)}fmt.Println(res2)// >>> Deimos
}funcExampleClient_setnx_xx(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res3,err:=rdb.SetNX(ctx,"bike:1","bike",0).Result()iferr!=nil{panic(err)}fmt.Println(res3)// >>> false
res4,err:=rdb.Get(ctx,"bike:1").Result()iferr!=nil{panic(err)}fmt.Println(res4)// >>> Deimos
res5,err:=rdb.SetXX(ctx,"bike:1","bike",0).Result()iferr!=nil{panic(err)}fmt.Println(res5)// >>> OK
}funcExampleClient_mset(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res6,err:=rdb.MSet(ctx,"bike:1","Deimos","bike:2","Ares","bike:3","Vanth").Result()iferr!=nil{panic(err)}fmt.Println(res6)// >>> OK
res7,err:=rdb.MGet(ctx,"bike:1","bike:2","bike:3").Result()iferr!=nil{panic(err)}fmt.Println(res7)// >>> [Deimos Ares Vanth]
}funcExampleClient_incr(){ctx:=context.Background()rdb:=redis.NewClient(&redis.Options{Addr:"localhost:6379",Password:"",// no password docs
DB:0,// use default DB
})res8,err:=rdb.Set(ctx,"total_crashes","0",0).Result()iferr!=nil{panic(err)}fmt.Println(res8)// >>> OK
res9,err:=rdb.Incr(ctx,"total_crashes").Result()iferr!=nil{panic(err)}fmt.Println(res9)// >>> 1
res10,err:=rdb.IncrBy(ctx,"total_crashes",10).Result()iferr!=nil{panic(err)}fmt.Println(res10)// >>> 11
}
The INCR command parses the string value as an integer,
increments it by one, and finally sets the obtained value as the new value.
There are other similar commands like INCRBY,
DECR and DECRBY. Internally it's
always the same command, acting in a slightly different way.
What does it mean that INCR is atomic?
That even multiple clients issuing INCR against
the same key will never enter into a race condition. For instance, it will never
happen that client 1 reads "10", client 2 reads "10" at the same time, both
increment to 11, and set the new value to 11. The final value will always be
12 and the read-increment-set operation is performed while all the other
clients are not executing a command at the same time.
Limits
By default, a single Redis string can be a maximum of 512 MB.
Most string operations are O(1), which means they're highly efficient.
However, be careful with the SUBSTR, GETRANGE, and SETRANGE commands, which can be O(n).
These random-access string commands may cause performance issues when dealing with large strings.
Alternatives
If you're storing structured data as a serialized string, you may also want to consider Redis hashes or JSON.