Redis缓存解决排名问题

 * 1、spring boot 2.0 以后默认使用Lettuce作为操作redis的客户端,它使用netty进行网络通信
 * 2、Lettuce的bug导致netty堆外内存溢出  如果netty没有指定堆外内存,默认使用 -Xmx 512m
 * 可以通过-Dio.netty.maxDirectMemory进行设置
 * 解决方案:(不能使用-Dio.netty.maxDirectMemory只去调大堆外内存。)
 * 1、升级Lettuce客户端
 * 2、切换使用jedis
 * RedisTemplate ---> Lettuce,jedis再次封装RedisTemplate
 * @return:
 * @parm:
 */
	@Autowired
	StringRedisTemplate stringRedisTemplate;
		/**
		 *  1、空结果缓存,解决缓存穿透
		 *  2、设置过期时间(加随机),解决缓存雪崩
		 *  3、加锁,解决缓存击穿
		 */
//只要是同一把锁,就能锁住需要这个锁的所以线程
		//synchronized(this) springboot所有的组件在容器中都是单例的
		//注意:分布式下不能运用此锁 TODO 本地锁 :synchronized 。在分布式下,想要锁住所有,必须使用分布式锁
		synchronized (this) {
			//得到所以后,我们应该再去缓存中确定一次,如果没有才需要继续查询
			String json = stringRedisTemplate.opsForValue().get("queryUserTaskJSON");
			if (!StringUtils.isBlank(json)){
				//缓存不为null,直接返回
				return JsonUtils.parseObject(json, new TypeReference<List<T>>() {
				});
			}
			List<T> list = new ArrayList<>();
			//  逻辑代码
			String toJsonString = JsonUtils.toJsonString(list);
			stringRedisTemplate.opsForValue().set("queryUserTaskJSON",toJsonString,7, TimeUnit.DAYS);
			return list;
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值