redis是缓存层 ,mysql是存储层,这种架构将 Redis 和 MySQL 结合起来,使得应用程序能够在需要快速访问数据时从 Redis 获取数据,而在需要持久性和复杂查询时从 MySQL 获取数据。这种分层的数据存储和缓存策略有助于提高应用程序的性能和可伸缩性。
这种分层策略的优点:
1.提高读取性能:因为redis的数据存在内存中,所以读取时速度快,通过将经常被访问的数据缓存到redis中,可以显著减少从mysql中的读取次数,从而加快读取操作。
2.降低数据库负载:通过减少数据库的读取负载,减轻了数据库的压力。
3.支持高并发:Redis 可以轻松处理高并发的读取请求,因为它的响应时间非常短。这有助于应对访问高峰期的流量。
4. 提高用户体验:快速的数据访问和响应时间可以提高用户体验,使用户感觉应用程序更加流畅和快速。
数据的调用通常按照以下流程进行:
-
读取数据流程:
- 当应用程序需要读取某个数据时,首先会查询 Redis 缓存以查看数据是否已经存在于缓存中。
- 如果数据存在于 Redis 缓存中,应用程序将直接从 Redis 获取数据,并将其返回给用户。这样可以快速响应用户请求,减轻 MySQL 数据库的负载。
- 如果数据不存在于 Redis 缓存中,应用程序会发起一个查询请求到 MySQL 数据库,获取所需的数据。
- 获取数据后,应用程序将数据存储到 Redis 缓存中,以便下次查询时可以直接从缓存获取数据。同时,还需要设置适当的过期时间,以确保缓存中的数据在一段时间后失效并被重新加载。
-
写入数据流程:
- 当应用程序需要写入或更新数据时,它首先会将数据写入 MySQL 数据库。这确保了数据的持久性和一致性。
- 在成功写入 MySQL 数据库后,应用程序可能会通过一定的机制来使 Redis 缓存中的相关数据失效。这是为了确保下次读取数据时,从 MySQL 获取最新的数据。
- 另一种方法是直接更新 Redis 缓存中的数据,以确保缓存中的数据与数据库中的数据保持同步。这种方法需要额外的实现,以确保数据一致性。
// 读取文章访问量 public int getArticleViews(int articleId) { // 先查询 Redis 缓存 String redisKey = "article:" + articleId + ":views"; String cachedViews = redis.get(redisKey); if (cachedViews != null) { // 从缓存中获取访问量 return Integer.parseInt(cachedViews); } else { // 从 MySQL 数据库中获取访问量 int views = mysql.queryArticleViews(articleId); // 将数据存储到 Redis 缓存中,并设置过期时间 redis.setex(redisKey, 3600, String.valueOf(views)); return views; } } // 更新文章访问量 public void incrementArticleViews(int articleId) { // 先更新 MySQL 数据库中的访问量 mysql.incrementArticleViews(articleId); // 然后使 Redis 缓存中的数据失效 String redisKey = "article:" + articleId + ":views"; redis.del(redisKey); }