首页 > 数据库 >Redis 6 学习笔记 4 —— 通过秒杀案例,学习并发相关和apache bench的使用,记录遇到的问题

Redis 6 学习笔记 4 —— 通过秒杀案例,学习并发相关和apache bench的使用,记录遇到的问题

时间:2023-10-24 21:56:00浏览次数:44  
标签:脚本 Redis redis bench 问题 并发 Apache apache 超卖

背景

这是某硅谷的redis案例,主要问题是解决计数器和人员记录的事务操作

按照某硅谷的视频敲完之后出现这样乱码加报错的问题

 乱码的问题要去tomcat根目录的conf文件夹下修改logging.properties,把下面两个encoding参数都改成GBK就行。

其实错误也很明显(ClassNotFoundException),就是有包没有加进项目的lib中。好在idea添加包也很方便

 

又报了如下错误

com.atguigu.SecKillServlet cannot be cast to jakarta.servlet.Servlet

 查资料发现是因为我刚好用的是tomcat10的版本,编写servlet的时候要导入jakarta.Servlet.*的包,而不是javax.servlet。

这里我懒得改命名了,直接用原项目的tomcat名字,所以后面显示Tomcat 8.5.572。。

没有这个提示,也就是找不到tomcat的包的朋友们注意要进行下面的操作。

设计并发,使用Apache Bench

Apache VS17 binaries and modules download (apachelounge.com)

直接下载解压就能用了。Apache Bench的参数意义与使用

 

 

本来设置商品数量是10个的,并发情况下一下子就突破了。

超卖和超时问题

超时问题是redis报错connect time out,改成使用连接池就行。

超卖问题的解决跟上锁有关,使用redis的乐观锁机制(watch监视库存量、multi获取事务类组合秒杀过程、exec执行)可以解决。

库存遗留问题

这个是由乐观锁引起的。乐观锁的机制是不上锁,谁先修改就以谁为准,所以会有修改失败的情况。这时候就会有库存的遗留问题,因为有可能会秒杀失败但不是因为库存不够引起的。

解决方案:Lua脚本

将复杂的或者多步的redis操作,写为一个脚本,一次提交给redis执行,减少反复连接redis的次数。提升性能。

LUA脚本是类似redis事务,有一定的原子性,不会被其他命令插队,可以完成一些redis事务性的操作。

但是注意redis的lua脚本功能,只有在Redis 2.6以上的版本才可以使用。

利用lua脚本淘汰用户可以解决超卖问题。redis 2.6版本以后,通过lua脚本解决争抢问题,实际上是redis 利用其单线程的特性,用任务队列的方式解决多任务并发问题

 

标签:脚本,Redis,redis,bench,问题,并发,Apache,apache,超卖
From: https://www.cnblogs.com/joey-redfield/p/17052436.html

相关文章

  • docker安装redis
    docker安装Redis拉取镜像dockerpullredis创建目录mkdir/tool/redis镜像里不包含配置文件,需要拉取redis最新的配置文件,查看下载完成直接通过ftp传到/tool/reids目录下就行因为是官方配置,需要我们手动改下配置:#常用配置bind127.0.0.1 #注释掉这部分,使redis可以......
  • 为什么单线程Redis能那么快
    单线程澄清Redis的单线程,指的是Redis的键值对读写由一个线程来完成。Redis的多线程:持久化异步删除集群数据同步网络IO(Redis6.0引入,5.0及之前都是单线程)......
  • Redis-cluster群集操作步骤(主从切换、新增、删除主从节点)
    1.进入集群客户端任意选一个redis节点,进入redis所在目录cd/redis所在目录/src/./redis-cli-h本地节点的ip-predis的端口号-a密码[root@mysql-db01~]#redis-cli-h10.0.0.51-p637910.0.0.51:6379> 2.查看集群中各个节点状态集群(cluster)clusterinfo......
  • docker-搭建一主两备redis集群
    一目的docker-搭建一主两备redis集群概述:目前要搭建一个“一主两备”redis集群,这个三个容器中redis的端口号为默认的6379,对外暴露的端口为6701,6702,6703,其中6701为master。6702和6703为slave二实现1.准备三份配置文件 1.1配置文件可从网上下载,下载后,可按该贴作修改,http......
  • ClickeOnce 打包 vc_redist
    添加RuntimeLibraries在VisualStudio项目属性中,选择发布,选择系统必备组件,然后选中VisualC++RuntimeLibraties,选中“从与我的应用程序相同的位置下载系统必备组件”下载下载vc_redist放入C:\ProgramFiles(x86)\MicrosoftSDKs\ClickOnceBootstrapper\Packages......
  • 【虹科干货】谈谈Redis Enterprise实时搜索的过人之处
    我们都知道,用户在使用应用程序时候,对于速度有着越来越高的要求,真可谓是“一秒也等不及”。而开发团队又该怎样来满足这种对于实时性的期望呢? 文章速览: RedisEnterprise实时搜索的应用场景利用索引为开发人员带来更好的体验RedisEnterprise实时搜索的优势低延迟搜索的3......
  • docker容器中找不到redis.conf
    一问题从dockerhub拉取了一份镜像,本想建个容器跑起来,取一份配置文件,可创建容器跑起来后,进里面找不到redis.conf文件二解决里面没有,自己从网上下载一份redis.conf,挂载一下吧参考:https://cloud.tencent.com/developer/news/440264 ......
  • docker-安装单机版redis
    一 目的在docker中,安装单机版redis 二步骤1.从镜像中心拉取redis1.1查看镜像中心redis镜像,本例选择redis:7.0 1.2拉取redis镜像dockerpullredis:7.0   2.创建数据卷目录(挂载点在redis配置目录)2.1宿主机创建数据卷目录mkdir-p/docker/redis/2......
  • Redis深度历险 核心原理与应用实践-笔记
     1.2.25种基础数据结构string(字符串)字符串string是Redis最简单的数据结构,其内部表示就是一个字符数组。Redis所有的数据结构都是以唯一的key字符串作为名称,然后通过这唯一的key来获取相应的value数据。不同类型的数据结构差异就在于value的结果不一样。Redis的字符串是动......
  • Django+celery+eventlet+flower+redis异步任务创建及查询实现
    1.环境版本:Django3.2.12celery5.3.4eventlet0.33.3flower2.0.1redis3.5.3项目名称:new_project2.celery配置(settings.py)#celery#django-celery配置的部分#Broker配置,使用Redis作......