面试题答案
一键面试使用 Redis LIMIT 实现分页数据缓存思路
- 数据存储:将数据以合适的数据结构(如列表
list
)存储在 Redis 中。例如,使用RPUSH
命令将所有数据依次添加到一个列表中。 - 分页获取:使用
LRANGE
命令,它类似于LIMIT
功能,通过指定起始索引和结束索引来获取分页数据。例如,LRANGE key start stop
,start
为起始索引,stop
为结束索引(包含该索引位置的数据)。
数据更新时保证缓存一致性思路
- 缓存更新策略:当数据库中的数据更新时,同时更新 Redis 中对应的缓存数据。可以采用以下几种方式:
- 立即更新:在数据更新操作完成后,立即更新 Redis 缓存。
- 异步更新:使用消息队列(如 Kafka、RabbitMQ 等),将数据更新消息发送到队列中,由专门的消费者来更新 Redis 缓存。
代码示例(Python + Redis)
import redis
# 连接 Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 模拟向 Redis 插入大量数据
def insert_data():
data_list = [f'data_{i}' for i in range(1000)]
for data in data_list:
r.rpush('my_data', data)
# 获取分页数据
def get_paginated_data(page, page_size):
start = (page - 1) * page_size
end = start + page_size - 1
return r.lrange('my_data', start, end)
# 模拟数据更新
def update_data(new_data, index):
# 先更新数据库(这里省略实际数据库操作)
# 然后更新 Redis 缓存
r.lset('my_data', index, new_data)
if __name__ == '__main__':
insert_data()
page = 2
page_size = 10
result = get_paginated_data(page, page_size)
print(f"第 {page} 页的数据: {result}")
new_data = 'updated_data'
index = 5
update_data(new_data, index)
print(f"更新索引 {index} 为 {new_data} 后,重新获取第 {page} 页的数据: {get_paginated_data(page, page_size)}")
上述代码首先模拟向 Redis 插入大量数据,然后通过 get_paginated_data
函数实现分页获取数据。update_data
函数模拟数据更新,并在更新数据库后同步更新 Redis 缓存。