key redis 遍历_redis使用keys *的一次采坑

背景

    刚开始工作时的业务场景:授权某教育系统五千台设备(允许同时在线连接的数量),可以这样理解,
当五千台中的五百台关闭后,可以允许其他的不超过五百台连接服务,因此需要定期检查
电脑与服务的连接情况,同时针对连接授权的允许使用,针对断开的,从授权中剔除,允许
新的电脑连接进来。

使用redis的键过期策略

   为了检测电脑连接情况,需要高频的检测心跳,设计有客户端即电脑
每隔2秒向服务端发起请求,服务端设置过期时间为4秒,使用电脑唯一
识别的uuid作为key,由于后续需要获取这个uuid统计电脑数量与授权
用,而uuid是无规则的,针对key进行了优化:
使用vm_uuid:real_uuid作为key,这样正则匹配以vm_uuid开头的keys,
使用keys vm_uuid:* 匹配,然后服务端针对这些uuid依次授权并统计数量,
这样设计并提交部署了。


    刚开始时,生成环境keys的数量并不多,所以这样用了,没有发生大的问
题,但是随着业务增多,其他key的数量不断增加,这样做问题很大的,因为keys 命令
阻塞的,而redis是单线程,执行这个命令会阻塞生产上其他的命令的,并且
其时间复杂度为O(N),会一直匹配查找完所有的key才结束,比较耗时,后果严重。
那该怎么办了?

注:keys的介绍,官网地址https://redis.io/commands/keys,官网推荐的解决办法是
使用scan与sets

改进方法一:scan

使用SCAN cursor [MATCH pattern] [COUNT count]命令以迭代的方
式进行key遍历(限制单次查询的key数量)
这个 count 不是限定返回结果的数量,而是限定服务器单次遍历的字典槽位数量(约等于)。

缺点:依然要不停迭代查询到遍历所有的key或者满足的key数量等于500,最后放弃
这一方案,还有没有其他的缺点呢?

改进方法二:

维护一个集合,sadd vm_uuid  uuid1,uuid2,
通过 smembers 获取所有的uuid,然后遍历,
若vm_uuid:uuid1存在,则授权并统计,若不存在
则srem vm_uuid uuid1 然后跳过检验下一个

思考:

为什么keys 命令的是阻塞的?redis的单线程epoll
为啥没起作用呢?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,可以使用Jedis库来连接和操作Redis。要遍历Redis中的数据,可以按照以下步骤进行操作: 1. 首先,需要在Java项目中引入Jedis库的依赖。可以通过在项目的pom.xml文件中添加以下代码来实现: ```xml <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.6.0</version> </dependency> ``` 2. 在Java代码中,可以使用Jedis类来连接到Redis服务器。首先创建一个Jedis对象,并指定Redis服务器的主机名和端口号: ```java Jedis jedis = new Jedis("localhost", 6379); ``` 3. 如果Redis服务器有密码保护,还需要使用`auth`方法来进行身份验证: ```java jedis.auth("password"); ``` 4. 连接成功后,可以使用`select`方法选择要操作的库。Redis默认有16个库,编号从0到15。选择库的命令如下: ```java jedis.select(dbIndex); ``` 其中,`dbIndex`表示库的编号,范围为0到15。 5. 遍历该库的数据可以使用`keys`方法来获取所有键名,然后使用`get`方法获取对应的值。代码示例如下: ```java Set<String> keys = jedis.keys("*"); for(String key : keys){ String value = jedis.get(key); System.out.println("Key: " + key + ", Value: " + value); } ``` 这段代码会获取该库中的所有键名,并遍历输出每个键的键名和对应的值。 6. 最后,记得在结束后关闭连接,释放资源: ```java jedis.close(); ``` 以上就是在Java中遍历Redis中其中一个库的数据的步骤。请根据实际情况修改代码中的主机名、端口号、密码和库的编号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值