SDS使用结构体实现,结构体中的len属性直接记录了该SDS结构体中buf数组中已使用的长度,所以获取字符串长度时,只须要获取len属性的值,这个操做的复杂度为O(1)。
SDS实现了空间预分配和惰性空间释放两种优化策略,减小了修改字符串时内存分配的次数。
SDS被修改时会自动动态扩展至修改值的长度大小,避免了内存溢出问题。redis
127.0.0.1:6379> exists key1 (integer) 0 127.0.0.1:6379> append key1 "hello" (integer) 5 127.0.0.1:6379> append key1 " world" (integer) 11 127.0.0.1:6379> get key1 "hello world" 127.0.0.1:6379>
127.0.0.1:6379> bitcount bits (integer) 0 127.0.0.1:6379> setbit bits 5 1 (integer) 0 127.0.0.1:6379> bitcount bits (integer) 1 127.0.0.1:6379> setbit bits 4 1 (integer) 0 127.0.0.1:6379> bitcount bits (integer) 2 127.0.0.1:6379>
127.0.0.1:6379> set key2 "11" OK 127.0.0.1:6379> decr key2 (integer) 10 127.0.0.1:6379> decr key3 //key3 不存在 (integer) -1 127.0.0.1:6379> get key3 "-1" 127.0.0.1:6379> SET key4 "234293482390480948029348230948" OK 127.0.0.1:6379> decr key4 (error) ERR value is not an integer or out of range
127.0.0.1:6379> set key5 12 OK 127.0.0.1:6379> decrby key5 5 (integer) 7 127.0.0.1:6379> 其他同decr命令 //GET key 返回key的value。若是key不存在,返回特殊值nil。若是key的value不是string,就返回错误,由于GET只处理string类型的values。 //SET key value [EX seconds] [PX milliseconds] [NX|XX] 将键key设定为指定的“字符串”值。 若是 key 已经保存了一个值,那么这个操做会直接覆盖原来的值,而且忽略原始类型。 当set命令执行成功以后,以前设置的过时时间都将失效 127.0.0.1:6379> get key6 (nil) 127.0.0.1:6379> set key6 test OK 127.0.0.1:6379> get key6 "test"
127.0.0.1:6379> setbit key7 6 1 (integer) 0 127.0.0.1:6379> getbit key7 6 (integer) 1 127.0.0.1:6379> getbit key7 100 (integer) 0
127.0.0.1:6379> incr key8 (integer) 1 127.0.0.1:6379> incr key8 (integer) 2 127.0.0.1:6379> get key8 "2"
127.0.0.1:6379> incrby key9 10 (integer) 10 127.0.0.1:6379> incrby key9 1 (integer) 11 127.0.0.1:6379> get key9 "11"
EXPIRE mykey seconds数组
SETEX是原子的,也能够经过把上面两个命令放到MULTI/EXEC块中执行的方式重现。相比连续执行上面两个命令,它更快,由于当Redis当作缓存使用时,这个操做更加经常使用。缓存
127.0.0.1:6379> setnx key10 "hello" (integer) 1 127.0.0.1:6379> setnx key10 "world" (integer) 0 127.0.0.1:6379> get key10 "hello"