Redis的坑

本文介绍了在Redis中正确使用INCR和SET等方法处理缓存过期,强调了生产环境中避免keys命令的性能风险,推荐使用SCAN替代,并讨论了for循环调用Redis操作时采用pipeline批量执行以提高效率。
  • 1、当key已存在时,后调用自增inr(),set(),getset()等方法,会清空缓存有效期,必须重新设置一次缓存有效期
   // 如果用INCR ,DEL,SET,GETSET会将kev对应存储的值替换成新的, 命令也会清掉超时时间!
   redisService.incr(key);
   redisService.expire(key, 60L);
  • 2、生产环境,谨慎使用keys命令,此命令会扫描内存中的全部key,且redis是单线程的,极端情况下会导致整个redis集群hang住,可用SCAN命令替代
   redisService.listKeys(key);                
   redisService.keys(key);
   
   redisService.listPattern(key + "*");        
  
  • 3、for()循环调用redis操作,性能低,可以考虑改为pipeline方式
    /**
     * pipeline方式批量执行 哈希获取所有键值对
     */
    public List<Object> batchHmGetMap(List<String> keys) {
        List<Object> exeResult = redisTemplate.executePipelined(new SessionCallback<String>() {
            @Override
            public String execute(RedisOperations operations) throws DataAccessException {
                ListOperations<String, Object> list = redisTemplate.opsForList();
                for (String key : keys) {
                    list.range(key, 0, -1);
                }
                return null;
            }
        });
        return exeResult;
    }
对于 Redis 的过期回调,你可能会遇到一些。以下是一些常见的问题和解决方法: 1. 过期回调不触发:如果设置了过期时间,并且配置了过期回调函数,但回调函数没有被触发,可能是由于以下原因: - Redis 的 keyspace notifications 没有开启。可以通过配置文件或者使用 `CONFIG SET notify-keyspace-events` 命令来进行设置。 - 过期键的回调事件被禁用。可以通过配置文件或者使用 `CONFIG SET notify-keyspace-events` 命令来进行设置。 2. 回调函数执行的时间限制:Redis 对于过期回调函数有一个执行时间限制,默认是 100 毫秒。如果回调函数执行时间超过此限制,可能会被中断。为了避免此问题,可以将回调函数的逻辑简化,或者将复杂的处理逻辑转移到其他地方。 3. 回调函数的线程安全性:Redis 的过期回调函数是在主线程中运行的,所以要确保回调函数是线程安全的。需要考虑多线程并发访问共享资源时可能出现的竞争条件和数据一致性问题。 4. 回调函数的执行顺序:当多个键同时过期时,无法保证回调函数的执行顺序。如果需要按照某种顺序执行回调函数,可以在回调函数中添加额外的逻辑或者使用其他方法来进行控制。 5. 回调函数的效率:过期回调函数在 Redis 主线程中执行,可能会影响 Redis 的响应速度。如果回调函数执行时间过长或者频繁触发回调导致性能问题,可以考虑优化回调函数的逻辑或者使用其他解决方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值