缓存解决方案

这篇具有很好参考价值的文章主要介绍了缓存解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

在服务端编程当中,缓存主要是指将数据库的数据加载到内存中,之后对该数据的访问都在内存中完成,从而减少了对数据库的访问,解决了高并发场景中数据库容易成为性能瓶颈的问题;以及基于内存的访问速度高于磁盘的访问速度的原理(数据库读取数据一般需要从磁盘读取),提高了数据的访问速度和程序性能。

根据缓存是否与应用进程属于同一进程,可以将内存分为本地缓存和分布式缓存。本地缓存是在同一个进程内的内存空间中缓存数据,数据读写都是在同一个进程内完成;而分布式缓存是一个独立部署的进程并且一般都是与应用进程部署在不同的机器,故需要通过网络来完成分布式缓存数据读写操作的数据传输

简介

  • 本地缓存: 指的是在应用中的缓存组件,其最大的优点是应用和cache是在同一个进程内部,请求缓存非常快速,没有过多的网络开销等,在单应用部需要集群支持或者集群情况下各节点无需互相通知的场景下使用本地缓存较合适,同时,它的缺点也是应为缓存跟应用程序耦合,多个应用程序无法直接的共享缓存,各个应用或集群的各节点都需要维护自己的单独缓存,对内存是一种浪费。
  • 分布式缓存:指的是与应用分离的缓存组件或服务,其最大的优点是自身就是一个独立的应用,与本地应用隔离,多个应用可直接的共享缓存

caffeine实战

  • 简介
    Caffeine是基于Java 1.8的高性能本地缓存库,由Guava改进而来。本文将介绍如何在Java中使用Caffeine本地缓存,以及SpringBoot中的缓存使用实战

  • pom依赖

   <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
        </dependency>
  • 配置类
@Configuration
public class CacheConfig {
    @Bean
    public Cache<String, Object> caffeineCache() {
        return Caffeine.newBuilder()
                // 设置最后一次写入或访问后两个小时后过期
                .expireAfterWrite(7200, TimeUnit.SECONDS)
                // 初始的缓存空间大小
                .initialCapacity(100)
                // 缓存的最大条数
                .maximumSize(1000)
                .build();
    }
}
  • controller
@RestController
public class TestController {
    @Resource
    private Cache<String,Object> caffeineCache;
    @GetMapping("/test-caffeine")
    public String testCaffeine(){

        //存数据
        caffeineCache.put("test","hello");
        //读数据
        String result = (String) caffeineCache.asMap().get("test");
        return result;
    }
}

redis 分布式缓存实战

  • 简介

Redis 通常被称为数据结构服务器。这意味着,Redis 可通过一系列命令访问可变数据结构,这些命令通过 TCP 套接字和简单协议以服务器-客户端模式发送。因此,不同进程可以通过共享方式查询和修改相同的数据结构。

Redis 中的数据结构具有一些特殊属性:

Redis 会将它们存储在磁盘上,即使它们总是在服务器内存中提供和修改。这意味着 Redis 不仅速度快,而且不易挥发。
数据结构的实现强调内存效率,因此与使用高级编程语言建模的相同数据结构相比,Redis 中的数据结构使用的内存可能更少。
Redis 提供了许多在数据库中自然能找到的功能,如复制、可调整的耐用性级别、集群和高可用性。
另一个很好的例子是,将 Redis 视为更复杂版本的 memcached,其中的操作不仅仅是 SET 和 GET,而是处理复杂数据类型(如列表、集合、有序数据结构等)的操作。

如果你想了解更多,这里列出了一些入门知识:

Redis 数据类型介绍。https://redis.io/topics/data-types-intro
直接在浏览器中试用 Redis。https://try.redis.io
Redis 命令的完整列表。https://redis.io/commands
Redis 官方文档中还有更多内容。https://redis.io/documentation

  • pom依赖
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
  • config
@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Autowired
    private RedisConnectionFactory redisConnectionFactory;


    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(objectMapper);

        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(serializer);
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(serializer);
        redisTemplate.afterPropertiesSet();

        return redisTemplate;
    }

    @Bean
    public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {
        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));
        return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
    }
}

  • controller
@RestController
public class TestController {
  
    @Resource
    private RedisTemplate redisTemplate;

    @Resource
    private StringRedisTemplate stringRedisTemplate;
   
    @GetMapping("/test-redis")
    public String testRedis(){
        redisTemplate.opsForValue().set("name","沉默王二");
        return (String) redisTemplate.opsForValue().get("name");
    }
}

gitee项目地址

https://gitee.com/GZ-jelly/microservice-sample文章来源地址https://www.toymoban.com/news/detail-675022.html

到了这里,关于缓存解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Spring Boot循环依赖的症状和解决方案

    🏆 文章目标:了解Spring Boot 循环依赖的原因,并学习下解决方案 🍀 Spring Boot循环依赖的症状和解决方案 ✅ 创作者:Jay… 🎉 个人主页:Jay的个人主页 🍁 展望:若本篇讲解内容帮助到您,请帮忙点个赞,再动动您的小手关注下吧,您的支持是我继续写作的最大动力,谢谢

    2023年04月22日
    浏览(9)
  • Spring Boot 多数据源及事务解决方案

    Spring Boot 多数据源及事务解决方案

    一个主库和N个应用库的数据源,并且会同时操作主库和应用库的数据,需要解决以下两个问题: 如何动态管理多个数据源以及切换? 如何保证多数据源场景下的数据一致性(事务)? 本文主要探讨这两个问题的解决方案,希望能对读者有一定的启发。 通过扩展Spring提供的抽象

    2024年02月10日
    浏览(6)
  • Java缓存穿透、击穿、雪崩解决方案

    在互联网高并发的场景下,对于数据库查询频率高的数据,为了提高查询效率,常常会采用缓存技术进行优化。然而,缓存技术也会带来一些问题,比如缓存穿透、缓存击穿和缓存雪崩等。 当我们从缓存中查询一个不存在的数据时,请求就会穿透缓存直接查询数据库,这样就

    2023年04月19日
    浏览(55)
  • Java 常见缓存详解以及解决方案

    Java 常见缓存详解以及解决方案

    首先我们准备一个接口 两个实现的方法, 当我们调用这个queryAll()方法时我们需要调用selectAll()方法来查询数据  调用此接口实现效果  这个时候我们就可以发现了问题,我们调用方法之后对数据库查询了两次,但是只有一次请求这样进行了多次查询,造成了资源的浪费

    2024年01月25日
    浏览(7)
  • Spring Boot 解决跨域问题的 5种方案

     跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。 在请求时,如果出现了以下情况中的任意一种,那么它就是跨域请求: 协议不同,如 http 和 https; 域名不同; 端口不同。 也就是说, 即使域名相同,如果一个使用的是

    2024年02月15日
    浏览(29)
  • Java架构师缓存架构设计解决方案

    Java架构师缓存架构设计解决方案

    想学习架构师构建流程请跳转:Java架构师系统架构设计

    2024年02月07日
    浏览(9)
  • maven打包spring boot jar没有 BOOT-INF目录解决方案

    ##查看项目里面是否有引入spring-boot-maven-plugin plugin           groupIdorg.springframework.boot/groupId           artifactIdspring-boot-maven-plugin/artifactId         /plugin ##如果有引入,还不行 ##查看pom.xml是否有pluginManagement标签,去掉pluginManagement就行了 ##去掉pluginManagement标签

    2024年01月18日
    浏览(9)
  • Spring Boot系统之高可用限流实现解决方案

    Spring Boot系统之高可用限流实现解决方案

    1.什么是限流 限流是对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机。 为什么需要限流 其实限流思想在生活中随处可见,例如景区限流,防止人满为患。热门餐饮需要排队就餐等。回到互联网网络上,同样也

    2024年02月11日
    浏览(8)
  • Spring Boot 项目优雅关闭(两种完善解决方案附带示例代码)

    Spring Boot 项目优雅关闭(两种完善解决方案附带示例代码)

    Spring Boot 项目优雅关闭常用两种方案,一种是使用 kill -2 和 -15 发送程序终止信号,另一种是使用 spring-boot-actuator 包提供一个优雅下线接口,这两种方案根据自己喜好来,万不得已别用 kill -9 就行,个人推荐第一种,对于Spring Boot 项目来说两种方法只是入口不同,最终关闭逻

    2024年02月03日
    浏览(8)
  • Spring Boot读取resource目录下文件失败解决方案及分析

    最近有个需求,就是需要从resource目录下读取文件返回给用户。在idea中运行时,有些resource下文件读取工具类能够正常获取读取到文件。但是通过java –jar的方式去运行jar包,此时resource下文件读取工具类读取文件就失效了。通过查询搜索,了解到了是读取的方式导致文件读取

    2024年02月05日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包