面试题答案
一键面试- 使用INCR命令实现文章点赞数增加
- 操作方法:
在Redis中,可以将每篇文章的点赞数存储为一个键值对,键可以设计为类似于
article:点赞数:文章ID
的格式。当用户对文章点赞时,使用INCR
命令对该键对应的值进行自增操作。例如,假设文章ID为1,在Redis客户端中可以执行如下命令:
- 操作方法:
在Redis中,可以将每篇文章的点赞数存储为一个键值对,键可以设计为类似于
INCR article:点赞数:1
- 处理并发问题:
INCR
命令在Redis中是原子性操作,这意味着无论有多少并发请求同时执行INCR
命令,Redis都会保证每个INCR
操作是完整且互不干扰的。所以在处理文章点赞数增加的并发问题上,无需额外的复杂机制,Redis自身就可以保证数据的一致性。
- 使用DECR命令实现取消点赞功能
- 操作方法:
与点赞类似,当用户取消点赞时,使用
DECR
命令对相应文章点赞数的键值进行自减操作。同样以文章ID为1为例,在Redis客户端中执行:
- 操作方法:
与点赞类似,当用户取消点赞时,使用
DECR article:点赞数:1
- 注意问题:
- 点赞数下限:需要注意点赞数不能小于0。如果出现点赞数为0时用户继续取消点赞的情况,可能需要在应用层进行判断,不允许这种操作;或者在Redis中,在执行
DECR
命令后,检查点赞数是否小于0,如果小于0则将其设置为0。例如,在Python中使用Redis - Py库可以这样实现:
- 点赞数下限:需要注意点赞数不能小于0。如果出现点赞数为0时用户继续取消点赞的情况,可能需要在应用层进行判断,不允许这种操作;或者在Redis中,在执行
import redis
r = redis.Redis(host='localhost', port = 6379, db = 0)
article_key = 'article:点赞数:1'
r.decr(article_key)
if int(r.get(article_key)) < 0:
r.set(article_key, 0)
- **并发问题**:虽然`DECR`命令本身是原子性的,但在检查点赞数下限等额外操作时,如果有并发情况,可能会出现数据不一致问题。例如多个并发请求同时取消点赞,在检查是否小于0前都得到当前点赞数为0,都执行`DECR`后,可能会出现点赞数为负数的情况。可以通过使用Redis的事务(`MULTI`、`EXEC`)来保证检查和设置操作的原子性。例如:
MULTI
DECR article:点赞数:1
GET article:点赞数:1
IF value < 0
SET article:点赞数:1 0
EXEC
在实际编程中,不同的Redis客户端库对事务的支持方式略有不同,但基本思路是一致的。