java从入门到项目实战pdf百度云,Redis应用之缓存实现

Redis的众多应用场景中缓存绝对是频率最高的场景了。本文来介绍下Redis作为缓存要注意的地方。

Redis缓存

=====================================================================

1.缓存概述


缓存(Cache)的作用是减少服务器对数据源的访问频率,从而提高数据库的稳定性。访问的流程如下。

在这里插入图片描述

流程图

在这里插入图片描述

代码逻辑

public Goods searchArticleById(Long goodsId){

Object object = redisTemplate.opsForValue().get(String.valueOf(goodsId));

if(object != null){// 缓存查询到了结果

return (Goods)object;

}

// 开始查询数据库

Goods goods = goodsMapper.selectByPrimaryKey(goodsId);

if(goods!=null){

// 将结果保存到缓存中

redisTemplate.opsForValue().set(String.valueOf(goodsId),goods,60,TimeUnit.MINUTES);;

}

return goods;

}

2.缓存方式


缓存中的数据在redis中的存储方式有两种,一种是永久存在,不设置过期时间,第二种是设置过期时间。这两种方式都需要尽可能的保证数据的一致性(和数据源中的数据保持同步)。

2.1不设置过期时间

当我们将缓存数据的key设置为永久存在时会存在数据同步和内存消耗逐渐增大的情况,解决方式如下:

数据同步

  1. 禁止直接操作数据源,避免因数据源直接被改动而造成缓存数据不一致的问题

  2. 如果有其他系统操作同一个数据源,这种情况肯定会产生数据不一致的情况。

  3. 系统执行DML操作时,应该将缓存中对应的数据删除。用户下一次相关请求时直接从数据源中获取。

内存消耗

随着业务的增多,缓存数据必然会越来越多,所占用的内存也随之增多,系统的压力也会变大,这时一种方式是给key设置过期时间,但是过期时间长短不太好把握,这时我们可以通过设置redis最大内存来实现,并让Redis按照一定的规则淘汰不需要的缓存键,这种方式在redis只作为缓存使用时非常实用。

具体实现方式:修改redis配置文件(redis.conf)中的maxmemory参数既可,限制Redis最大可用内存大小(单位字节),当超出了这个限制时Redis会依据maxmemory-policy参数指定的策略来删除不需要的key直到Redis占用的内存小于指定内存。

在这里插入图片描述

| 规则 | 说明 |

| :-- | :-- |

| volatile-lru | 使用LRU算法删除一个key(只对设置了过期时间的key有效) |

| allkeys-lru | 使用LRU算法删除一个key |

| volatile-lfu | 使用LFU算法删除一个key(只对设置了过期时间的key有效) |

| allkeys-lfu | 使用LFU算法删除一个key |

| volatile-random | 随机删除一个key(只对设置了过期时间的key有效) |

| allkeys-random | 随机删除一个key |

| volatile-ttl | 删除过期时间最近的一个key |

| noeviction | 不删除key,只返回错误 |

LRU:(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”

LFU:(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。

2.2设置过期时间

对保存到Redis中的key设置过期时间,但同样也会遇到问题,比如过期时间怎么设置,内存资源同样也会过大。

内存资源

同样需要设置maxmemory来限制redis使用的最大内存和配置maxmemory-policy来指定删除策略。

过期时间设置

过期时间不要设置统一固定的时间,比如60分钟,这样会造成相同时间点大量缓存被清空,数据库访问量突然增大的情况,我们应该对过期时间设置合理范围内的随机值。比如:采取不同分类商品,缓存不同周期。在同一分类中的商品,加上一个随机因子。这样能尽可能分散缓存过期时间,而且,热门类目(女装)的商品缓存时间长一些,冷门类目(图书)的商品缓存时间短一些,也能节省缓存服务的资源。

public Goods searchArticleById(Long goodsId){

Object object = redisTemplate.opsForValue().get(String.valueOf(goodsId));

if(object != null){// 缓存查询到了结果

return (Goods)object;

}

// 开始查询数据库

Goods goods = goodsMapper.selectByPrimaryKey(goodsId);

if(goods!=null){

Random random = new Random();

// 将结果保存到缓存中

if(goods.getGoodsCategory().equals(“女装”)){

int time = 3600 + random.nextInt(3600);

// 热门商品

redisTemplate.opsForValue()

.set(String.valueOf(goodsId)

,goods

,time

,TimeUnit.MINUTES);

}else{

int time = 600 + random.nextInt(600);

// 冷门商品

redisTemplate.opsForValue()

.set(String.valueOf(goodsId)

,goods

,time

,TimeUnit.MINUTES);

}

}else{

// 防止缓存穿透

redisTemplate.opsForValue()

.set(String.valueOf(goodsId)

,null

,60

,TimeUnit.MINUTES);

}

return goods;

}

3.名称解释


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

那么如何才能正确的掌握Redis呢?

为了让大家能够在Redis上能够加深,所以这次给大家准备了一些Redis的学习资料,还有一些大厂的面试题,包括以下这些面试题

  • 并发编程面试题汇总

  • JVM面试题汇总

  • Netty常被问到的那些面试题汇总

  • Tomcat面试题整理汇总

  • Mysql面试题汇总

  • Spring源码深度解析

  • Mybatis常见面试题汇总

  • Nginx那些面试题汇总

  • Zookeeper面试题汇总

  • RabbitMQ常见面试题汇总

JVM常频面试:

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Mysql面试题汇总(一)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Mysql面试题汇总(二)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Redis常见面试题汇总(300+题)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
[外链图片转存中…(img-ghI7RJdy-1713422864649)]

Mysql面试题汇总(二)

[外链图片转存中…(img-4ugSFeck-1713422864649)]

Redis常见面试题汇总(300+题)

[外链图片转存中…(img-zDzgxkGz-1713422864649)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值