闽公网安备 35020302035485号
incr OFFICIAL_INDEX_VISIT_COUNT当然如果你想一次加的值大于1,可以用incrby命令,例如:
incrby OFFICIAL_INDEX_VISIT_COUNT 5这样可以一次性加5。
try{
// 堆代码 duidaima.com
String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);
if ("OK".equals(result)) {
return true;
}
return false;
} finally {
unlock(lockKey);
}
但上面这段代码在有些场景下,会有一些问题,释放锁可能会释放了别人的锁。说实话Redis分布式锁虽说很常用,但坑也挺多的,如果用不好的话,很容易踩坑。ZADD rank:score 100 "周星驰" ZADD rank:score 90 "周杰伦" ZADD rank:score 80 "周润发" ZRANGE rank:score 0 -1 WITHSCORES返回数据:
1) "周星驰" 2) "100" 3) "周杰伦" 4) "90" 5) "周润发" 6) "80" 5. 记录用户登录状态通常下,用户登录成功之后,用户登录之后的状态信息,会保存到Redis中。这样后面该用户访问其他接口的时候,会直接从Redis中查询用户登录状态,如果可以查到数据,说明用户已登录,则允许做后续的操作。如果从Redis中没有查到用户登录状态,说明该用户没有登录,或者登录状态失效了,则直接跳转到用户登录页面。
jedis.set(userId, userInfo, 1800);在Redis内部有专门的job,会将过期的数据删除,也有获取数据时实时删除的逻辑。
setbit key offset value具体示例:
setbit user:view:2024-01-17 123456 1往bitmap数组中设置了用户id=123456的登录状态为1,标记2024-01-17已登录。
getbit key offset具体示例:
getbit user:view:2024-01-17 123456如果获取的值是1,说明这一天登录了。如果我们想统计一周内连续登录的用户,只需要遍历用户id,根据日期中数组中去查询状态即可。
流程图如下:
但使用缓存加速的业务场景,需要注意一下,可能会出现:缓存击穿、穿透和雪崩等问题。
@Slf4j
@Component
public class RedisMessageListenerListener implements MessageListener {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override
public void onMessage(Message message, byte[] pattern) {
String channel = new String(pattern);
RedisSerializer<?> valueSerializer = redisTemplate.getValueSerializer();
Object deserialize = valueSerializer.deserialize(message.getBody());
if (deserialize == null) return;
String md5DigestAsHex = DigestUtils.md5DigestAsHex(deserialize.toString().getBytes(StandardCharsets.UTF_8));
Boolean result = redisTemplate.opsForValue().setIfAbsent(md5DigestAsHex, "1", 20, TimeUnit.SECONDS);
if (Boolean.TRUE.equals(result)) {
log.info("接收的结果:{}", deserialize.toString());
} else {
log.info("其他服务处理中");
}
}
}
10. 生成全局IDincrby userid 10000在分库分表的场景,对于有些批量操作,我们可以从Redis中,一次性拿一批id出来,然后给业务系统使用。