Redis之bigkey问题解读

这篇具有很好参考价值的文章主要介绍了Redis之bigkey问题解读。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

什么是bigkey?

bigkey引发的问题

如何查找bigkey

redis-cli --bigkeys

MEMORY USAGE

bigKey如何删除

渐进式删除

unlink

bigKey生产调优


什么是bigkey?

bigkey简单来说就是存储本身的key值空间太大,或者hash,list,set等存储中value值过多。

具体来衡量的话大key是:

  • String 类型值大于10KB。
  • Hash、List、Set、Zset类型元素个数超过5000个。

bigkey引发的问题

  • 阻塞工作线程:如果我们使用del命令删除大key,会阻塞工作线程这样就没有办法处理其他客户端发过来的命令了。

bigkey的体积与删除耗时可参考下表:

key类型 field数量 耗时
Hash 100万 1000ms
List 100万 1000ms
Set 100万 1000ms
ZSet 100万 1000ms
  • 内存分布不均: 集群模型在slot分片均匀情况下会出现数据和查询倾斜的情况,部分有大key的Redis结点占用内存较多。
  • 客户端超时阻塞: Redis的工作线程只有一个,操作这个大key会比较耗时会阻塞Redis在客户端看来就说很久很久没有响应。
  • 引发网络阻塞: 每次获取大key产生的网络流量比较大,这对于网卡比较小的服务器是灾难性的。

如何查找bigkey

redis-cli --bigkeys

可以通过redis客户端提供的命令 redis-cli --bigkeys来查看

$ redis-cli --bigkeys

# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type.  You can use -i 0.01 to sleep 0.01 sec
# per SCAN command (not usually needed).

[00.00%] Biggest string found so far 'key-419' with 3 bytes
[05.14%] Biggest list   found so far 'mylist' with 100004 items
[35.77%] Biggest string found so far 'counter:__rand_int__' with 6 bytes
[73.91%] Biggest hash   found so far 'myobject' with 3 fields

-------- summary -------

Sampled 506 keys in the keyspace!
Total key length in bytes is 3452 (avg len 6.82)

Biggest string found 'counter:__rand_int__' has 6 bytes
Biggest   list found 'mylist' has 100004 items
Biggest   hash found 'myobject' has 3 fields

504 strings with 1403 bytes (99.60% of keys, avg size 2.78)
1 lists with 100004 items (00.20% of keys, avg size 100004.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
1 hashs with 3 fields (00.20% of keys, avg size 3.00)
0 zsets with 0 members (00.00% of keys, avg size 0.0

好处:给出每种数据结构Top 1 bigkey,同时给出每种数据类型的键值个数+平均大小
不足:想查询大于10kb的所有key,–bigkeys参数就无能为力了,需要用到memory usage来计算每个键值的字节数

在使用这个命令来查询大key时,最好在从节点上执行。如果在主节点上执行会阻塞从节点。

MEMORY USAGE
MEMORY USAGE key [SAMPLES count]

MEMORY USAGE 命令给出一个 key 和它的值在 RAM 中所占用的字节数。 返回的结果是 key 的值以及为管理该 key 分配的内存总字节数。

对于嵌套数据类型,可以使用选项 SAMPLES,其中 count 表示抽样的元素个数,默认值为 5 。当需要抽样所有元素时,使用 SAMPLES 0 。

> SET foo bar
OK
> MEMORY USAGE foo
(integer) 54
> SET cento 01234567890123456789012345678901234567890123
45678901234567890123456789012345678901234567890123456789
OK
127.0.0.1:6379> MEMORY USAGE cento
(integer) 153

返回值: 整数( 使用的内存的字节数。)

bigKey如何删除

如果一下子释放大量的内存,空闲内存块链表操作时间会增加,相应地就会造成Redis主线程阻塞,如果redis主线程发生了阻塞其他客户端的请求可能会超时,如果超时的连接越来越多会造成各自异常问题。
因此我们删除大key这一个动作,一般有两种方法:

  • 渐进式删除
  • 异步删除(unlink)
渐进式删除

大key逐步拆解,一点一点删,直到没有。

  • list:  使用ltrim渐进式逐步删除,直到全部删除完成
  • set: 使用sscan每次获取部分元素,在使用srem命令删除每个元素
  • zset: 使用zscan每次获取部分元素,在使用zremrangebyrank命令删除每个元素
  •  hash使用hscan每次获取少量field-value,再使用hdel删除每个field
unlink

对于string类型可以使用del也可以使用unlink

unlink命令是Redis提供的另一种删除键的命令。它的语法与del命令类似:

UNLINK key [key ...]

其中,key是要删除的键名。可以指定多个键名,删除多个键。如果指定的键不存在,则会被忽略。

del命令是一种同步删除命令,会阻塞客户端,直到所有指定的键都被删除为止。而unlink命令是一种异步删除命令,会立即返回,不会阻塞客户端。

del命令返回被删除键的数量,而unlink命令不会返回被删除键的数量。这是因为unlink命令是异步执行的,Redis无法立即知道已经删除的键的数量。 

bigKey生产调优

redis.conf配置文件LAZY FREEING相关说明:阻塞和非阻塞删除命令

Redis 有两个原语来删除键。一种称为 DEL,是对象的阻塞删除这意味着服务器停止处理新命令,以便以同步方式回收与对象关联的所有内存。如果删除的键与一个小对象相关联,则执行 DEL 命令所需的时间非常短,可与大多数其他命令相媲美Redis 中的 0(1)或 o(log_N) 命令。 但是,如果键与包含数百万个元素的聚合值相关联,则服务器可能会阻塞很长时间(甚至几秒钟) 才能完成操作。

基于上述原因,Redis 还提供了非阻塞删除原语,例如 UNLINK (非阻塞 DEL) 以及 FLUSHALL和 FLUSHDB 命令的 ASYNC 选项,以便在后台回收内存。 这些命令在恒定时间内执行。另一个线程将尽可能快地逐步释放后台中的对象。

FLUSHALL和 FLUSHDB 的 DEL、UNLINK 和 ASYNC 选项是用户控制的。这取决于应用程序的设计,以了解何时使用其中一个是个好主意。然而,作为其他操作的副作用,Redis 服务器有时不得不删除键或刷新整个数据库。 具体而言,Redis 在以下场景中独立于用户调用删除对象。

优化配置:我们可以将配置文件当中的这些参数设置为yes,也就是懒释放

Redis之bigkey问题解读,redis7,redis,数据库,缓存,spring boot,java文章来源地址https://www.toymoban.com/news/detail-699466.html

到了这里,关于Redis之bigkey问题解读的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis中的BigKey相关问题

    bigkey是指key对应的value所占用的内存空间比较大。例如一个字符串类型的value可以最大存到512MB,一个列表类型的value最多可以存储2^32-1个元素。如果按照数据结构来细分的话,一般分为字符串类型bigkey和非字符串类型bigkey。 字符串类型:体现在单个value值很大,一般认为超过

    2024年01月20日
    浏览(39)
  • 如何保证Redis缓存和数据库的一致性问题

    熟练掌握Redis缓存技术? 那么请问Redis缓存中有几种读写策略,又是如何保证与数据库的一致性问题 今天来聊一聊常用的三种缓存读写策略 首先我们来思考一个问题 写 先更新缓存 再更新数据库 首先如果缓存更新成功但数据库更新失败,会导致数据不一致的问题 其次当请求

    2024年02月14日
    浏览(51)
  • redis和数据库的一致性问题的解决方案

    当前没有框架能够保证redis的数据和数据库的完全一致性,所以需要 我们自己在性能和一致性上作取舍。 下图就是两种在redis缓存数据库内容时的使用。 那么如一个节点的两个图: 缓存的生成,是在首次查询或者缓存过期时间到或者缓存被其他业务删除,进而需要在数据库

    2023年04月08日
    浏览(39)
  • Redis的MoreKey和BigKey问题

    大批量往Redis里面插入200w测试数据key 在Linux Bash下面执行,插入200w数据 使用命令 tail -10 redisTest.txt 查看最后10行记录 通过redis提供的管道 --pipe命令插入200W大批量数据 time用于查看耗时多长 可以看出插入200w条数据,耗时才不到6秒,还是非常快的 尝试使用 keys * ,查看所有的

    2023年04月19日
    浏览(40)
  • Redis - 做缓存时高并发问题:缓存穿透、击穿、雪崩,数据库缓存双写不一致

    当用户访问的数据既不在缓存也不在数据库中时,就会导致每个用户查询都会“穿透” 缓存“直抵”数据库。这种情况就称为缓存穿透。当高度发的访问请求到达时,缓存穿透不 仅增加了响应时间,而且还会引发对 DBMS 的高并发查询,这种高并发查询很可能会导致 DBMS 的崩

    2024年02月04日
    浏览(48)
  • 【Redis】内存数据库Redis进阶(Redis哨兵集群)

    基于 Redis 集群解决单机 Redis 存在的四大问题:   搭建一个三节点形成的 Sentinel 集群,来监管 Redis 主从集群。   【Redis】内存数据库Redis进阶(Redis主从集群)   架构图: 三个sentinel实例信息: 节点 IP PORT s1 192.168.150.101 27001 s2 192.168.150.101 27002 s3 192.168.150.101 27003 之前

    2024年02月14日
    浏览(49)
  • Redis缓存数据库

    目录 一、概述 1、Redis  2、Redis的安装 Redis Windows环境设置 3、String: 字符串 3.1、字符串 3.2、数值 3.3、bitmap 4、Hash: 散列 5、List: 列表 6、Set: 集合 7、Sorted Set: 有序集合 常识: 磁盘:1.寻址:ms(毫秒)2.带宽:MB/s 内存:1.寻址:ns    (纳秒) 2.带宽:GB/s 秒--毫秒--微妙--纳秒

    2024年02月04日
    浏览(62)
  • Redis内存数据库

    Redis内存数据库 NoSQL数据库简介 Redis简介 Redis应用场景 windows下安装和使用Redis 在linux下安装redis Redis数据可视化RedisDesktopManager Redis配置 Redis 数据类型 Redis 字符串(String) Redis 哈希(Hash) Redis 列表(List) Redis 集合(Set) Redis 有序集合(sorted set) Redis key命令 Redis连接命令 Redis服务器命令

    2024年02月09日
    浏览(43)
  • 1 - 搭建Redis数据库服务器|LNP+Redis

    数据库服务软件分为2类: 关系型数据库服务软件 简称 RDBMS 按照预先设置的组织结构 将数据存储在物理介质上 数据之间可以做关联操作 非关系型数据库服务软件 简称 NoSQL 不仅仅是SQL 不需要预先定义数据存储结构 每条记录可以有不同的数据类型和字段个数 只需要 key valu

    2024年01月25日
    浏览(58)
  • 126、高频Redis面试题:如何保证Redis和数据库数据一致性

    问题:如果数据库中的某条数据放入缓存后,又马上被更新了,那我们应该如何更新缓存 缺点: 如果先更新缓存成功,在更新数据库的时候失败,这时候会导致数据不一致;缓存的作用是不是临时将我们数据保存在内存,便于提高查询速度;但是如果某条数据在数据库中都

    2024年02月13日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包