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"