聊聊Redis内存优化的7个神技

(动力节点)动力哥Redis7笔记-第五章 对于Master宕机后的冷处理方式是无法实现高可用的。Redis从2.6版本开始提供了高可用的解决方案—— Sentinel哨兵机制。在集群中再引入一个节点,该节点充当Sentinel哨兵,用于监视Master的运行状态,并在Master宕机后自动指定一个Slave作为新的Master。整个过程无需人工参与,完全由哨兵自动完成。不过,此时的Sentinel哨兵又成为了一个单点故障点:若哨兵发生宕机,整个集群将瘫痪。 阅读详情

如何用更少的内存保存更多的数据?

我们应该从 Redis 是如何保存数据的原理展开,分析键值对的存储结构和原理。

从而继续延展出每种数据类型底层的数据结构,针对不同场景使用更恰当的数据结构和编码实现更少的内存占用。

为了保存数据, Redis 需要先申请内存,数据过期或者内存淘汰需要回收内存,从而拓展出内存碎片优化。

最后,说下 key、value 使用规范和技巧、 Bitmap 等高阶数据类型,运用这些技巧巧妙解决有限内存去存储更多数据难题……

这一套组合拳下来直接封神。

具体详情,且看「苏三」一一道来。

主要优化神技如下:

  • 键值对优化;

  • 小数据集合的编码优化;

  • 使用对象共享池;

  • 使用 Bit 比特位或 byte 级别操作

  • 使用 hash 类型优化;

  • 内存碎片优化;

  • 使用 32 位的 Redis。

在优化之前,我们先掌握 Redis 是如何存储数据的。

Redis 如何存储键值对

Redis 以 redisDb 为中心存储,redis 7.0 源码在 https://github.com/redis/redis/blob/7.0/src/server.h :

redisDb

  • dict:最重要的属性之一,就是靠这个定义了保存了对象数据键值对,dcit 的底层结构是一个哈希表。

  • expires:保存着所有 key 的过期信息.

  • blocking_keys 和 ready_keys 主要为了 实现 BLPOP 等阻塞命令

  • watched_keys用于实现watch命令, 记录正在被watch的一些key ,与事务相关。

  • id 为 当前数据库的id ,redis 支持单个服务多数据库,默认有16个;

  • clusterSlotToKeyMapping:cluster 模式下,存储key 与哈希槽映射关系的数组。

Redis 使用「dict」结构来保存所有的键值对(key-value)数据,这是一个全局哈希表,所以对 key 的查询能以 O(1) 时间得到。

所谓哈希表,我们可以类比 Java 中的 HashMap ,其实就是一个数组,数组的每个元素叫做哈希桶。

dict 结构如下,源码在 https://github.com/redis/redis/blob/7.0/src/dict.h :

struct dict {
    // 特定类型的处理函数
    dictType *type;
  // 两个全局哈希表指针数组,与渐进式 rehash 有关
    dictEntry **ht_table[2];
    // 记录 dict 中现有的数据个数。
    unsigned long ht_used[2];
   // 记录渐进式 rehash 进度的标志, -1 表示当前没有执行 rehash 
    long rehashidx;

   // 小于 0 表示 rehash 暂停
    int16_t pauserehash;
    signed char ht_size_exp[2];
};
  • dictType:存储了hash函数,key和value的复制等函数;

  • ht_table:长度为 2 的 数组,正常情况使用 ht_table[0] 存储数据,当执行 rehash 的时候,使用 ht_table[1]  配合完成 。

key 的哈希值最终会映射到 ht_table  的一个位置,如果发生哈希冲突,则拉出一个哈希链表。

大家重点关注 dictEntry 类型的 ht_table,ht_table 数组每个位置我们也叫做 哈希桶 ,就是这玩意保存了所有键值对。

❝

码哥,Redis 支持那么多的数据类型,哈希桶咋保存?

哈希桶的每个元素的结构由 dictEntry 定义:

typedef struct dictEntry {
   // 指向 key 的指针
    void *key;
    union {
        // 指向实际 value 的指针
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    } v;
    // 哈希冲突拉出的链表
    struct dictEntry *next;
} dictEntry;
  • key 指向键值对的键的指针,key 都是 string 类型。

  • value 是个 union(联合体)当它的值是 uint64_t、int64_t 或 double 类型时,就不再需要额外的存储,这有利于减少内存碎片。(为了节省内存操碎了心)当然, val 也可以是 void 指针,指向值的指针,以便能存储任何类型的数据。

  • next 指向另一个 dictEntry 结构, 多个 dictEntry 可以通过 next 指针串连成链表, 从这里可以看出, ht_table 使用链地址法来处理键碰撞: 当多个不同的键拥有相同的哈希值时,哈希表用一个链表将这些键连接起来。

哈希桶并没有保存值本身,而是指向具体值的指针,从而实现了哈希桶能存不同数据类型的需求。

而哈希桶中,键值对的值都是由一个叫做 redisObject 的对象定义,源码地址: https://github.com/redis/redis/blob/7.0/src/server.h 。

typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:LRU_BITS;
    int refcount;
    void *ptr;
} robj;
  • type:记录了对象的类型,string、set、hash 、Lis、Sorted Set 等,根据该类型才可以确定是哪种数据类型,使用什么样的 API 操作。

  • encoding:编码方式, 表示 ptr 指向的数据类型具体数据结构,即这个对象使用了什么数据结构作为底层实现 保存数据。 同一个对象使用不同编码实现内存占用存在明显差异,内部编码对内存优化非常重要。

  • lru:LRU_BITS:LRU 策略下对象最后一次被访问的时间,如果是 LFU 策略,那么低 8 位表示访问频率,高 16 位表示访问时间。

  • refcount :表示引用计数,由于 C 语言并不具备内存回收功能,所以 Redis 在自己的对象系统中添加了这个属性,当一个对象的引用计数为 0 时,则表示该对象已经不被任何对象引用,则可以进行垃圾回收了。

  • ptr 指针:指向对象的底层实现数据结构,指向 值的指针 。

如下图是由 redisDb、dict、dictEntry、redisObejct 关系图:

redis存储结构

「码哥」再唠叨几句,void *key  和 void *value 指针指向的是 redisObject ,Redis 中每个对象都是用 redisObject 表示。

知道了 Redis 存储原理以及不同数据类型的存储数据结构后,我们继续看如何做性能优化。

1. 键值对优化

当我们执行 set key value 的命令, *key 指针指向 SDS 字符串保存 key,而 value 的值保存在 *ptr 指针指向的数据结构,消耗的内存:key + value。

第一个优化神技: 降低 Redis 内存使用的最粗暴的方式就是缩减键(key)与值(value)的长度。

在《 Redis 很强,不懂使用规范就糟蹋了 》中我说过关于键值对的使用规范,对于 key 的命名使用「业务模块名:表名:数据唯一id」这样的方式方便定位问题。

比如:users:firends:996 表示用户系统中,id = 996 的朋友信息。我们可以简写为: u:fs:996

对于 key 的优化:使用单词简写方式优化内存占用。

对于 value 的优化那就更多了:

  • 过滤不必要的数据:不要大而全的一股脑将所有信息保存,想办法去掉一些不必要的属性,比如缓存登录用户的信息,通常只需要存储昵称、性别、账号等。

  • 精简数据:比如用户的会员类型:0 表示「屌丝」、1 表示 「VIP」、2表示「VVIP」。而不是存储 VIP 这个字符串。

  • 数据压缩:对数据的内容进行压缩,比如使用 GZIP、Snappy。

  • 使用性能好,内存占用小的序列化方式。比如 Java 内置的序列化不管是速度还是压缩比都不行,我们可以选择 protostuff,kryo等方式。如下图 Java 常见的序列化工具空间压缩比:

  • 序列化工具压缩比

    ❝

    靓仔们,我们通常使用 json 作为字符串存储在 Redis,用 json 存储与二进制数据存储有什么优缺点呢?

    json 格式的优点:方便调试和跨语言;缺点是:同样的数据相比字节数组占用的空间更大。

    一定要 json 格式的话,那就先通过压缩算法压缩 json,再把压缩后的数据存入 Redis。比如 GZIP 压缩后的 json 可降低约 60% 的空间。

2. 小数据集合编码优化

key 对象都是 string 类型,value 对象主要有五种基本数据类型: String、List、Set、Zset、Hash 。

数据类型与底层数据结构的关系如下所示:

编码与数据结构

特别说明下在最新版(非稳定版本,时间 2022-7-3), ziplist 压缩列表由 quicklist 代替(3.2 版本引入),而双向链表由 listpack 代替。

另外,同一数据类型会根据键的数量和值的大小也有不同的底层编码类型实现。

在 Redis 2.2 版本之后,存储集合数据(Hash、List、Set、SortedSet)在满足某些情况下会采用内存压缩技术来实现使用更少的内存存储更多的数据。

当这些集合中的数据元素数量小于某个值且元素的值占用的字节大小小于某个值的时候,存储的数据会用非常节省内存的方式进行编码,理论上至少节省 10 倍以上内存(平均节省 5 倍以上)。

比如 Hash 类型里面的数据不是很多,虽然哈希表的时间复杂度是 O(1),ziplist 的时间复杂度是 O(n),但是使用 ziplist 保存数据的话会节省了内存,并且在少量数据情况下效率并不会降低很多。

所以我们需要尽可能地控制集合元素数量和每个元素的内存大小,这样能充分利用紧凑型编码减少内存占用。

并且,这些编码对用户和 api 是无感知的,当集合数据超过配置文件的配置的最大值, Redis 会自动转成正常编码。

❝

数据类型对应的编码规则如下所示

String 字符串

  • int:整数且数字长度小于 20,直接保存在 *ptr 中。

  • embstr:开辟一块连续分配的内存(字符串长度小于等于 44 字节)。

  • raw:动态字符串(大于 44 字节的字符串,同时字符串小于 512 MB)。

List 列表

  • ziplist:元素个数小于 hash-max-ziplist-entries 配置,同时所有的元素的值大小都小于 hash-max-ziplist-value 配置。

    ziplist

  • linkedlist:3.0 版本之前当列表类型无法满足 ziplist 的条件时,Redis会使用 linkedlist 作为列表的内部实现。

  • quicklist:Redis  3.2 引入,并作为 List 数据类型的底层实现,不再使用双端链表 linkedlist 和 ziplist 实现。

Set 集合

  • intset 整数集合:元素都是整数,且元素个数小于 set-max-intset-entries 配置

  • hashtable 哈希表:集合类型无法满足intset的条件时就会使用hashtable 编码。

Hash 哈希表

  • ziplist:元素个数小于 hash-max-ziplist-entries 配置,同时任意一个 value 的占用字节大小都小于 hash-max-ziplist-value 。

  • hashtable:hash 类型无法满足 intset 的条件时就会使用hashtable。

Sorted Set 有序集合

  • ziplist:元素个数小于 zset-max-ziplist-entries 同时每个元素的value小于``zset-max-ziplist-value`配置。

  • skiplist:当ziplist条件不满足时,有序集合会使用skiplist作为内部实现。

以下是 Redis redis.conf  配置文件默认编码阈值配置:

hash-max-ziplist-entries 512
hash-max-ziplist-value 64
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
set-max-intset-entries 512

下图是 reidsObject 对象的 type 和 encoding 对应关系图:

type 与编码

❝

码哥,为啥对一种数据类型实现多种不同编码方式?

主要原因是想通过不同编码实现效率和空间的平衡。

比如当我们的存储只有100个元素的列表,当使用双向链表数据结构时,需要维护大量的内部字段。

比如每个元素需要:前置指针,后置指针,数据指针等,造成空间浪费。

如果采用连续内存结构的压缩列表(ziplist),将会节省大量内存,而由于数据长度较小,存取操作时间复杂度即使为O(n) 性能也相差不大,因为 n 值小 与 O(1) 并明显差别。

数据编码优化技巧

ziplist 存储 list 时每个元素会作为一个 entry,存储 hash 时 key 和 value 会作为相邻的两个 entry。

存储 zset 时 member 和 score 会作为相邻的两个entry,当不满足上述条件时,ziplist 会升级为 linkedlist, hashtable 或 skiplist 编码。

由于目前大部分Redis运行的版本都是在3.2以上,所以 List 类型的编码都是quicklist。

quicklist 是 ziplist 和 linkedlist 的混合体,它将 linkedlist 按段切分,每一段使用 ziplist 来紧凑存储,多个 ziplist 之间使用双向指针串接起来。

考虑了综合平衡空间碎片和读写性能两个维度所以使用了新编码 quicklist。

ziplist 的不足

每次修改都可能触发 realloc 和 memcopy, 可能导致连锁更新(数据可能需要挪动)。

因此修改操作的效率较低,在 ziplist 的元素很多时这个问题更加突出。

优化手段:

  1. key 尽量控制在 44 字节以内,走 embstr 编码。

  2. 集合类型的 value 对象的元素个数不要太多太大,充分利用 ziplist 编码实现内存压缩。

3. 对象共享池

整数我们经常在工作中使用,Redis 在启动的时候默认生成一个 0 ~9999 的整数对象共享池用于对象复用,减少内存占用 。

比如执行 set 码哥 18; set 吴彦祖 18; key 等于 「码哥」 和「吴彦祖」的 value 都指向同一个对象。

如果 value 可以使用整数表示的话尽可能使用整数,这样即使大量键值对的 value 大量保存了 0~9999 范围内的整数,在实例中,其实只有一份数据。

靓仔们,有两个大坑需要注意,它会导致对象共享池失效。

  • Redis 中设置了 maxmemory 限制最大内存占用大小且启用了 LRU 策略(allkeys-lru 或 volatile-lru 策略)。

    ❝

    码哥,为啥呀?

    因为 LRU 需要记录每个键值对的访问时间,都共享一个整数 对象,LRU 策略就无法进行统计了。

  • 集合类型的编码采用 ziplist 编码,并且集合内容是整数,也不能共享一个整数对象。

    ❝

    这又是为啥呢?

    使用了 ziplist 紧凑型内存结构存储数据,判断整数对象是否共享的效率很低。

4.使用 Bit 比特位或 byte 级别操作

比如在一些「二值状态统计」的场景下使用 Bitmap 实现,对于网页 UV 使用 HyperLogLog 来实现,大大减少内存占用。

❝

码哥,什么是二值状态统计呀?

也就是集合中的元素的值只有 0 和 1 两种,在签到打卡和用户是否登陆的场景中,只需记录 签到(1) 或 未签到(0) , 已登录(1) 或 未登陆(0) 。

假如我们在判断用户是否登陆的场景中使用 Redis 的 String 类型实现( key -> userId,value -> 0 表示下线,1 - 登陆 ),假如存储 100 万个用户的登陆状态,如果以字符串的形式存储,就需要存储 100 万个字符串,内存开销太大。

String 类型除了记录实际数据以外,还需要额外的内存记录数据长度、空间使用等信息。

Bitmap 的底层数据结构用的是 String 类型的 SDS 数据结构来保存位数组,Redis 把每个字节数组的 8 个 bit 位利用起来,每个 bit 位 表示一个元素的二值状态(不是 0 就是 1)。

可以将 Bitmap 看成是一个 bit 为单位的数组,数组的每个单元只能存储 0 或者 1,数组的下标在 Bitmap 中叫做 offset 偏移量。

为了直观展示,我们可以理解成 buf 数组的每个字节用一行表示,每一行有 8 个 bit 位,8 个格子分别表示这个字节中的 8 个 bit 位,如下图所示:

8 个 bit 组成一个 Byte,所以 Bitmap 会极大地节省存储空间。这就是 Bitmap 的优势。

关于 Bitmap 的详细解答,大家可移步 -> 《Redis 实战篇:巧用 Bitmap 实现亿级数据统计》 。

5. 妙用 Hash 类型优化

尽可能把数据抽象到一个哈希表里。

比如说系统中有一个用户对象,我们不需要为一个用户的昵称、姓名、邮箱、地址等单独设置一个 key,而是将这个信息存放在一个哈希表里。

如下所示:

hset users:深圳:999 姓名 码哥
hset users:深圳:999 年龄 18
hset users:深圳:999 爱好 女

❝

为啥使用 String 类型,为每个属性设置一个 key 会占用大量内存呢?

因为 Redis 的数据类型有很多,不同数据类型都有些相同的元数据要记录(比如最后一次访问的时间、被引用的次数等)。

所以,Redis 会用一个 RedisObject 结构体来统一记录这些元数据,用 *prt 指针指向实际数据。

当我们为每个属性都创建 key,就会创建大量的 redisObejct 对象占用内存。

如下所示  redisObject 内存占用:

redisObejct

用 Hash 类型的话,每个用户只需要设置一个 key。

6. 内存碎片优化

Redis 释放的内存空间可能并不是连续的,这些不连续的内存空间很有可能处于一种闲置的状态。

虽然有空闲空间,Redis 却无法用来保存数据,不仅会减少 Redis 能够实际保存的数据量,还会降低 Redis 运行机器的成本回报率。

比如, Redis 存储一个整形数字集合需要一块占用 32 字节的连续内存空间,当前虽然有 64 字节的空闲,但是他们都是不连续的,导致无法保存。

❝

内存碎片是如何形成呢?

两个层面原因导致:

  • 操作系统内存分配机制:内存分配策略决定了无法做到按需分配。因为分配器是按照固定大小来分配内存。

  • 键值对被修改和删除,从而导致内存空间的扩容和释放。

碎片优化可以降低内存使用率,提高访问效率,在4.0以下版本,我们只能使用重启恢复:重启加载 RDB 或者通过高可用主从切换实现数据的重新加载减少碎片。

在4.0以上版本,Redis提供了自动和手动的碎片整理功能,原理大致是把数据拷贝到新的内存空间,然后把老的空间释放掉,这个是有一定的性能损耗的。

因为 Redis 是单线程,在数据拷贝时,Redis 只能等着,这就导致 Redis 无法处理请求,性能就会降低。

手动整理碎片

执行 memory purge 命令即可。

自动整理内存碎片

使用 config set activedefrag yes 指令或者在 redis.conf 配置 activedefrag yes 将 activedefrag 配置成 yes 表示启动自动清理功能。

这个配置还不够,至于啥时候清理还需要看下面的两个配置:

  • active-defrag-ignore-bytes 200mb:内存碎片的大小达到 200MB,开始清理。

  • active-defrag-threshold-lower 6:表示内存碎片空间占操作系统分配给 Redis 的总空间比例达到 6% 时,开始清理。

只有满足这两个条件, Redis 才会执行内存碎片自动清理。

除此之外,Redis 为了防止清理碎片对 Redis 正常处理指令造成影响,有两个参数用于控制清理操作占用 CPU 的时间比例上下限。

  • active-defrag-cycle-min 15:自动清理过程所用 CPU 时间的比例不低于 15%,保证清理能有效展开。

  • active-defrag-cycle-max 50:表示自动清理过程所用 CPU 时间的比例不能大于 50%,一旦超过,就停止清理,从而避免在清理时,大量的内存拷贝阻塞 Redis执行命令。

7. 使用 32 位的 Redis

使用32位的redis,对于每一个key,将使用更少的内存,因为32位程序,指针占用的字节数更少。

但是32的Redis整个实例使用的内存将被限制在4G以下。我们可以通过 cluster 模式将多个小内存节点构成一个集群,从而保存更多的数据。

另外小内存的节点 fork 生成 rdb 的速度也更快。

RDB和AOF文件是不区分32位和64位的(包括字节顺序),所以你可以使用64位的Redis 恢复32位的RDB备份文件,相反亦然。

企业IT运维实录:批量部署银河麒麟V10-SP1,Ghost镜像与UKey激活实战 本文详细介绍了企业级银河麒麟V10-SP1操作系统的批量部署全流程,包括标准化镜像制作、自动化封装技术、网络化部署方案及UKey集群激活方案。通过实战案例和技术要点解析,帮助企业IT运维团队大幅提升部署效率,确保系统安全与稳定性。 阅读详情

相关推荐

从零开始:EAS2+Elmo+Maxon电机调试全流程(含电流环优化技巧)

本文详细解析了从零开始搭建基于EAS2软件、Elmo驱动器和Maxon电机的运动控制系统的全流程。内容涵盖硬件连接规范、EAS2基础配置、核心的电流环模型辨识与手动优化技巧,以及速度环、位置环的搭建与调试策略,旨在帮助工程师构建稳定、高性能的伺服控制核心。

i0j1k2l3m的博客 503

Redis 内存优化神技,小内存保存大数据

大家好,我是「码哥」,大家可以叫我靓仔。这次码哥跟大家分享一些优化神技,当你面试或者工作中你遇到如下问题,那就使出今天学到的绝招,一招定乾坤!❝如何用更少的内存保存更多的数据?我们应该从 Redis 是如何保存数据的原理展开,分析键值对的存储结构和原理。从而继续延展出每种数据类型底层的数据结构,针对不同场景使用更恰当的数据结构和编码实现更少的内存占用。为了保存数据, Re...

码哥字节 736

基于MacOS本地部署OpenClaw+Ollama技术要点

本文基于MacOS系统下本地部署OpenClaw+Ollama的实操经验,梳理部署全流程中的核心技术要点、环境配置规范、故障排查方法及落地优化方案,聚焦“本地AI模型联动OpenClaw技能调度”的核心需求,为同类本地部署场景提供可复用的技术参考,规避常见部署风险,确保系统稳定运行。

在科技赋能新时代,共同探索基础理论和宇宙未知。 5166

Redis如何进行内存优化

当使用Redis时,内存是一项关键资源,需要注意内存使用情况,尤其是当数据量很大时。开启压缩功能:Redis可以使用LZF算法对存储的数据进行压缩,可以减少内存的使用。在Redis配置文件中可以设置压缩的阈值,当存储的数据超过阈值时,会自动进行压缩。减少键的数量:在使用Redis时,需要注意不要创建过多的键,因为每个键都会占用一定的内存。可以考虑将相关的键合并成一个哈希或者列表来减少键的数量。删除过期键:在使用Redis时,需要经常清理过期的键。

weixin_50135832的博客 626

CentOS Stream 9中安装MySQL的详细步骤

本文详细介绍了在CentOS Stream 9系统中如何进行MySQL的在线安装、离线安装以及忘记密码的恢复操作。通过阅读本文,您将能够了解并掌握在CentOS Stream 9上安装MySQL的步骤,以及在遇到忘记密码的情况下的解决方案。

小白典的博客 7258

易灵思Trion FPGA实战:5分钟搞定MIPI硬核配置(附Interface Designer避坑指南)

本文详细介绍了易灵思Trion FPGA中MIPI硬核的快速配置方法,通过Interface Designer工具实现从时钟配置到数据收发的全流程实战。特别针对初次接触Trion系列的设计师,提供了六个关键配置陷阱及解决方案,帮助开发者高效完成嵌入式视觉和高速数据传输项目。

eee77的博客 794

Redis面试-内存优化

Redis官网对内存优化的建议

S_powerStone的博客 329

petalinux2022.2启动文件编译配置

petalinux2021之前的版本里,导入目录components/yocto/下的“environment-setup-aarch64-xilinx-linux” 和 “layers/core/oe-init-build-env”的环境,能使用Yocto的devtool工具。(加入下面内容,先petalinux-build下载完成后才能有源码)制作 BOOT.BIN 启动文件:petalinux-package --boot --fsbl --fpga --u-boot --force。

wangjie36的博客 1394

Redis 如何做内存优化?

在使用时需要根据实际情况选择合适的持久化策略,并设置合理的频率,避免频繁保存占用内存。合理设置过期时间:在使用Redis时,可以设置键值对的过期时间,当过期时间到达后,Redis会自动删除对应的键值对,释放内存空间。使用内存碎片整理工具:Redis在使用过程中会产生内存碎片,导致内存使用效率降低。可以使用Redis提供的内存碎片整理工具来整理内存碎片,提高内存使用效率。总之,Redis的内存优化需要综合考虑多个因素,包括数据结构、过期时间、持久化策略、内存策略等。

MRZHQ的博客 2374

6-Halcon-- var_threshold 函数功能(用于基于局部统计特性的动态阈值分割的算子)

var_threshold 是 HALCON 中用于基于局部统计特性的动态阈值分割的算子,特别适用于处理低对比度图像或纹理均匀但包含细微差异的场景。与 dyn_threshold 不同,它不依赖预处理生成的参考图像,而是直接在局部区域内计算灰度值的统计特性(均值和标准差),从而自适应调整阈值。

weixin_45590420的博客 1328

GEE:连续变化检测 CCDC 提取断点信息(干扰时间、干扰幅度、干扰次数)

本文将介绍在 Google Earth Engine (GEE) 平台上连续变化检测与分类(Continuous Change Detection and Classification, CCDC)提取扰动时间、干扰幅度、干扰次数信息,并下载到本地的代码。

养乐多的博客 1946

大厂架构师太厉害了,整理了Redis+Spring全家桶+Dubbo技术+Nginx的合集

那咱们,就先聊聊服务端的高并发,如何优化?如何保护好系统?

m0_62051288的博客 116

Ubuntu22.04安装ros(一键搞定)

然后发现可以一键安装,话不多说,直接终端输入如下指令。回车之后系统会自动安装ros。

m0_47313541的博客 7414

RedisTemplate 的两种序列化方式

RedisTemplate 的两种序列化方式1. 自定义 RedisTemplate 进行序列化2. 使用 StringRedisTemplate 进行序列化 RedisTemplate 可以接收任意的 Object 作为值写入 Redis,只不过写入前会把 Object 序列化为字节形式,默认采用 JDK 序列化。但是这种方式有两个缺点: 可读性差。对键值对进行了序列化,中文字符串序列化后的内容表示为 16 进制表示的数据,可读性差。 内存空间占用大。存储了额外的对象的类型信息,占用了内存空间。 因此

华仔仔的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Redis配置与优化

redis

Ravenich的博客 2491

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

redis配置及优化

2)非关系型数据库,不需要预习建表定义数据结构,每个记录可以有不同的数据类型和字段个数(如微信群里文字,图片,视频)键值对,图结构(分布式存储,直接取值)redis命令处理的核心模块线程,不存在多线程切换二消耗cpu,部用考虑各种锁的问题,不存在加锁,释放锁的操作,没有因为出现死锁二到是的性能消耗。redis基于内存运行的数据库,高性能缓存,一般应用于session换粗暴你,队列,排行榜,计数器,最热文章,最近最热评论,发布订阅等。存储结构:关系型数据库二维表结构,非关系型数据库键值对,文档,图形结构。

m0_61417337的博客 555

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

redis7单节点、主从、哨兵、集群的安装和配置

2022年4月份正式发布的redis 7.0,是目前历史上变化最大的版本,有超过50个以上的新增命令中文镜像redis版本,建议升级到6.0.8版本以上,防止出现安全问题。

persistence_PSH的博客 1573

【Redis7】--3.Redis持久化

redis7笔记

qq_46656857的博客 504

Redis内存这样优化,性能炸裂!

文章来源:【互联网服务器团队】目录背景Redis 内存管理Redis 内存优化内存优化案例总结背景使用过 Redis 的同学应该都知道,它基于键值对(key-value)的内存数据库,所有数据存放在内存中,内存在 Redis 中扮演一个核心角色,所有的操作都是围绕它进行。我们在实际维护过程中经常会被问到如下问题,比如数据怎么存储在 Redis 里面能节约成本、提升性能?R...

石杉的架构笔记 1932

Redis面对数据量庞大时应对策略

综上所述,当Redis面对数据量庞大时,需要从多个维度出发制定相应的应对策略。通过数据分片、内存优化、持久化策略、使用集群、硬件升级、合理设计数据结构以及监控系统性能等多方面的优化措施,可以显著提高Redis的处理能力和稳定性。同时,还需要结合实际应用场景和数据特性进行权衡和选择,以找到最适合的解决方案。在实际操作中,还需要不断关注Redis的性能指标和变化趋势,及时调整优化策略以适应不断变化的业务需求和数据规模。

jun778895的博客 1557

与传统序列化比,PB更快更节省空间

fastjson,jackson和PB3大序列化方法对比

开心的博客 821

Redis 内存优化全攻略

Redis内存优化实践指南 本文系统介绍了Redis内存优化的关键策略:1)利用listpack/intset等紧凑编码结构自动压缩小集合;2)通过32位编译、位图操作和Hash聚合等技巧大幅节省空间;3)合理配置maxmemory和内存阈值参数;4)监控内存碎片并定期治理。文章提供了从数据模型重构、编码选择到参数调优的全流程方案,包含生产环境实测数据和具体配置建议,遵循这些方法可使Redis内存利用率提升3-10倍。同时强调了持久化设置、大键处理等注意事项,帮助用户在保证性能的前提下实现极致内存优化。

hello.reader 1339

Redis 7.0如何优化缓存命中率?

记住,每个场景下的最佳实践可能有所不同,关键是要根据自己的需求和环境来做调整。比如,咱们可以用哈希表存储共同前缀的键,这样既节省了内存,又提高了查找效率。Redis支持多种淘汰策略,LRU(最近最少使用)算法能帮你淘汰那些不常用的键,保留热门数据。避免大键和大量小键的情况,保持键的大小和数量的平衡。同时,避免使用"KEYS"命令,尤其在数据量大的时候,会很慢。这样可以自动清理不再使用的数据,减轻内存的压力。根据实际使用场景合理配置Redis,比如设置合适的内存大小,选择合适的持久化方式等。

ffella的博客 155

Redis 7.0 高性能缓存架构设计与优化

Redis 7.0高性能缓存架构设计实践摘要 本文深入探讨了Redis 7.0在现代分布式系统中的核心应用价值。作为缓存架构的关键组件,Redis 7.0通过多项革命性特性实现了性能突破:内存管理优化提升30% QPS,Redis Functions重构服务端脚本执行范式,Sharded Pub/Sub解决集群消息路由瓶颈。文章从实战角度出发,详细解析了多层缓存架构设计,包含本地缓存、Redis L1/L2缓存的协同工作流,并通过代码示例展示了Redis Functions的业务逻辑封装能力、ACL细粒度权

Jaxonic的博客 1650

redis7性能大幅提升,升级9大新特性!

点击上方蓝字关注我们Redis是一款高性能的开源内存数据库,Reids 7在Redis 6的基础上进行了优化和改进,具有更出色的性能和更高的资源利用率。Redis 7最早是在2022年6月1日正式发布的,至今已经发布超过两年了,当前稳定版最新的官方补丁已经更新到7.2.5,可以说是已经非常稳定了。当然具体项目中是否适合使用和升级,还是要根据实际情况多验证。这里我们主要讨论Redis 7在性能和资源...

fastboot 1531
上一篇: 聊聊10种延迟任务
下一篇: 聊聊伪共享
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值