与C语言类似,redis自己创建了简单动态字符串SDS(SimpleDynamicString)即简单动态字符串,创建字符串类型的键值对,SDS表示字符串值,键值对的值为字符串对象 SDS用途可以做缓冲区,客户端状态输入缓冲,AOF持久化缓冲区等。SDS结构及定义structsdshdr{intlen;sds字符串的长度intfree;记录buff数组未使用的数组长度,为0则表示charbuff〔〕;字节数组,保存字符串,最后一个字节保存} 最后一个空字符不在SDS的len属性。SDS和C字符串区别o(1)复杂度获取字符串长度。与C不同(O(N)),C不计入字符串长度需要遍历,而SDS有自己的len属性记录长度且有自己的api更新设置。缓冲区不会溢出。C的字符串不计入自身长度,所以分配内存都假设分配足够多内存,但是如果要修改更长的字符串就会溢出。之所以SDS为动态的就体现在这,在分配资源时,会检查空间是否满足修改的要求,不满足会扩展SDS修改要的大小,再进行修改。减少内存重分配。增长字符串C如果不重分配会缓冲区溢出,减少会内存重分配释放空间,造成内存泄漏。对于redis来说,这两操作较多,重分配次数多了性能会收到制约。空间先分配。修改扩展时会预分配额外未使用的空间。分两种情况。SDS修改之后长度小于1MB,free分配与len值相同的空间,总长度lenlen1修改后的len大于1MB,则会分配1MB的未使用空间,实际总长度len1MB1byte 这样下次再修改会有足够的空间存储不用再重分配惰性空间释放。用于缩短字符串操作。当缩短字符串时,先不内存重分配回收多出的字节,用free记录这些字节属性,以便后续使用,比如增长字符串操作。 SDS的buff数组保存二进制数据,文本数据以及二进制流。SDS还兼容部分c函数SDS相关操作API 1hrSETkeyvalue 设置指定key的值。 2hrGETkey 获取指定key的值。 3hrGETRANGEkeystartend 返回key中字符串值的子字符 4hrGETSETkeyvalue 将给定key的值设为value,并返回key的旧值(oldvalue)。 5hrGETBITkeyoffset 对key所储存的字符串值,获取指定偏移量上的位(bit)。 6hrMGETkey1〔key2。。〕 获取所有(一个或多个)给定key的值。 7hrSETBITkeyoffsetvalue 对key所储存的字符串值,设置或清除指定偏移量上的位(bit)。 8hrSETEXkeysecondsvalue 将值value关联到key,并将key的过期时间设为seconds(以秒为单位)。 9hrSETNXkeyvalue 只有在key不存在时设置key的值。 10hrSETRANGEkeyoffsetvalue 用value参数覆写给定key所储存的字符串值,从偏移量offset开始。 11hrSTRLENkey 返回key所储存的字符串值的长度。 12hrMSETkeyvalue〔keyvalue。。。〕 同时设置一个或多个keyvalue对。 13hrMSETNXkeyvalue〔keyvalue。。。〕 同时设置一个或多个keyvalue对,当且仅当所有给定key都不存在。 14hrPSETEXkeymillisecondsvalue 这个命令和SETEX命令相似,但它以毫秒为单位设置key的生存时间,而不是像SETEX命令那样,以秒为单位。 15hrINCRkey 将key中储存的数字值增一。 16hrINCRBYkeyincrement 将key所储存的值加上给定的增量值(increment)。 17hrINCRBYFLOATkeyincrement 将key所储存的值加上给定的浮点增量值(increment)。 18hrDECRkey 将key中储存的数字值减一。 19hrDECRBYkeydecrement key所储存的值减去给定的减量值(decrement)。 20hrAPPENDkeyvalue 如果key已经存在并且是一个字符串,APPEND命令将指定的value追加到该key原来值(value)的末尾。应用场景: 一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。计数器127。0。0。1:6379setnumber1OK127。0。0。1:6379incrnumber将key中储存的数字值增一(integer)2127。0。0。1:6379getnumber2127。0。0。1:6379decrnumber将key中储存的数字值减一(integer)1127。0。0。1:6379getnumber1 本文来自https:www。cnblogs。comfirsthandp16079140。html