网站大量死链,沧县网站制作价格,体育直播网站建设,手机自媒体一键多平台appString 类型是 Redis 的最基本的数据类型#xff0c;一个 key 对应一个 value#xff0c;可以理解成与Memcached一模一样的类型。 String 类型是二进制安全的#xff0c;意思是 Redis 的 String 可以包含任何数据#xff0c;比如图片或者序列化的对象#xff0c;一个 Redi… String 类型是 Redis 的最基本的数据类型一个 key 对应一个 value可以理解成与Memcached一模一样的类型。 String 类型是二进制安全的意思是 Redis 的 String 可以包含任何数据比如图片或者序列化的对象一个 Redis 中字符串 value 最多可以是 512M。并且的存储是动态的意味着可以随时修改它本身的值每次分配内存时会高出实际字符串的 length这样采用预分配冗余空间方式来减少内存的频繁分配。 文章目录 1、String数据类型1.1、String类型简介1.2、String应用场景 2、String底层结构2.1、SDS简单动态字符串结构2.2、SDS简单动态字符串优点 3、String常用命令3.1、设定/获取操作3.2、自增/自减操作3.3、追加字符串3.4、删除字符串3.5、截取字符串3.6、替换字符串3.7、分布式锁设置3.8、设置过期时间3.9、批量操作设置3.10、获取字符串长度 1、String数据类型
1.1、String类型简介
String 类型是 Redis 的最基本的数据类型一个 key 对应一个 value可以理解成与Memcached一模一样的类型。
String 类型是二进制安全的意思是 Redis 的 String 可以包含任何数据比如图片或者序列化的对象一个 Redis 中字符串 value 最多可以是 512M。并且的存储是动态的意味着可以随时修改它本身的值每次分配内存时会高出实际字符串的 length这样采用预分配冗余空间方式来减少内存的频繁分配。
1.2、String应用场景
String 使用场景一般是存储简单的键值类型。比如用户信息登录信息配置信息等。还有一种用得比较多的是 string 的 “incr/decr” 操作即自减/自增操作。调用它是原子性的无论调用多少次都一一计算成功例如需要增减库存的操作。
应用场景
缓存基础数据例如缓存登录用户的基本的缓存数据但是建议使用 Hash 缓存计数器浏览量、点击数等。利用 string 的 “incr/decr” 操作即自减/自增操作并且它是原子性的限制请求次数也是利用 “incr” 方法以访问者的 ip 和其他信息作为 key访问一次增加一次计数超过次数则返回 false分布式共享 Session因为 Redis 是分布式的独立服务可以在多个应用之间共享所以可以用作分布式 Session 等场景分布式锁SET 命令有个 NX 参数可以实现「key不存在才插入」可以用它来实现分布式锁。 2、String底层结构
2.1、SDS简单动态字符串结构
Redis 使用 SDS 简单动态字符串Simple Dynamic StringSDS来表示字符串Redis 中字符串类型包含的数据结构有整数R_INT、字符串R_RAW。
我们以字符串为例子常规的字符串如 “Brand”如果要获取他的长度需要从头开始遍历直至遇到 ‘\0’ 空字符代表结尾如 C 字符串
C 字符串结构与 SDS 字符串结构对比图参照如下 结合上图来看其中
属性说明“Free”记录 Buf 数组中未使用字节的长度“Len”记录 Buf 数组中已使用字节的长度等于 “Buf[]” 中字符串的长度“Buf[]”字节数组用于保存字符串最后一个字节则保存了空字符 ‘\0’代表结尾。
2.2、SDS简单动态字符串优点
比起 C 字符串SDS 具有以下优点 时间方面SDS 获取字符串长度时间复杂度为 O(1) C 字符串不记录自身长度获取 C 字符串长度时必须遍历整个字符串计数得到复杂度是 O(N)SDS 字符串自身记录维护 “Len” 长度属性获得 SDS 字符串长度的复杂度是 O(1) 空间方面-空间预分配操作SDS 被修改后程序不仅会为 SDS 分配所需要的空间还会分配额外的未使用空间。这样Redis 可以减少连续执行字符串增长操作所需的内存重分配次数 空间方面-杜绝缓冲区溢出C 字符串不记录长度由于两个 C 字符串在内存存储上紧邻在执行字符串拼接 strcat 时如果不提前分配足够空间很可能发生修改 s1 的数据溢出到 s2 所在的空间中缓冲区溢出。SDS 杜绝了缓冲区溢出问题它记录了长度当修改 SDS 字符串之前API 都会检查 SDS 的空间是否满足修改的要求不满足 API 会自动进行空间扩展 具体分配未使用空间如下 2 种方式 如修改后长度 “Len” 小于 1MB就分配和 “Len” 属性相同大小的未使用空间FreeLen 如修改后长度 “Len” 大于等于 1MB就分配 1M 的未使用空间Free1MB 空间方面-惰性空间的释放SDS 避免了缩短字符串时所需的内存重分配操作并为将来可能有的增长操作提供了优化。当 SDS 做缩短操作不会立刻使用内存重分配来收回缩短后多出来的字节而是保持在 free 属性里。将来如果需要 append 操作则直接使用 “Free” 中未使用的空间减少了内存的分配步骤。另外SDS 也提供了 API 手动进行释放 SDS 未使用空间避免惰性释放策略会造成内存浪费 二进制安全二进制安全C 字符串的字符必须符合某种编码除结尾空字符以外字符串内部不允许有空字符串存储有局限性。而在 Redis 中不仅可以存储 String 类型的数据也可能存储一些二进制数据。二进制数据并不是规则的字符串格式其中会包含一些特殊的字符如 ‘\0’。在 C 中遇到 ‘\0’ 则表示字符串的结束但 SDS 不是它是以 “Len” 长度标识结尾 兼容 C 字符串函数SDS 虽然不仅二进制安全的还是秉承 C 字符串以空字符结尾的特性很多函数与 C 字符串一致不需要重写。 3、String常用命令
3.1、设定/获取操作
设定/获取 Key 值
SET key value # 设置指定 key 的值
GET key # 获取指定 key 的值3.2、自增/自减操作
自减/自增 Key 值
INCR key # 自增
DECR key # 自减String 类型除了可以存字符串也可以是数字。注意这里得是数字才可以进行 如果要带步长
INCRBY key num # 自增
DECRBY key num # 自减3.3、追加字符串
使用 append 追加字符串
APPEND key addvalueappend 命令后但会当前 string 长度。 3.4、删除字符串
使用 del 删除字符串
DEL key
DEL key1 key2 key33.5、截取字符串
使用 getrange 截取字符串
getrange key start end
getrange key 0 -1 # 查询全部3.6、替换字符串
使用 setrange 替换字符串
setrange key num value3.7、分布式锁设置
分布锁设置只有在 key 不存在时设置 key 的值
SETNX key value 3.8、设置过期时间
设置指定 key 的值并将 key 的过期时间设为 seconds 秒
SETEX key seconds value3.9、批量操作设置
一次性设置多个
MSET k1 v1 k2 v2 k3 v3一次性获取多个
MGET k1 k2 k3一次性设置多个事务只要有一个失败则都不成功
MSETNX k1 v1 k2 v2 k3 v33.10、获取字符串长度
使用 strlen 获取字符串长度
STRLEN key