从零上手Redis:string编码原理、常用命令与设计逻辑详解

目录

[String 内部编码](#String 内部编码)

[string 命令:](#string 命令:)

mset

mget

setnx

setex

psetex

incr

incrby

decr

decrby

incrbyfloat

append

getrange

setange

strlen


接上篇 redis 底层实现这些数据结构时,并不是完全按照数据结构存储,而是进行了特殊优化,其中的查询,删除,插入,更新 保证时间复杂度不变,特定情况下使用其他结构节省空间。

String 内部编码

以 string 为例:

String 的内部编码 有三种 int , embstr , raw

set key 时 value

为整数则内部编码为 int

为较短的字符串时内部编码为 embstr

为长字符串时内部编码为 raw

那当 value 为 浮点数呢?我们试一试

用 embstr 来存储 浮点数,int型可以直接进行计算,浮点数涉及计算时由于存储为 string 不能直接运算,就需要转换类型,应用中要尽可能避免使用 redis 计算浮点数。

string 命令:

mset

mset: mset key1 v1 key2 v2 ...... 一次存储多个 key: value

mget

mget: mget key1 key2 .... 一次拿到多个 key 的 value

setnx

setnx : 若 key 不存在则创建,存在返回 nil -> set key value nx

区: set key v2 xx 若key存在则更新v 这时原key的过期时间失效

setex

setex : set 的同时指定过期时间 (秒级) setex key value 10

相当于 set key value expire key 10

psetex

psetex : set 的同时指定过期时间 (毫秒级) psetex key value 10

相当于 set key value pexpire key 10

incr

incr: value 为整数(64位/8字节的整数)时返回 value + 1

value 需为64位/8字节内的整数 相当于 java 中的 long

incr (一个不存在的key) 可以达到创建key的效果 value 看做0

incrby

inceby : value 为整数时返回 value + n (需为整)incrby 同样可以达到创建key的效果

decr

decr : value 为整形时返回 value - 1

decrby

decrby : value 为整形时返回 value - n

incrby key +一个负整数 即可达成减法效果

decrby key +一个负整数 即可达成加法效果

incrbyfloat

incrbyfloat : 对浮点数进行 + / - 操作

append

append : append key value 在原有 key 的 value 后拼接,返回总字节数

value 为 中文时 xshell 默认编码为 utf-8 一个汉字 3 字节

getrange

getrange : 按范围获取 value 闭区间 区: java 范围往往是 前闭后开

可以看到下面 下标 0~6 都拿到了 闭区间

setange

setrange :按范围更新 value 闭区间 注意操作中文容易出问题

当 value 为汉字,从 1 开始set value 为我,可以看到从一开始往后3个字节发生了变化

使用 redis-cli --raw 进入 Redis 客户端我们就可以看到汉字了,可以看到出现了问题。

strlen

strlen : 返回字符串长度 (字节)

这些命令中如 mset,mget,setnx 这些让我们可以一条指令达成多种效果,操作多个key, 可为什么要这样设计呢?

上篇提到 Redis 的特点是快,是一个单线程模型,一次操作太多不会阻塞其他任务吗?

像mget , mset 时间复杂度为 O(n) n 就是你后面跟的 key 的数量,一次操作太多当然会影响速度,

但上篇同样提到 Redis 是通过网络传输的,网络传输是有开销的,这时候批量的操作就可以减少不必要的网络开销,从而提高效率。

天是亮的却布满乌云,所有焦距被闪光判了死刑 ------------ 黑色柳丁

👍 ✨ 💗

相关推荐
我不会起名字322几秒前
Redis 从 0 到 1(三十七·收官):36 篇浓缩成 1 张知识地图 + 50 项生产 Checklist
redis·go·知识体系·checklist·收官
杨凯凡23 分钟前
Spring Framework 7 API 版本管理实战:请求头路由、兼容迁移与废弃策略
java·rest api·springframework·spring boot 4·api版本管理
T_Wizard1 小时前
同一个问题写了 4 遍:官方 SDK / HTTP / Spring AI / LangChain4j,到底该选哪个
java·ai编程
hai_android1 小时前
AudioTrack 深度解析:从原理到实战
android·java·kotlin
斯维赤1 小时前
限流、熔断、降级,你真的分得清吗?
java·后端·架构
Zan2 小时前
SQLite + SQLx 实战:为什么已经发布的数据库迁移文件,绝对不能再修改?
数据库·后端·面试
2601_967987372 小时前
安装 Redis 或 Redis Stack
linux·windows·redis·macos·安装
这个DBA有点耶2 小时前
数据同步的三个工程底线:DDL同步、断点续传、一致性校验——开源CDC的边界与KFS的路径
数据库·dba·代码规范
小番茄程序猿3 小时前
Redis 编码压测 59 轮:HSET 快 23 倍是假象,SMEMBERS 慢 30 倍是真的
redis·后端
SelectDB3 小时前
列式存储为什么适合分析类负载?原理、限制与日志场景应用
数据库