Python实现淘宝和京东简单秒杀清空购物车
Python实现淘宝和京东简单秒杀清空购物车 思路: 利用selenium 的方法来模拟点击页面 到某一特定时间就清空购物车并提交订单 Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器 selenium 的安装与使用文档可以参照以下博客:点我查看 淘宝清空购物车实现import datetimeimport timefrom selenium import webdriver# 打开浏览器browser = webdriver.Chrome()def login(): # 打开淘宝 browser.get("https://www.taobao.com/") time.sleep(3) # 没登录就登录 if browser.find_element_by_link_text("亲,请登录"): browser.find_element_by_link_text("亲, ...
测试标签外挂
你是刷 Visa 還是 UnionPay 2021年快到了…. 小心開車 安全至上 這是三片呢?還是四片? 你是刷 Visa 還是 UnionPay 剪刀石頭布 前端最討厭的瀏覽器 蓝色
Day14-SpringBoot整合Redis做缓存
SpringBoot整合Redis案例导入依赖<!--集成redis--> <!-- 整合Redis依赖 --> <!--集成redis--> <!--整合Redis , 底层可以用jedis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</arti ...
Day13-SpringBoot整合Shiro及Mybatisplus实现权限控制
SpringBoot整合Shiro流程导入Shiro,Mybatisplus依赖<!--Shiro --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.5.0</version> </dependency><!--mp--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version> ...
Redis-Day12-Redis应用问题及分布式锁
缓存击穿 key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库 一个一定不存在缓存及查询不到的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义 解决方案 (1) 对空值缓存:如果一个查询返回的数据为空(不管是数据是否不存在),我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过五分钟 (2) 设置可访问的名单(白名单): 使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap里面的id进行比较,如果访问id不在bitmaps里面,进行拦截,不允许访问。 (3) 采用布隆过滤器:(布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)。 布隆过 ...
Redis-Day11-Redis搭建集群
Redis集群集群介绍 容量不够,redis如何进行扩容?并发写操作, redis如何分摊?另外,主从模式,薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。之前通过代理主机来解决,但是redis3.0中提供了解决方案。就是无中心化集群配置。 Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。 Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。 制作组成集群分支include ./redis.confport 5555 pidfile "/var/run/redis_5555.pid"dbfilename "dump5555.rdb"# kaiqi jiqun moshicluster-enabled yes # 开启集群cluster-config-file nodes-5555.c ...
Redis-Day10-Redis主从复制
Redis 主从复制 主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 读写分离,性能扩展 容灾快速恢复 新建主机 从机新建redis6379.conf,填写以下内容 include /myredis/redis.confpidfile /var/run/redis_6379.pidport 6379dbfilename dump6379.rdb 设置从机的优先级,值越小,优先级越高,用于选举主机时使用。默认100 查看主从关系 info replication 打印主从复制的相关信息 配置主库的从库 slaveof 成为某个实例的从服务器 在6380和6381上执行: slaveof 127.0.0.1 6379 在主机上写,在从机上可以读取数据 在从机上写数据报错 主机挂掉,重启就行,一切如初 从机重启需重设:slaveof 127.0.0.1 6379 可以增加到配置文件中。永久生效 分层管理 上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 s ...
Redis-Day9-Redis持久化RDB与AOF
Redis 提供了2个不同形式的持久化方式。 RDB(Redis DataBase) AOF(Append Of File) RDB (Redis DataBase) 在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里 如何执行备份? Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中, 待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO操作的, 这就确保了极高的性能 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感, 那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。 Fork Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Lin ...
Redis-Day8-Redis秒杀案例分析
Redis秒杀案例分析 Redis数据库中记录商品库存和秒杀成功人员名单 prodid: 商品号 高并发下超卖问题 如果不加锁的情况下 多个用户在同一时间拿到的库存量是一样的 然后他们都去减少这个库存 最终导致库存数超卖 为负值 利用Redis默认的乐观锁淘汰用户解决超卖问题 //增加乐观锁jedis.watch(qtkey); //3.判断库存String qtkeystr = jedis.get(qtkey);if(qtkeystr==null || "".equals(qtkeystr.trim())) {System.out.println("未初始化库存");jedis.close();return false ;} int qt = Integer.parseInt(qtkeystr);if(qt<=0) {System.err.println("已经秒光");jedis.close();return false;} //增加事务Transac ...
Redis-Day7-事务及乐观锁悲观锁
Redis事务 Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 Redis事务的主要作用就是串联多个命令防止别的命令插队。 Multi Exec discard 从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行。 组队的过程中可以通过discard来放弃组队。 组队期间遇到错误 –> 某个命令出现了报告错误,执行时整个的所有队列都会被取消。 执行阶段某个命令报出了错误-> 只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。 事务冲突 乐观锁 悲观锁 悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 乐观锁(Optimisti ...
Redis-Day6-测试Jedis的方法
Redis-Day6-测试Jedis的方法<!-- redis 依赖 --><dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.2.0</version></dependency> package top.flya.blog;import org.junit.jupiter.api.Test;import org.springframework.boot.test.context.SpringBootTest;import redis.clients.jedis.Jedis;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Set;import static redis.clients.jedis.ListPosit ...
Redis-Day5-HyperLogLog访客粗略统计与Geospatial
HyperLogLog 在工作当中,我们经常会遇到与统计相关的功能需求,比如统计网站PV(PageView页面访问量),可以使用Redis的incr、incrby轻松实现。 但像UV(UniqueVisitor,独立访客)、独立IP数、搜索记录数等需要去重和计数的问题如何解决?这种求集合中不重复元素个数的问题称为基数问题。 解决基数问题有很多种方案: (1)数据存储在MySQL表中,使用distinct count计算不重复个数 (2)使用Redis提供的hash、set、bitmaps等数据结构来处理 以上的方案结果精确,但随着数据不断增加,导致占用空间越来越大,对于非常大的数据集是不切实际的。 能否能够降低一定的精度来平衡存储空间?Redis推出了HyperLogLog Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。 在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基 ...
Redis-Day4-BitMaps数据类型
Bitmaps 现代计算机用二进制(位) 作为信息的基础单位, 1个字节等于8位, 例如“abc”字符串是由3个字节组成, 但实际在计算机存储时将其用二进制表示, “abc”分别对应的ASCII码分别是97、 98、 99, 对应的二进制分别是01100001、 01100010和01100011,如下图 合理地使用操作位能够有效地提高内存使用率和开发效率。 Redis提供了Bitmaps这个“数据类型”可以实现对位的操作: (1) Bitmaps本身不是一种数据类型, 实际上它就是字符串(key-value) , 但是它可以对字符串的位进行操作。 (2) Bitmaps单独提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量 key为 abc value 为ascll码对应的8位二进制 按abc 顺序拼接的01组合 命令 setbit设置Bitmaps中某个偏移量的值(0或1) 实例 每个独立用户是 ...
Redis-Day3-Redis.conf配置与发布订阅
Redis.conf配置Units单位 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit 大小写不敏感 INCLUDES 类似jsp中的include,多实例的情况可以把公用的配置文件提取出来 网络相关配置bind 与 protected-mode 默认情况bind=127.0.0.1只能接受本机的访问请求 不写的情况下,无限制接受任何ip地址的访问 生产环境肯定要写你应用服务器的地址;服务器是需要远程访问的,所以需要将其注释掉 如果开启了protected-mode,那么在没有设定bind ip且没有设密码的情况下,Redis只允许接受本机的响应 保存配置,停止服务,重启启动查看进程,不再是本机访问了 port 端口号,默认 6379 tcp-backlog 设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。 在高并发环境下你需要一个高backlog值来避免慢客户端连接问题。 注意Linux内核会将这个值减小到/proc/sys/net/core/soma ...
Redis-Day2-set集合与hash表与有序集合Zset
set集合概述 edis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。 Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是**O(1)**。 一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变 s 开头 + 英文单词 + key value sadd ….. 将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略 smembers 取出该集合的所有值。 sismember 判断集合是否为含有该值,有1,没有0 scard返回该集合的元素个数 srem …. 删除集合中的某个元素。 spop 随机从该集合中吐出一个值。吐完整个set**集合将不存在** srandmember 随机从该集合中取出n个值。不会从集 ...
Redis-Day1-环境搭建及string,list基础指令
环境搭建及string,list基础指令 基本数据类型之String 的操作 set 添加键值对 *NX:当数据库中key不存在时,可以将key-value添加数据库 *XX:当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥 *EX:key的超时秒数 *PX:key的超时毫秒数,与EX互斥 **get ** 查询对应键值 **append **将给定的 追加到原值的末尾 strlen 获得值的长度 setnx 只有在 key 不存在时 设置 key 的值 (no exist) incr 将 key 中储存的数字值增1 只能对数字值操作,如果为空,新增值为1 decr 将 key 中储存的数字值减1 只能对数字值操作,如果为空,新增值为-1 incrby / decrby <步长>将 key 中储存的数字值增减。自定义步长。 getrange <起始位置><结束位置>获得值的范围,类似java中的substring,前包,后包setrange <起始位置> ...




















