专业的JAVA编程教程与资源

网站首页 > java教程 正文

缓存解决方案(缓存三大问题)

temp10 2024-10-25 17:00:04 java教程 11 ℃ 0 评论

[玫瑰][玫瑰][玫瑰]春风拂面,我守候在此,我是行者

背景

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

缓存解决方案(缓存三大问题)

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

简介

  • 本地缓存

指的是在应用中的缓存组件,其最大的优点是应用和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 数据类型介绍。https://redis.io/topics/data-types-intro

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","redis");
        return (String) redisTemplate.opsForValue().get("name");
    }
}

gitee项目地址

https://gitee.com/GZ-jelly/microservice-sample

您对文章或者编程有什么建议、想法、问题,都可以评论区留言互动哦

每天不断更,精彩不停止,明天见,我是行者

记得留个关注哟,让我们一起去看星辰大海,品味代码人

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表