redis7高级篇2 redis的BigKey的处理

2024-02-24 11:40

本文主要是介绍redis7高级篇2 redis的BigKey的处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一 Bigkey的处理

1.1 模拟造数

1.截图

2.代码 :使用pipe 批量插入10w的数据量

cat /root/export/monidata.txt | redis-cli -h 127.0.0.1 -a 123456 -p 6379 --pipe

[root@localhost export]# for((i=1;i<=10*10;i++)); do echo "set k$i v$i" >> /root/export/monidata.txt ;done;
[root@localhost export]# ls
dockertest  dump.rdb  monidata.txt  myredis-data  nacos  nacos-1.4.2  redis-7.0.10  redis-7.0.10.tar.gz  rocketmq-all-4.9.6-bin-release  rocketmq-all-4.9.6-bin-release.zip  servers
[root@localhost export]# cat /root/export/monidata.txt | redis-cli -h 127.0.0.1 -a 123456 -p 6379 --pipe
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 100
[root@localhost export]# 

3.查看

4.查看数据量大小

 1.2 设置禁用一些危险命令

1.线上不能使用 keys *

2.不能使用  flushdb

3.不能使用 flushdball

在redis的redis.conf配置文件中进行修改: 通过搜索关键字: rename-command ;进行修改

rename-command  keys "" ; rename-command flushdb "" ; 

[root@localhost myredis]# vi redis.conf
[root@localhost myredis]# pwd
/myredis

 2.重启服务,查看效果

[root@localhost ~]# redis-server /myredis/redis.conf
[root@localhost ~]# redis-cli -a 123456 -p 6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> keys *
(error) ERR unknown command 'keys', with args beginning with: '*' 
127.0.0.1:6379> flushdb 
(error) ERR unknown command 'flushdb', with args beginning with: 
127.0.0.1:6379> 

1.3 大key的判断依据

string类型的key控制在10kb以内,hash,list,set,zset元素的个数不要超过5000
非string的bigkey,不要使用del删除,使用hscan、sscan、zscan等方式进行渐进式删除。

1.4 删除命令逻辑

#string
1.使用del命令 ,超大使用unlink命令
#hash
2.使用hscan每次获取少量的field-value,再使用hdel删除每个field

#list
3.使用ltrim渐进式逐步删除,直到全部删除完成。

#set
4.使用sscan命令获取部分元素,再使用srem命令删除每个元素

#zset
5.使用zscan每次获取部分元素,再使用zremrangebyrank命令删除每个元素

二 scan命令的操作

2.1 使用scan命令查看数据

scan命令用于获取数据库中的键。一次返回的数据不可控,只是大概返回count数。

SCAN 命令是一个基于游标的迭代器,每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数,从而让迭代过程延续下,当游标返回  0 时,迭代结束。

语法格式:scan  游标  pattern   count取出的条数

返回值:SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。

案例:

127.0.0.1:6379> scan 0 match  * count 10
1) "120"
2)  1) "k66"
    2) "k49"
    3) "k35"
    4) "k23"
    5) "k12"
    6) "k83"
    7) "k22"
    8) "k36"
    9) "k61"
   10) "k47"
截图:

2.2 scan命令分类用途

Scan命令又细分为:scan命令,Sscan命令、Hscan命令、Zscan命令。

  • scan命令用于迭代字符串中的元素。
  • Sscan命令用于迭代集合键中的元素。
  • Hscan命令用于迭代哈希键中的键值对。
  • Zscan命令用于迭代有序集合中的元素(包括元素成员和元素分值)

三  Bigkey的处理

string类型的key控制在10kb以内,hash,list,set,zset元素的个数不要超过5000
非string的bigkey,不要使用del删除,使用hscan、sscan、zscan等方式进行渐进式删除。

3.1 发现大key的命令

1.使用memory usage 命令

127.0.0.1:6379> memory usage k32
(integer) 56
127.0.0.1:6379> memory usage k100
(integer) 56
127.0.0.1:6379> 

2.使用bigkeys命令

[root@localhost myredis]# redis-cli -h 127.0.0.1 -p 6379 -a 123456 --bigkeys 
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

# 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 '"k66"' with 3 bytes
[41.00%] Biggest string found so far '"k100"' with 4 bytes

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

Sampled 100 keys in the keyspace!
Total key length in bytes is 292 (avg len 2.92)

Biggest string found '"k100"' has 4 bytes

0 lists with 0 items (00.00% of keys, avg size 0.00)
0 hashs with 0 fields (00.00% of keys, avg size 0.00)
100 strings with 292 bytes (100.00% of keys, avg size 2.92)
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)
[root@localhost myredis]# redis-cli -h 127.0.0.1 -p 6739 -a 123456 --bigkeys -l 0.1

 3.2 大key的删除

3.2.1 String类型的删除

一般使用del,如果过于庞大则使用unlink

127.0.0.1:6379> set bj  123
OK
127.0.0.1:6379> get bj
"123"
127.0.0.1:6379> del bj
(integer) 1
127.0.0.1:6379> get bj
(nil)
127.0.0.1:6379> 

3.2.2 Hash数据类型删除

1.使用hscan每次获取少量的field-value,再使用hdel删除每个field

1.查询命令

127.0.0.1:6379> hmset website  ws1 "beijing.com" ws2 "tianjin.com" ws3 "shanghai.com"
OK
127.0.0.1:6379> hscan website 0 match  * count 2
1) "0"
2) 1) "ws1"
   2) "beijing.com"
   3) "ws2"
   4) "tianjin.com"
   5) "ws3"
   6) "shanghai.com"

删除

127.0.0.1:6379> hscan website 0  match *
1) "0"
2) 1) "ws1"
   2) "beijing.com"
   3) "ws2"
   4) "tianjin.com"
   5) "ws3"
   6) "shanghai.com"
127.0.0.1:6379> hdel website ws1
(integer) 1
127.0.0.1:6379> hscan website 0  match *
1) "0"
2) 1) "ws2"
   2) "tianjin.com"
   3) "ws3"
   4) "shanghai.com"
127.0.0.1:6379> 

2.java代码

 3.2.3 List类型删除 

1.使用ltrim渐进式逐步删除,直到全部删除完成。

Lrim命令的作用是: 让列表只保留制定区间内的元素,不在制定区间的内容将被删除。

2.命令演示

27.0.0.1:6379> rpush list  v1 v2 v3 v4 v5
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
5) "v5"
127.0.0.1:6379> ltrim list 0 2
OK
127.0.0.1:6379> lrange list 0 -1
1) "v1"
2) "v2"
3) "v3"

127.0.0.1:6379> 

3.java代码

 3.2.4 set类型删除 

1.使用sscan命令获取部分元素,再使用srem命令删除每个元素

2.命令案例

127.0.0.1:6379> sadd  sk1 111  222 333 5 6 8
(integer) 6
127.0.0.1:6379> smembers sk1
1) "5"
2) "6"
3) "8"
4) "111"
5) "222"
6) "333"
127.0.0.1:6379> srem sk1 333
(integer) 1
127.0.0.1:6379> smembers sk1
1) "5"
2) "6"
3) "8"
4) "111"
5) "222"
127.0.0.1:6379> sscan sk1 0 match *
1) "0"
2) 1) "5"
   2) "6"
   3) "8"
   4) "111"
   5) "222"
3.java代码

  3.2.5 zset类型删除 

1.使用zscan每次获取部分元素,再使用zremrangebyrank命令删除每个元素

2.命令代码

127.0.0.1:6379> zadd  ks 20 v1 70 v2 45 v3 50 v4 90 v5
(integer) 5
127.0.0.1:6379> zrange  ks  0 -1  withscores
 1) "v1"
 2) "20"
 3) "v3"
 4) "45"
 5) "v4"
 6) "50"
 7) "v2"
 8) "70"
 9) "v5"
10) "90"
127.0.0.1:6379> zscan ks 0
1) "0"
2)  1) "v1"
    2) "20"
    3) "v3"
    4) "45"
    5) "v4"
    6) "50"
    7) "v2"
    8) "70"
    9) "v5"
   10) "90"
127.0.0.1:6379> zremrangebyrank ks  0 1
(integer) 2
127.0.0.1:6379> zrange  ks  0 -1  withscores
1) "v4"
2) "50"
3) "v2"
4) "70"
5) "v5"
6) "90"

127.0.0.1:6379> 

  3.3 bigkey的优化

1.在配置文件中,修改redis.conf配置文件,修改这几项参数:改为yes。

这篇关于redis7高级篇2 redis的BigKey的处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/741983

相关文章

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-