但是此时我们获取的key是长期有效的,所以我们应该如何解决长期有效的问题呢?
如何解决SETNX长期有效的问题 EXPIRE key seconds 设置key的生存时间,当key过期时(生存时间为0) ,会被自动删除缺点:原子性得不到满足 下面是伪代码 //该程序存在危险,如果执行到第二行就崩溃了,则此时key会被一直占用而无法被释放RedisService redisService = SpringUtils.getBean(Redi sService.class); long status = redisService.setnx(key, "1");if(status == 1) {redisService.expire(key, expire);//执行独占资源逻辑doOcuppiedWork();} 3.如何通过Redis实现分布式锁:(正确方式) SET key value [EX seconds] [PX milliseconds] [NX|XX] EX second :设置键的过期时间为second秒PX millisecond :设置键的过期时间为millisecond毫秒NX :只在键不存在时,才对键进行设置操作XX:只在键已经存在时,才对键进行设置操作SET操作成功完成时,返回OK ,否则返回nil 下面是伪代码 RedisService redisService = SpringUtils.getBean(RedisService.class); .String result = redisService.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);if ("OK".equals(result)) {//执行独占资源逻辑doOcuppiedWork();} 4.大量的key同时过期的注意事项 集中过期,由于清除大量的key很耗时,会出现短暂的卡顿现象解放方案:在设置key的过期时间的时候,给每个key加上随机值