面试题答案
一键面试缓存更新策略设计
- 先更新数据库,再删除缓存:这种策略相对简单直观。在商品信息发生变化时,首先更新数据库中的商品数据,确保数据的持久性和一致性。然后,使用Redis命令删除对应的缓存数据。当下次请求该商品数据时,由于缓存中不存在,系统会从数据库中读取并重新缓存。
- 先更新数据库,再更新缓存:此策略在更新数据库后,直接使用新的数据更新Redis缓存。这种方式能保持缓存数据的实时性,但在高并发场景下可能会出现数据不一致问题,比如更新缓存操作还未完成,另一个请求读取到了旧的缓存数据。
可能用到的Redis命令及其多态形式
- 删除缓存 - DEL 命令:
- 基本形式:
DEL key
,用于删除指定的键值对。例如,假设商品在Redis中的键为product:123
(其中123是商品ID),当商品信息更新后,可以使用DEL product:123
删除该商品的缓存。 - 多态形式:在一些编程语言的Redis客户端中,可能会有不同的方法来调用这个命令。比如在Python的
redis - py
库中,可以这样使用:
- 基本形式:
import redis
r = redis.Redis(host='localhost', port=6379, db = 0)
r.delete('product:123')
- 更新缓存 - SET 命令:
- 基本形式:
SET key value [EX seconds] [PX milliseconds] [NX|XX]
。用于设置指定键的值。例如,当商品信息更新后,将新的商品数据序列化为JSON字符串new_product_json
,然后使用SET product:123 new_product_json EX 3600
(假设设置缓存过期时间为1小时)来更新缓存。 - 多态形式:在Java中使用Jedis库时,代码如下:
- 基本形式:
import redis.clients.jedis.Jedis;
public class RedisExample {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
String newProductJson = "{...}";// 新的商品JSON数据
jedis.setex("product:123", 3600, newProductJson);
}
}
其中setex
方法是SET
命令的一种多态形式,它在设置值的同时可以指定过期时间。