当前位置: 首页 > news >正文

【Redis】string类型

目录

  • 1、介绍
  • 2、底层实现
    • 【1】SDS
    • 【2】int编码
    • 【3】embstr编码
    • 【4】raw编码
    • 【5】embstr和raw的区别
  • 3、常用指令
    • 【1】字符串基本操作:
    • 【2】批量操作
    • 【3】计数器
    • 【4】过期时间
    • 【5】不存在就插入
  • 4、使用场景

1、介绍

string是redis中最简单的键值对形式,它的value除了可以是字符串,还可以是数字、二进制数据,value的最大长度为521M,其底层主要通过int和SDS(简单动态字符串)组成。

2、底层实现

【1】SDS

SDS是redis的底层数据结构之一,其结构如下:

struct sdshdr {
    int len;    // 已使用的字节数
    int free;   // 未使用的空闲字节数
    char buf[]; // 存储字符的柔性数组
};

其功能为:

功能解释
预分配空间当字符串增长时,free记录额外分配的空间,避免频繁内存重新分配
惰性释放当字符串缩短时,free记录回收的空间,供后续复用,不会立即释放

与C字符串相比:

特性C字符串SDS
长度获取遍历到\0,时间复杂度为O(N)直接读len,时间复杂度为O(1)
修改时的内存重分配每次修改均需重分配通过free进行"预分配/惰性释放"
二进制安全无法存储含\0的数据通过len判断边界,支持二进制存储

【2】int编码

当string类型存储整型数据时,底层就采用了int编码方式,其存储结构可以如图表示:

在这里插入图片描述

【3】embstr编码

如果string类型存储字符串数据时,当字符串长度比较小时,也就是小于44字节(redis不同版本有差异),就采用embstr编码来存储短字符串,这时就用到了SDS数据结构,其存储结构如图表示:

在这里插入图片描述

【4】raw编码

如果string类型存储字符串数据时,当字符串长度大于44字节时,就采样raw编码来存储字符串,虽然raw编码也使用了SDS数据结构,但是和redis的基本结构不是连续的,结构如图所示:

在这里插入图片描述

【5】embstr和raw的区别

embstr编码和raw编码的区别如下:

对比维度embstrraw
存储结构RedisObject和SDS连续存储在同一内存块RedisObject和SDS分来存储
内存分配次数1次分配2次分配
访问效率更高,内存连续稍低,两次访问
修改时的行为任何修改操作都会转换为raw编码直接修改
适用场景短字符串长字符串
内存碎片更少更多
最大长度44B521MB

3、常用指令

【1】字符串基本操作:

#设置key-value
127.0.0.1:6379[2]> set animal cat  
OK

#查看key对应的value
127.0.0.1:6379[2]> get animal
"cat"

#判断key是否存在,存在返回1
127.0.0.1:6379[2]> exists animal
(integer) 1

#判断key是否存在,不存在返回0
127.0.0.1:6379[2]> exists work
(integer) 0

#获取key的长度
127.0.0.1:6379[2]> strlen animal
(integer) 3

#删除对应的key-value
127.0.0.1:6379[2]> del animal
(integer) 1

【2】批量操作

#批量设置key-value
127.0.0.1:6379[2]> mset animal cat hobby eat
OK

#批量获取key-value
127.0.0.1:6379[2]> mget animal hobby
1) "cat"
2) "eat"

【3】计数器

#设置数字10
127.0.0.1:16379[2]> set number 10
OK
127.0.0.1:16379[2]> get number
"10"

#number自增+1
127.0.0.1:6379[2]> incr number
(integer) 11
127.0.0.1:6379[2]> get number
"11"

#number自增+100
127.0.0.1:6379[2]> incrby number 100
(integer) 111
127.0.0.1:6379[2]> get number
"111"

#number自增-1
127.0.0.1:6379[2]> decr number
(integer) 110
127.0.0.1:6379[2]> get number
"110"

#number自增-100
127.0.0.1:6379[2]> decrby number 100
(integer) 10
127.0.0.1:6379[2]> get number
"10"

【4】过期时间

#查看key的过期时间,-1代表永不过期
127.0.0.1:6379[2]> ttl animal
(integer) -1

#给已存在的key设置过期时间
127.0.0.1:6379[2]> expire animal 60
(integer) 1
#还剩58秒过期
127.0.0.1:6379[2]> ttl animal
(integer) 58
#-2代表key不存在,也就是已过期
127.0.0.1:6379[2]> ttl animal
(integer) -2

#设置key-value并设置过期时间,第一种设置方式
127.0.0.1:6379[2]> set cat sleep ex 60
OK
127.0.0.1:6379[2]> ttl cat
(integer) 57

#设置key-value并设置过期时间,第二种设置方式
127.0.0.1:6379[2]> setex dog 60 play
OK
127.0.0.1:6379[2]> ttl dog
(integer) 54

【5】不存在就插入

#返回1代表不存在插入成功
127.0.0.1:6379[2]> setnx animal cat
(integer) 1

#返回0表达已存在插入失败
127.0.0.1:6379[2]> setnx animal cat
(integer) 0

4、使用场景

string类型根据其特性的使用场景如下:

特性说明场景
原子操作支持INCR/DECR等原子操作计数器、限流器
批量操作MEST/MGET减少网络开销批量缓存读写
位操作SETBIT/GETBIT直接操作二进制位布隆过滤器、位图统计
过期控制EXPIRE实现自动过期会话管理、临时数据缓存

相关文章:

  • 算法---子序列[动态规划解决](最长递增子序列)
  • 在 Wireshark 中如何筛选数据包
  • 在线论坛系统
  • Charles抓包-安装和IOS抓包指导
  • HTML、CSS、JavaScript
  • selenium 常用方法
  • CTF web入门之命令执行
  • 论文解读 | Task Shield:Agent“任务对齐“的防护盾,抵御提示注入攻击新方案
  • 面试题大全
  • 第六周作业
  • 【计算机网络】同步操作 vs 异步操作:核心区别与实战场景解析
  • vue实现中英文切换
  • 【含文档+PPT+源码】基于微信小程序的卫生院预约挂号管理系统的设计与实现
  • 飞牛私有云5大硬核功能实测!
  • 图解Java实现冒泡排序(Bubble Sort)
  • Keil C51中32位变量赋值异常问题分析与解决
  • 【概念】什么是UI(User interface)什么是UX(User experience)?
  • Leetcode39:组合总和——回溯算法
  • myeclise运行项目
  • 如何在Git历史中抹掉中文信息并翻译成英文
  • 如何为网站做优化/营销管理培训课程培训班
  • 传统网站建设/seo分析
  • 网站建设方案主要有/港港网app下载最新版
  • 推广公众号/河北网站seo策划
  • 做网站客户没有付定金/自己创建网页
  • 京山网站制作/专业做网站公司