redis 字符串的基本用法和实现原理

马谦马谦马谦 Redis评论689字数 1595阅读 5 分 19 秒阅读模式

一、基本用法

字符串是 redis 中的基本数据类型之一,能存储任何形式的字符串,包括二进制数据。同时,它还可以进行字符串运算数据运算位运算等操作。一个字符串最大能有 512M 。

字符串主要的操作命令有两个:

  • GET KEY: 如果KEY存在就返回对应的值,如果不存在则返回空值nil
  • SET KEY VALUE: 给KEY设置值为VALUE,如果KEY已经存在则更新值。

例如:

字符串也支持同时给多个 key 同时赋值,方法为:

  • MGET key value [key value]: 同时设置多个键值。
  • MSET key value [key value]: 同时获取多个键值。

还有一个常用的操作就是在获取 key 的同时并设置 key 的值:

  • GETSET key value:给key赋值并返回先前的元素,如果元素不存在返回nil

二、 API 操作

字符串主要有以下操作命令:

2.1. APPEND

在尾部增加字符串,命令格式:append key value,成功将会返回添加后的字符串长度。

2.2. STRLEN

获取字符串长度,命令格式:strlen key,成功将会返回该值得长度。

2.3. GETRANGE

获取指定偏移范围内的字符,命令格式:getrange key start end,键不存在返回空。

和大多数程序语言一样,redis 的字符串下标从 0 开始,到 len(key) - 1 结束。要注意的是 redis 中可以使用-1 表示最后一位。

三、数据运算

当我们存入一个十进制整数或者浮点数到 redis 当中去的时候,redis 会自动察觉到这一点,并允许我们使用相关的命令来操作它们。

3.1 INCR 和 DECR

把整形数据加一或者减一,命令格式:incr key decr key,执行成功会返回增加过后的值,如果 key 不存在时会自动创建。

3.2 INCRBY 、 DECRBY 和 INCRBYFLOAT

增加或者删除指定的大小,命令格式为:incrby key incrementINCRBYDECRBY 针对整数,INCRBYFLOAT 针对浮点数,不可以使用 INCRBYDECRBY 操作浮点数。

使用数据运算的同时还可以字符串命令:

除了这些以外,redis 还支持位运算,可参考:Redis 中的位运算

四、实现原理

字符串内部使用了三种编码方式,分别是 int/raw/embstr 。

4.1 int 编码

当存储的字符串是一个整形数据的时候,redis 会自动以整形数据来保存。

当使用 int 类型编码的时候,字符串对象结构为:

redis字符串的基本用法和实现原理

4.2 raw 和 embstr 编码

raw 和 embstr 编码底层都是使用 sdshdr 来存储字符串,使用 raw 方式编码的字符串对象结构:

embstr 和 raw 编码的不同在于使用 embstr 编码的时候,redis 会把上面的 redisObject 和 shshdr 作为一个对象同时申请内存,它们在内存上是连续的,而 raw 编码的字符串在内存上并不连续。

当存储的字符串长度小于 39 时,redis 会使用 embstr 来编码。这样做的目的主要有以下几个:

  1. 减少内存的分配和释放次数
  2. 内存连续适合小对象缓存

 

  最后更新:2020-3-14
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2017 年 11 月 24 日 20:39:54
  • 转载请务必保留本文链接:https://www.dyxmq.cn/databases/redis/redis-string.html
redis源码分析:链表实现 Redis

redis 源码分析:链表实现

一、链表定义 链表在 redis 中的使用十分广泛,例如列表的底层实现之一就是链表,包括发布、订阅等等功能都是有用到链表的。 redis 中链表在 adlist.h 和 adlist.c 中实现,只用了 300+行代码...
redis中的发布和订阅 Redis

redis 中的发布和订阅

一、发布和订阅 除了任务队列以外,redis 还有一种基于 「发布/订阅」 模式的消息传递,使得客户端可以订阅某个频道,当频道有消息产生时,会把消息传递到所有的订阅者。和列表不一样的是,发布和订阅可以是一对...
Redis小案例(二):redis实现消息队列 Redis

Redis 小案例 (二):redis 实现消息队列

一、任务队列概述 消息队列,顾名思义就是一个用来传递任务的队列。消息队列在开发中十分常见,经常用在页面后台处理需要很长时间的操作时,例如发送邮件、短信以及进行复杂数据运算操作等,这些操作通常会阻塞页面...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证