缓存解决方案

背景

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

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

简介

  • 本地缓存: 指的是在应用中的缓存组件,其最大的优点是应用和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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫果冻

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值