老废物乐园

Redis 管道与 Lua 脚本:批量操作的性能优化

一个批量接口慢在哪:不是 Redis 慢,是网络慢 八月下旬优化一个批量查询接口。它要一次读 200 个商品的库存,我一开始的写法很直白: public Map<String, Integer> batchGetStock(List<String> skuIds) { Map<String,

Administrator Administrator 发布于 2020-08-23

Redis 缓存预热与热点 key 发现方案

大促前的准备:缓存预热到底该怎么做 八月中旬,运营定在 9 月 9 号做一场大促。我被分到的任务是"保证缓存不崩",具体要回答两个问题:活动开始时缓存是空的怎么办?某个商品突然爆了怎么办? 我们的缓存现状:Redis 6.0,一主两从 + 哨兵,单机 12GB。商品详情页的缓存是「被动」的——用户访

Administrator Administrator 发布于 2020-08-21

Elasticsearch 深分页与 search_after 方案

报错:Result window is too large 运营后台有个"导出全部商品"的功能,前端做成了分页拉取,一页 100 条,用循环一直翻到最后一页。上线当天就炸了,日志里全是这个: org.elasticsearch.ElasticsearchStatusException: Elasti

Administrator Administrator 发布于 2020-08-12

Elasticsearch 倒排索引原理与第一次调优

接手搜索需求:MySQL like 已经撑不住了 七月份产品提了个需求:商品搜索要支持关键词模糊匹配、按分类筛选、按价格排序、还要高亮。我们当时是这么查的: SELECT * FROM t_item WHERE title LIKE CONCAT('%', #{keyword}, '%') AN

Administrator Administrator 发布于 2020-07-25

Redis 分布式锁从 setnx 到 Redisson 的演进

一次库存超发,我们把手写的 setnx 锁全换成了 Redisson 3 月底的一次促销活动,某款商品库存 200 件,实际卖出 213 件。超发 13 件。客服赔了 13 张 50 元券,加上运营的抱怨,够我记很久。 查下来是分布式锁失效。我们当时用的是自己封装的 setnx 锁,问题出在一个很隐

Administrator Administrator 发布于 2020-04-02

Elasticsearch 写入性能调优:从 500 TPS 到 5000 TPS

1.2 亿条订单导入 ES,按当时的速度要跑 66 小时 二月初接了个活:把 MySQL 里 2017 年之后的历史订单同步到 Elasticsearch,给客服系统做多条件检索。总共 1.24 亿条。 我先用原来的同步代码跑了半小时,用 _cat/indices 数了一下文档数增长:单机 470

Administrator Administrator 发布于 2020-02-13

Redis 主从复制与哨兵高可用部署实践

故障演练那天,我们丢了 400 多条缓存 key 公司 7 月底做了一次故障演练,运维在预发环境把 Redis 主节点的进程 kill 掉,看哨兵能不能自动切换。切是切成功了,但演练结束后比对数据,主库的 key 数量是 12,480,331,切过去之后新主库只有 12,479,905,少了 426

Administrator Administrator 发布于 2019-08-04

Redis 持久化 RDB 与 AOF 该怎么选

宿主机重启,Redis 丢了 5 分钟的数据 4 月 20 号凌晨,云厂商的一台宿主机异常重启,我们的 Redis 主节点正好在上面。进程恢复之后,运营来反馈:03:12 到 03:17 之间领取的优惠券,用户端显示"未领取",但业务库里记录是有的。 核对下来丢了 2347 条。我们 Redis 5

Administrator Administrator 发布于 2019-04-26

缓存与数据库一致性问题:先更新库还是先删缓存

code review 时,我们为一个顺序吵了半小时 一月中旬,同事小王提了个 PR,商品改价接口里他这么写的: @Transactional public void updatePrice(Long skuId, BigDecimal newPrice) { redisTemplate.d

Administrator Administrator 发布于 2019-01-11

Redis 五种数据类型分别该用在什么场景

我一度以为 Redis 就是个能过期的 String 字典 刚接触 Redis 那两个月,我写的缓存代码全是这个画风: // 用户信息缓存 redisTemplate.opsForValue().set("user:" + userId, JSON.toJSONString(user), 1, Ti

Administrator Administrator 发布于 2018-11-22