redis string
1. 字符串(string)
字符串类型是 redis 最基础的数据结构。字符串类型的值实际可以是 字符串(简单 和 复杂 的字符串,例如 json、xml)、数字(整数、浮点数),甚至是 二进制(图片、音频、视频),但是值最大不能超过512MB。
2. 内部实现
字符串对象的内部编码有3种 :int、raw和embstr。Redis会根据当前值的类型和长度来决定使用哪种编码来实现。
- 如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么字符串对象会将整数值保存在字符串对象结构的ptr属性里面(将void*转换成1ong),并将字符串对象的编码设置为int。
- 如果字符串对象保存的是一个字符串值,并且这个字符串值的长度大于32字节,那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值,并将对象的编码设置为raw。
- 如果字符串对象保存的是一个字符串值,并且这个字符申值的长度小于等于32字节,那么字符串对象将使用一个简单动态字符串(SDS)来保存这个字符串值,并将对象的编码设置为embstr
embstr 编码是专门用于保存短字符串的一种优化编码方式,我们可以看到 embstr 和 raw 编码都会使用 SDS 来保存值,但不同之处在于 embstr 会通过一次内存分配函数来分配一块连续的内存空间来保存 redisObject 和 SDS。而 raw 编码会通过调用两次内存分配函数来分别分配两块空间来保存 redisObject 和 SDS。redis 这样做会有很多好处。
- embstr 编码将创建字符串对象所需的内存分配次数从 raw 编码的两次降低为一次
- 释放 embstr 编码的字符串对象同样只需要调用一次内存释放函数
- 因为 embstr 编码的字符串对象的所有数据都保存在一块连续的内存里面可以更好的利用 CPU 缓存提升性能。
3. 常用命令
命令 | 描述 |
---|---|
set key value | 设置值 |
mset key value [key value ...] | 设置多个值 |
get key | 获取值 |
mget key1 [key2..] | 获取多个值 |
del key | 删除值 |
getrange key start end | 返回 key 中字符串值的子字符 |
getset key value | 将给定 key 的值设为 value ,并返回 key 的旧值 |
strlen key | 返回值长度 |
incr key | 将 key 中储存的数字值增1 |
decr key | 将 key 中储存的数字值减1 |
getbit key offset | 对 key 所储存的字符串值,获取指定偏移量上的位 |
setbit key offset value | 对 key 所储存的字符串值,设置或清除指定偏移量上的位 |
setex key seconds value | 将值 value 关联到 key ,并将 key 的过期时间设为 seconds |
setnx key value | 只有在 key 不存在时设置 key 的值 |
setrange key offset value | 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始 |
msetnx key value [key value ...] | 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在 |
psetex key milliseconds value | 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位 |
incrby key increment | 将 key 所储存的值加上给定的增量值 |
incrbyfloat key increment | 将 key 所储存的值加上给定的浮点增量值 |
decrby key decrement | key 所储存的值减去给定的减量值 |
append key value | 如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾 |
4. 使用场景
-
使用缓存
缓存一些热点数据。来加速读写性能从而降低后端的压力。一般在读取数据的时候会先从 redis 中读取,如果 redis 中没有,再从数据库中读取。在 redis 作为缓存层使用的时候,必须注意一些问题,如:缓存穿透、雪崩以及缓存更新问题......
-
计数器
如评论数,点赞数,分享数,收藏数,销售量、评价数等。
-
限速器
如验证码接口访问频率限制,例如一分钟不能超过5次
-
分布式系统id
由于Redis自增自减的操作是原子性的因此也经常在分布式系统中用来生成唯一的订单号、序列号等。
-
分布式系统共享session
通常在单体系统中,web 服务将会用户的登录信息保存在自己的服务器中。但是在分布式系统中,这样做会有问题。因为分布式系统通常有很多个服务,每个服务又会同时部署在多台机器上,通过负载均衡机制将将用户的访问均衡到不同服务器上。这个时候用户的请求可能分发到不同的服务器上,从而导致用户登录保存 session 是在一台服务器上,而读取 session 是在另一台服务器上因此会读不到 session。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律