黑马程序员 Redis 踩坑及解决
文章目录
实战篇
p30 短信登录-隐藏用户敏感信息
问题描述:登录后会跳转到 index.html
解决办法:
-
更改 nginx-1.18.0\html\hmdp\login.html 第 87 行为:
location.href = "/info.html" -
更改 UserController 中 /user/me 方法:
@GetMapping("/me")
public Result me(){
// 获取当前登录的用户并返回
UserDTO user = UserHolder.getUser();
return Result.ok(user);
}
p50 优惠券秒杀-添加优惠券
问题描述:访问 http://localhost:8080/shop-detail.html?id=1 不显示优惠券
解决办法:
将 tb_seckill_voucher 表中的 end_time 改为当前时间之后的日期

使用 postman 添加优惠券的请求内容:
{
"shopId": 1,
"title": "100元代金券",
"subTitle": "周一至周五均可使用",
"rules": "全场通用\\n无需预约\\n可无限叠加\\不兑现、不找零\\n仅限堂食",
"payValue": 8000,
"actualValue": 10000,
"type": 1,
"stock": 100,
"beginTime": "2023-01-26T10:09:17",
"endTime": "2023-12-26T23:59:59"
}
p69 秒杀优化-异步秒杀思路
问题描述:根据用户信息生成 token.txt
解决办法:在测试类中添加如下方法
@Test
public void createToken() throws IOException {
List<User> list = userService.list();
PrintWriter printWriter = new PrintWriter(new FileWriter("E:\\token.txt"));
for(User user: list){
String token = UUID.randomUUID().toString(true);
UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
Map<String, Object> userMap = BeanUtil.beanToMap(userDTO, new HashMap<>(),
CopyOptions.create()
.setIgnoreNullValue(true)
.setFieldValueEditor((fieldName, fieldValue)->fieldValue.toString()));
String tokenKey = LOGIN_USER_KEY + token;
stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);
stringRedisTemplate.expire(tokenKey, LOGIN_USER_TTL, TimeUnit.MINUTES);
printWriter.print(token + "\n");
printWriter.flush();
}
}
执行结果:

p81 达人探店-点赞排行榜
问题描述:详情页下面位置点赞无反应

解决办法:
- 在 nginx-1.18.0\html\hmdp\blog-detail.html 第 78 行添加
@click="addLike()"

p87 好友关注-实现滚动分页查询
问题描述:实现滚动查询的方法 queryBlogOfFollow 中,关于 offset 计算有问题,下面的 os 变量只记录了单页数据中最后一个 score 的重复次数,并不能作为 下次查询的 offset

解决办法:在上述代码末尾添加如下内容
os = minTime == max ? os + offset : os;
案例中,使用 ZSet 实现排序时,注意参数的设置规则:
reverseRangeByScoreWithScores(K key, double min, double max, long offset, long count);
min:0,这里使用时间戳作为 score,所以最小值可以直接给 0max(注意):- 第一次查询:当前时间戳
- 非第一次查询:上次查询的最小时间戳
offset(注意):- 第一次查询: 0
- 非第一次查询
- 如果当前页最后一条数据的 score 与上一页最后一条数据的 score 相同,则下一页的 offset 就是上一页的 offset + 当前页最后一个 score 的重复次数
- 如果当前页最后一条数据的 score 与上一页最后一条数据的 score 不相同,则下一页的 offset 就是当前页最后一个 score 的重复次数
count:给定每次查询个数
问题描述:向下滚动分页时,如果数据很多,后续滚动无效果,不触发查询下一页
解决办法:在 nginx-1.18.0\html\hmdp\info.html 页面,添加 <div style="height:101%"> 标签作为 <div class="blog-box" > 的父级,具体如下:

p90 附近商铺-实现附近商户功能
问题描述:当页面展示的数据高度不超过 <div class="shop-box"> 容器的高度时,无法实现滚动
解决办法:在 nginx-1.18.0\html\hmdp\shop-list.html 页面,添加 <div style="height:101%"> 标签作为 <div class="shop-box" > 的父级,具体如下:

高级篇
p110 分布式缓存-15-Redis分片集群-集群伸缩
问题描述:实现删除 7004 节点
解决办法:
只需要使用如下命令:
redis-cli --cluster del-node IP:PORT NODE-ID
# IP:PORT: 要删除的节点地址和端口;
# NODE-ID: cluster nodes查到的node-id, 必须和ip:port保持一致,防止误删;如果不一致会报错;
注意 :在删除主节点前,需要确保这个主节点是空的,如果不是空的,需要将这个节点的数据重新分片到其他主节点上。
1、将主节点 7004 的 slots 分配到其他主节点上,这里分配给 7001 节点

2、输入 yes 接受这个计划,然后回车,开始 7004 节点的 slots 的转移

3、slots 转移完毕后,执行 redis-cli -c -p 7001 连接 redis,执行 cluster nodes查看节点,7004 节点的 slots 已经转移到了 7001 节点

4、使用 redis-cli --cluster del-node IP:PORT NODE-ID 命令删除 7004 节点

p122 多级缓存-10-OpenResty快速入门
问题描述:按照步骤配置完 nginx 映射后,重启 nginx 后访问 http://localhost/item.html?id=10001 不成功
解决办法:如果配置没有问题,可能是启动了多个 nginx 进程,将其全部停止,然后重启。具体步骤:
1、打开 cmd 命令对话框,查看所有 nginx.exe 进程,输入命令:
tasklist /fi "imagename eq nginx.exe"

2、结束这些进程,输入命令:
taskkill /fi "imagename eq nginx.exe" /f

3、然后执行 start nginx.exe 重启,重新访问 http://localhost/item.html?id=10001

p125 多级缓存-13-向tomcat发送http请求
问题描述:访问 http://localhost/item.html?id=10001 不成功,报 500 错误

解决办法:
1、首先检查 /usr/local/openresty/nginx/conf/nginx.conf 文件的配置

启动 ItemApplication 服务,使用上述配置的 ip 地址替换 localhost,确保在本机你能够访问成功

2、检查 /usr/local/openresty/nginx/lua/item.lua 配置文件内容,资料中给的这段配置有错误

3、重启 nginx 服务,访问 http://localhost/item.html?id=10003

p128 多级缓存-16-查询Redis
问题描述:如果使用自己默认的 redis,并且 redis 设置有密码的情况下,停掉 tomcat 服务后,访问 redis 不成功,是因为老师使用 docker 创建 redis 镜像不需要密码,资料中的 lua 脚本里连接 redis 的函数是没有设置密码的。
解决办法:
1、在 pom.xml 配置文件中添加自己 redis 的密码
spring:
redis:
host: 192.168.151.101
password: 123
2、修改 /usr/local/openresty/lualib/common.lua 文件中 read_redis 函数,添加参数,设置密码,具体如下:

3、修改 /usr/local/openresty/nginx/lua/item.lua 文件中 redis_data 函数的调用,传递密码参数,具体如下:

更多推荐

所有评论(0)