houdq / blog

java 学习笔记
0 stars 0 forks source link

缓存相关 #61

Open houdq opened 1 year ago

houdq commented 1 year ago
image

缓存的本质和缓存实践

为什么要用缓存?

缓存的本质

通俗理解计算机缓存,可以比喻成水库.

houdq commented 1 year ago

访问缓存的模式

双读双写

一般采用这种写法 image

异步更新

image

串联模式

image

houdq commented 1 year ago

缓存编程实现

编程法

采用各种reis 客户端和 API.比如Jredis api

Spring 注入

Spring Data Redis 是 Spring Data 家族的一个项目,它为 Spring 应用程序提供了与 Redis 数据存储交互的支持。Spring Data Redis 通过 RedisTemplate 和 RedisConnectionFactory 为 Redis 提供了高级的 Redis 操作接口。


- RedisTemplate源码

@Autowired private RedisTemplate<String, Object> redisTemplate;

public void setValue(String key, Object value) { redisTemplate.opsForValue().set(key, value); }

public Object getValue(String key) { return redisTemplate.opsForValue().get(key); }

-注入RedisTemplate

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component;

@Component public class RedisService {

@Autowired
private RedisTemplate<String, String> redisTemplate;

public void setValue(String key, String value) {
    redisTemplate.opsForValue().set(key, value);
}

public String getValue(String key) {
    return redisTemplate.opsForValue().get(key);
}

}


### 注解法
如果你用 springboot,使用 @Cacheable 注解来实现 Redis 缓存非常简单,您只需要按照以下步骤即可:

1. 添加依赖:首先,在 pom.xml 文件中添加 spring-boot-starter-cache 和 spring-boot-starter-data-redis 依赖。

2. 配置 Redis:在 application.properties 或 application.yml 文件中配置 Redis 连接信息。

3. 创建缓存配置:在您的应用程序中创建一个缓存配置类,并使用 @Configuration 和 @EnableCaching 注解进行标注。在这个类中,您可以使用 CacheManagerBuilder.build() 方法来创建一个 RedisCacheManager 对象。

4. 使用 @Cacheable:在需要缓存的方法上使用 @Cacheable 注解,指定缓存名称以及需要缓存的数据 key。
下面是一个使用 @Cacheable 注解来实现 Redis 缓存的示例:

@Service public class UserService {

@Autowired
private UserRepository userRepository;

@Cacheable(value = "user", key = "#id")
public User getUserById(Long id) {
    return userRepository.findById(id).orElse(null);
}

// 其他业务方法...

}

houdq commented 1 year ago

分片模式

客户端分片

应用层操作

代理分片

应用层和缓存服务器中间增加代理层

集群分片

houdq commented 1 year ago

迁移方案

平滑迁移

一致性哈希

houdq commented 1 year ago

redis 为啥是单线程

抛个砖! 回答这个问题先搞明白几个问题:

redis 是什么?

Redis is an open source (BSD licensed), in-memory data structure store used as a database, cache, message broker, and streaming engine. Introduction to Redis

​redis.io/docs/about/

我英语也不好,抛开定于不看,reids 就是一个内存存储!

redis为什么是单线程

它通过避免锁争用来保持低延迟。 Redis Cluster 提供水平扩展,如果不是更好,应该和垂直扩展一样好:N 个单核机器相当于一个跨越 N 个内核的进程。 流水线为您提供更多的吞吐量。Redis 客户端可以通过管道传输达到 ~1M qps 的请求,这比常规流量吞吐量高一个数量级。 无论如何,单台机器的上升空间是有限的。 单线程更简单,我猜的。

redis如何实现多线程

网络 I/O 方面:Redis 使用单线程来处理所有客户端的请求,这在某些情况下可能会成为性能瓶颈。因此,在 Redis 4.0 版本及以上,引入了多线程 I/O 模型,可以让 Redis 在处理网络请求时使用多个线程,从而提高系统的吞吐量和性能。 数据存储方面:Redis 默认使用单线程来处理数据的读写请求,但是在一些高并发的场景下,这样的做法可能会成为性能瓶颈。因此,在 Redis 6.0 版本及以上,引入了多个 I/O 线程和多个工作线程,可以让 Redis 在处理数据的读写请求时使用多个线程,并行地执行操作,从而提高系统的吞吐量和性能。 Redis 的多线程主要是为了提高系统的吞吐量和性能,并不是为了并发执行业务逻辑。

参考: Introduction to Redis redis-analysis-part-1-threading-model/