首页 > 数据库 >[Redis]unlink and delete

[Redis]unlink and delete

时间:2024-08-06 20:38:57浏览次数:14  
标签:far Redis so Key Biggest found unlink delete

redis中的大key和unlink操作
1、什么是 bigkey
Key 本身的数据量过大:一个 String 类型的 Key,它的值为 5 MB。
Key 中的成员数过多:一个 ZSET 类型的 Key,它的成员数量为 10,000 个。
Key 中成员的数据量过大:一个 Hash 类型的 Key,它的成员数量虽然只有 1,000 个但这些成员的 Value(值)总大小为 100 MB。
2、bigkey 的影响
集群架构下,某个数据分片的内存使用率远超其他数据分片,无法使数据分片的内存资源达到均衡
如果 bigkey 一直在增长,会导致 Redis 内存 OOM,影响读写性能
因为 Redis 是单线程的,对 bigkey 的增删改操作,会导致超时,甚至阻塞服务
对大 Key 执行删除操作,易造成主库较长时间的阻塞,进而可能引发同步中断或主从切换
3、如何避免 bigkey
如果是 hash 的话,通过一定规则拆分到不同 hash 中,特别是在集群中很有效果
堆积大量过期数据会造成大 Key 的产生,例如在 HASH 数据类型中以增量的形式不断写入大量数据而忽略了数据的时效性。可以通过定时任务的方式对失效数据进行清理。
对大 Key 进行直接删除
4、如何查看 bigkey
可以通过 Redis 客户端命令查看:

redis-cli --bigkeys

Scanning the entire keyspace to find biggest keys as well as

average sizes per key type. You can use -i 0.1 to sleep 0.1 sec

per 100 SCAN commands (not usually needed).

[00.00%] Biggest string found so far '"frontLastPullSysMsgId:1257:964350"' with 5 bytes
[00.00%] Biggest string found so far '"exam_data:1233:913172:39017:140692"' with 8885 bytes
[00.01%] Biggest string found so far '"exam_data:319:877777:14274:126728"' with 14875 bytes
[00.03%] Biggest list found so far '"live_merge:154_159588"' with 9 items
[00.06%] Biggest string found so far '"exam_data:319:1101505:52328:151653"' with 19125 bytes
[00.07%] Biggest hash found so far '"timer_ids:company_id:1134:sys_id:5"' with 11 fields
[00.17%] Biggest string found so far '"exam_data:908:644980:22627:146279"' with 31320 bytes
[00.30%] Biggest hash found so far '"timer_ids:company_id:927:sys_id:5"' with 130 fields
[00.73%] Biggest hash found so far '"timer_ids:company_id:264:sys_id:2"' with 551 fields
[01.19%] Biggest string found so far '"exam_data:973:693508:33936:128891"' with 40643 bytes
[03.09%] Biggest hash found so far '"timer_ids:company_id:1183:sys_id:5"' with 625 fields
[03.29%] Biggest hash found so far '"timer_ids:company_id:1183:sys_id:2"' with 1410 fields
[06.39%] Biggest string found so far '"exam_data:301:104065:51535:165675"' with 127069 bytes
[06.75%] Biggest hash found so far '"websocket_duration"' with 1560568 fields
[37.36%] Biggest string found so far '"exam_data:301:104065:51536:165675"' with 128746 bytes
[81.08%] Sampled 1000000 keys so far

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

Sampled 1233274 keys in the keyspace!
Total key length in bytes is 48419022 (avg len 39.26)

Biggest list found '"live_merge:154_159588"' has 9 items
Biggest hash found '"websocket_duration"' has 1560568 fields
Biggest string found '"exam_data:301:104065:51536:165675"' has 128746 bytes

14 lists with 47 items (00.00% of keys, avg size 3.36)
2736 hashs with 1726892 fields (00.22% of keys, avg size 631.17)
1230524 strings with 1649082886 bytes (99.78% of keys, avg size 1340.15)
0 streams with 0 entries (00.00% of keys, avg size 0.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
0 zsets with 0 members (00.00% of keys, avg size 0.00)
优点:方便、快速、安全
缺点:分析结果不可定制化,准确性与时效性差
可以使用 redis-rdb-tools 或者 xueqiu/rdr,有对应的图形界面看着也很清晰

优点:支持定制化分析,对线上服务无影响
缺点:时效性差,RDB 文件较大时耗时较长
5、如何删除 bigkey
Redis 4.0 及之后版本:您可以通过 UNLINK 命令安全地删除大 Key 甚至特大 Key,该命令能够以非阻塞的方式,逐步地清理传入的 Key。
Redis 4.0 之前的版本:建议先通过 SCAN 命令读取部分数据,然后进行删除,避免一次性删除大量 key 导致 Redis 阻塞。
清理 HASH 数据时,建议通过 HSCAN 命令配合 HDEL 命令对失效数据进行清理,避免清理大量数据造成 Redis 阻塞。
6、UNLINK
Redis 4.0 开始引入了 UNLINK 命令,他和 del 的作用是一样的。但是区别就在于 del 是单线程的,如果删除的是 bigkey 的话,会导致整个服务都被占用。

UNLINK 其实就是把 del 的操作分到了 2 个线程里面:

在主线程中,从整个键空间中删除键
在另一个线程回收内存
虽然分在了 2 个线程里,但是操作也是安全的,并不会带来我删着删着又被读到了的并发问题。因为它(在主线程中)从键空间中删除了对象,因此任何 Redis 命令都无法访问它。

如果你有很大的值,速度会显着提高——UNLINK 是一个 O(1) 操作(每个键;在主线程中),而不管键中保存的值的大小。使用 DEL 删除一个大值可能需要几百毫秒或更长时间,而 UNLINK 将在不到一毫秒的时间内完成(包括网络往返)。

但是并不是说 del 无用武之地了,当需要实时响应的时候最好还是 del,因为毕竟 UNLINK 是一个异步操作。

标签:far,Redis,so,Key,Biggest,found,unlink,delete
From: https://www.cnblogs.com/DCFV/p/18345940

相关文章

  • 对于springboot无法连接redis解决方案
    对于springboot无法连接redis解决方案一、测试是否能在本地应用上访问到你的redis(如果是部署在linux上的话)1.开启telnet功能2.开始测试端口是否能访问到(适用于所有,包括MQ)3.开放6379端口4.看spring的配置文件注意redis的缩进位置5.pom依赖一、测试是否能在本地......
  • redis-cluster集群部署
    目录主机规划redis安装下载redis安装依赖关闭防火墙编译安装redis所以主机配置环境变量所以主机创建配置目录创建配置文件内核优化启动redis使用system管理使用redis-cli创建集群创建集群查看集群状态集群状态验证redis从5开始已经废弃了使用ruby脚本创建配置,而将创建配置文件直......
  • Redis常用命令(二)
    一、Hash1.HDEL 删除哈希表key中的一个或多个域,不存在将被忽略 HDEL[表名][fieId] 返回值:被成功移除的域的数量,不包括被忽略的域2.HEXISTS 检查哈希表key中,fieId是否存在 HEXISTS[表名][fieId] 返回值:存在返回1,不存在返回03.HGET 显示哈希表key中的给......
  • [Redis]主从同步
    有备无患--主从同步很多企业都没有使用Redis的集群,但是至少都做了主从。有了主从,当主节点(Master)挂掉的时候,运维让从节点(Slave)过来接管,服务就可以继续,否则主节点需要经过数据恢复和重启的过程,这就可能会拖延很长的时间,从而影响线上业务的持续服务。在了解Redis的主从复制......
  • Redis面试题大全
    文章目录Redis有哪几种基本类型Redis为什么快?为什么Redis6.0后改用多线程?什么是热key吗?热key问题怎么解决?什么是热Key?解决热Key问题的方法什么是缓存击穿、缓存穿透、缓存雪崩?缓存击穿缓存穿透缓存雪崩Redis的过期策略Redis持久化方式有哪些?区别?Redis高可用1.主从复......
  • Redis可以通过以下几种方式来避免内存溢出
    Redis可以通过以下几种方式来避免内存溢出:设置最大内存限制:可以使用maxmemory配置项来限制Redis的最大内存使用量。当Redis的内存占用超过了设置的最大内存限制时,Redis会根据所配置的内存策略来处理数据,例如删除最近最少使用的键或者拒绝写入请求。使用内存淘汰策略:当......
  • redis如何避免内存溢出
    Redis可以通过以下几种方式来避免内存溢出:设置最大内存限制:可以使用maxmemory配置项来限制Redis的最大内存使用量。当Redis的内存占用超过了设置的最大内存限制时,Redis会根据所配置的内存策略来处理数据,例如删除最近最少使用的键或者拒绝写入请求。使用内存淘汰策略:当......
  • Redis02——缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、缓存工具封装)
    目录缓存概念添加Redis缓存业务场景缓存作用模型java代码缓存更新策略主动更新的三种策略主动更新——CacheAsidePattern实际应用缓存穿透概念解决方法实际应用缓存雪崩概念解决方法缓存击穿互斥锁介绍 实际应用逻辑过期介绍实际应用  互斥锁VS......
  • 出现 No mapping for DELETE/GET等
    出现NomappingforDELETE/GET等错误一:请求url不对修改前如下图可知后端请求url为http://localhost:8080/user/addressBook运行后控制台出现发现后端请求url比前端请求url少了/改正:在@DeleteMapping后面加上/ @DeleteMapping("/")@ApiOperation("根据id......
  • Redis分布式锁防止缓存击穿
    一、Nuget引入StackExchange.Redis、DistributedLock.Redis依赖二、使用 StackExchange.Redis对redis操作做简单封装publicclassRedisHelper{privatestaticConnectionMultiplexer_redis;privatestaticstring_connectionString;//静态构造函数,确保在程序启动时......