Redis 攻略(Redis Object)

文章目录

Redis 是什么

我们来看官方定义:

Redis is an open source (BSD licensed), in-memory data structure store used as a database, cache, message broker, and streaming engine. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions, and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.

Redis 是一个开源(BSD 许可)的内存数据结构存储系统,可用作数据库、缓存、消息代理和流式处理引擎。Redis 提供多种数据结构,例如字符串、哈希表、列表、集合、支持范围查询的有序集合、位图、HyperLogLog、地理空间索引和流。Redis 内置了复制、Lua 脚本、LRU 淘汰机制、事务以及不同级别的磁盘持久化 ,并通过 Redis Sentinel 提供高可用性,并通过 Redis Cluster 实现自动分区。

核心:

Redis 是一个内存存储。Redis 是一个 KV 存储。

解决什么问题:

used as a database, cache, message broker, and streaming engine

可用作数据库、缓存、消息代理和流式引擎

常用于缓存、消息中转、数据流引擎。

支持什么数据结构

提供了 strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams 一系列数据结构。

有什么特性

Redis has built-in replication, Lua scripting, LRU eviction, transactions, and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.

Redis 内置了复制、Lua 脚本、LRU 淘汰、事务和不同级别的磁盘持久化功能,并通过 Redis Sentinel 提供高可用性,并通过 Redis Cluster 提供自动分区功能。

Redis版本选择

推荐是5.0.5,在6.0之前比较新的版本,可以避免多线程额外的复杂度,同时,大厂很多部门都是用的是5.0版本。

当然我这边就先用8.4.0玩玩指令啥的

go 复制代码
root@GoLang:~/proj/goforjob# redis-server --version
Redis server v=8.4.0 sha=00000000:1 malloc=jemalloc-5.3.0 bits=64 build=711c294ad663ee6e

当然为了看源码,我还是下了5.0.5的

go 复制代码
root@GoLang:~/proj/goforjob# git clone https://github.com/redis/redis.git
Cloning into 'redis'...
remote: Enumerating objects: 101144, done.
remote: Counting objects: 100% (185/185), done.
root@GoLang:~/proj/goforjob/redis# ls
00-RELEASENOTES  CODE_OF_CONDUCT.md  INSTALL      MANIFESTO  redis.conf              runtest            runtest-sentinel  src     utils
BUGS             CONTRIBUTING.md     LICENSE.txt  modules    REDISCONTRIBUTIONS.txt  runtest-cluster    SECURITY.md       tests
codecov.yml      deps                Makefile     README.md  redis-full.conf         runtest-moduleapi  sentinel.conf     TLS.md
root@GoLang:~/proj/goforjob/redis# git checkout 5.0.5
Note: switching to '5.0.5'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at c696aebdb Redis 5.0.5

Base理论

可以说 BASE 理论 是 CAP 中一致性的妥协。和传统事务的 ACID 想法不同,BASE 不追求一致性,而是允许数据在一定时间内不一致,但最终达到一致状态,从而获得更高的可用性和性能。

Object是什么?

Redis 是 key-value 存储,key 和 value 在 Redis 中都被抽象为对象,key 只能是字符串,而 value 支持丰富的对象类型,包括 String、List、Set、Hash、Sorted Set 等。

go 复制代码
root@GoLang:~/proj/goforjob/redis# grep -r "typedef struct redisObject" .
./src/server.h:typedef struct redisObject {
./README.md:    typedef struct redisObject {
grep: ./.git/objects/pack/pack-b2b4a245be35794bc1bfbae37e79a483dc778c21.pack: binary file matches
root@GoLang:~/proj/goforjob/redis# 

Object 在内存中是什么样子?

redisObject 定义如下:

/root/proj/goforjob/redis/src/server.h

go 复制代码
// from Redis 5.0.5
#define LRU_BITS 24
typedef struct redisObject {
    unsigned type:4;      // 对象类型
    unsigned encoding:4;  // 编码方式
    unsigned lru:LRU_BITS; /* LRU 时间或 LFU 数据 */
    int refcount;          // 引用计数
    void *ptr;             // 内容指针,指向实际内容
} robj;

LFU 是 Least Frequently Used 的缩写,翻译为"最不常使用"

在结构体 redisObject 中,type 和 encoding 字段使用了 4 个 bit 位 来表示,这意味着每个字段只能表示 16 个不同的值。

unsigned 实际上是 unsigned int 的简写,表示无符号整数类型,专门用于表示没有负数的值。type 和 encoding 字段使用 4 位无符号整数来表示对象的类型和编码方式。

各字段解释:

type:是哪种 Redis 对象类型。

encoding:表示对象底层编码,使用 OBJECT ENCODING key 可以查看对应的编码方式。

lru:记录对象访问信息,用于内存淘汰,可以先忽略

refcount:引用计数,用来描述有多少个指针,指向该对象。

ptr:内容指针,指向实际内容。

对象与数据结构

实际操作的主要有 6 个 Redis 对象,它们底层依赖一些数据结构,包括字符串、跳表、哈希表、压缩列表、双端链表等,不同对象可能有依赖相同数据结构,有些数据会先通过这些底层结构

实践优于理论,对象在底层结构中,直接与数据通信,是对外暴露的对象,先熟悉对象概念,再自然探索对象底层结构,这样关联性学习的效果会更好。

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

相关推荐
夜雪一千1 分钟前
MySQL 数据字典如何获得
数据库·mysql
系统集成-鹰翔6 分钟前
ERP推单数据库怎么备份:SQLite WAL模式下只复制db文件为什么可能漏任务
javascript·数据库·经验分享·后端
QianhangQianping7 分钟前
撤销重做不是「存快照」:一个可视化编辑器的Operation 设计
java·前端·数据库·typescript·编辑器·前端架构·撤销重做
honsor8 分钟前
用 Grafana 做温湿度异常检测:从阈值告警到趋势预测
数据库·mysql·php
赵渝强老师21 分钟前
【赵渝强老师】YashanDB Developer Center(YDC,崖山数据库开发者中心)
数据库·国产数据库·yashandb·崖山数据库
lusklusklusk23 分钟前
SQL Server 为什么普通 SELECT 会阻塞 UPDATE?——行级 S 锁到表级 S 锁的锁升级原理与实验验证
数据库·mysql·oracle
Leo.yuan31 分钟前
企业业务人员如何独立完成数据分析?2026年自助BI工具选型与应用指南
大数据·数据库·人工智能
roman_日积跬步-终至千里33 分钟前
数仓开发的三层责任:业务定义、模型设计与 SQL 实现
数据库·数据仓库·sql·数据建模
瀚高PG实验室35 分钟前
瀚高数据库创建新数据库卡住问题排查
数据库·postgresql·瀚高数据库
瑶总迷弟1 小时前
银河麒麟 V10 ARM64 安装 Oracle 19c 静默部署操作手册
数据库·oracle