8.2 字符串对象

字符串对象的编码可以是intraw或者embstr
如果字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么字符串对象会将整数值保存在字符串对象结构的ptr属性里面,并将字符串对象的编码设置为int
如果字符串对象保存的是一个字符串值,并且这个字符串值的长度大于32字节,那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值,并将对象的编码设置为raw
如果字符串对象保存的是一个字符串值,并且这个字符串值的长度小于等于32字节,那么字符串对象将使用embstr编码的方式来保存这个字符串值。
embstr编码是专门用于保存短字符串的一种优化编码方式,这种编码和raw编码一样,都是用redisObject结构和sdshdr结构来表示字符串对象,但raw编码会调用两次内存分配函数来分别创建redisObject结构和sdshdr结构,而embstr编码则通过调用一次内存分配一块连续的空间,空间中依次包含redisObjectsdshdr两个结构。
embstr编码的字符串对象在执行命令时,产生的效果和raw编码的字符串对象执行命令时产生的效果是相同的,优点如下:

  • embstr编码将创建字符串对象所需的内存分配次数从raw编码的两次降低为一次。
  • 释放embstr编码的字符串对象只需要调用一次内存释放函数,而释放raw编码的字符串对象需要调用两次内存释放函数。
  • embstr编码的字符串对象的所有数据都保存在一块连续的内存里面,所以这种编码的字符串对象比起raw编码的字符串对象能够能好的利用缓存带来的优势。

可以用long double类型表示的浮点数在redis中也是作为字符串值来保存的。如果我们要保存一个浮点数到字符串对象里面,那么程序会先将这个浮点数转换成字符串值,然后在保存转换所得到的字符串值。
在有需要的时候,程序会将保存在字符串对象里面的字符串值转换为浮点数值,执行某些操作,然后再将执行操作所得的浮点数职转换为字符串值,并继续保存在字符串对象里面。

编码的转换

int编码的字符串对象和embstr编码的字符串对象在条件满足的情况下,会被转换为raw编码的字符串对象。
int编码的字符串对象来说,执行某些命令之后,使得这个对象保存的不在是整数值,而是一个字符串值,那么字符串对象的编码将从int变为raw
Redis没有为embstr编码的字符串对象编写任何响应的修改程序(只有int编码的字符串对象和raw编码的字符串对象有这些程序),所以embstr编码的字符串对象实际上是只读的。当我们对embstr编码的字符串对象执行任何修改命令时,程序会将对象的编码从embstr转换成raw,然后再执行修改命令。

8.2.2 字符串命令

1. APPEND
APPEND key value

如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值的末尾。
如果key不存在,APPEND就简单地将给定key设为value,就像执行SET key value一样。

2. BITCOUNT
BITCOUNT key [start] [end]

计算给定字符串中,被设置为1的比特位的数量。
一般情况下,给定的整个字符串都会被进行计数,通过指定额外的startend参数,可以让计数只在特定的位上进行。
startend参数的设置和GETRANGE命令类似,都可以使用负数值: 比如-1表示最后一个字节,-2表示倒数第二个字节,以此类推。
不存在的key被当成是空字符串来处理,因此对一个不存在的key进行BITCOUNT操作,结果为0

用途:bitmap实现用户上线次数统计

3. BITOP
BITOP operation destkey key [key ...]

对一个或多个保存二进制位的字符串key进行位元操作,并将结果保存到destkey上。
operation可以是ANDORNOTXOR这四种操作中的任意一种:
-BITOP AND destkey key [key ...],对一个或多个key求逻辑并,并将结果保存到destkey
-BITOP OR destkey key [key ...],对一个或多个key求逻辑或,并将结果保存到destkey
-BITOP XOR destkey key [key ...],对一个或多个key求逻辑异或,并将结果保存到destkey
-BITOP NOT destkey key,对给定key求逻辑非,并将结果保存到destkey
除了NOT操作之外,其他操作都可以接受一个或多个key作为输入。

4. BITFIELD
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
5. DECR
DECR key

key中储存的数字值减一。
如果key不存在,那么key的值会先被初始化为0,然后再执行DECR操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64位(bit)有符号数字表示之内。

6. DECRBY
DECRBY key decrement

key所储存的值减去减量decrement
如果key不存在,那么key的值会先被初始化为0,然后再执行DECRBY操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64位(bit)有符号数字表示之内。

7. GET
GET key

返回key所关联的字符串值。
如果key不存在那么返回特殊值nil
假如key储存的值不是字符串类型,返回一个错误,因为GET只能用于处理字符串值。

8. GETBIT
GETBIT key offset

key所储存的字符串值,获取指定偏移量上的位(bit)。
offset比字符串值的长度大,或者key不存在时,返回0

9. GETRANGE
GETRANGE key start end

返回key中字符串值的子字符串,字符串的截取范围由startend两个偏移量决定(包括startend在内)。
负数偏移量表示从字符串最后开始计数,-1表示最后一个字符,-2表示倒数第二个,以此类推。
GETRANGE通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。

10. GETSET
GETSET key value

将给定key的值设为value,并返回key的旧值(old value)。
key存在但不是字符串类型时,返回一个错误。

11. INCR
INCR key

key中储存的数字值增一。
如果key不存在,那么key的值会先被初始化为0,然后再执行INCR操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64位(bit)有符号数字表示之内。

12. INCRBY
INCRBY key increment

key所储存的值加上增量increment
如果key不存在,那么key的值会先被初始化为0,然后再执行INCRBY命令。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64位(bit)有符号数字表示之内。

13. INCRBYFLOAT
INCRBYFLOAT key increment

key中所储存的值加上浮点数增量increment
如果key不存在,那么INCRBYFLOAT会先将key的值设为0,再执行加法操作。
如果命令执行成功,那么key的值会被更新为(执行加法之后的)新值,并且新值会以字符串的形式返回给调用者。

14. MGET
MGET key[key...]

返回所有(一个或多个)给定key的值。
如果给定的key里面,有某个key不存在,那么这个key返回特殊值nil。因此,该命令永不失败。

15. MSET
MSET key value [key value ...]

同时设置一个或多个key-value对。
如果某个给定key已经存在,那么MSET会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用MSETNX命令:它只会在所有给定key都不存在的情况下进行设置操作。
MSET是一个原子性(atomic)操作,所有给定key都会在同一时间内被设置,某些给定key被更新而另一些给定key没有改变的情况,不可能发生。

16. MSETNX
MSETNX key value [key value ...]

同时设置一个或多个key-value对,当且仅当所有给定key都不存在。
即使只有一个给定key已存在,MSETNX也会拒绝执行所有给定key的设置操作。
MSETNX是原子性的,因此它可以用作设置多个不同key表示不同字段(field)的唯一性逻辑对象(unique logic object),所有字段要么全被设置,要么全不被设置。

17. PSETEX
PSETEX key milliseconds value

这个命令和SETEX命令相似,但它以毫秒为单位设置key的生存时间,而不是像SETEX命令那样,以秒为单位。

18. SET
SET key value [EX seconds] [PX milliseconds] [NX|XX]

将字符串值value关联到key
如果key已经持有其他值,SET就覆写旧值,无视类型。

19. SETBIT
SETBIT key offset value

key所储存的字符串值,设置或清除指定偏移量上的位(bit)。
位的设置或清除取决于value参数,可以是0也可以是1
key不存在时,自动生成一个新的字符串值。
字符串会进行伸展(grown)以确保它可以将value保存在指定的偏移量上。当字符串值进行伸展时,空白位置以0填充。

20. SETEX
SETEX key seconds value

将值value关联到key,并将key的生存时间设为seconds(以秒为单位)。
如果key已经存在,SETEX命令将覆写旧值。

21. SETNX
SETNX key value

key的值设为value,当且仅当key不存在。
若给定的key已经存在,则SETNX不做任何动作。

22. SETRANGE
SETRANGE key offset value

value参数覆写(overwrite)给定key所储存的字符串值,从偏移量offset开始。
不存在的key当作空白字符串处理。

23. STRLEN
STRLEN key

返回key所储存的字符串值的长度。
key储存的不是字符串值时,返回一个错误。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容