redis[2] redis 配置及分布式锁介绍
SpringDataRedis配置RedisTemplate介绍
- RedisTemplate介绍
- ValueOperations:简单K-V操作
- SetOperations:set类型数据操作
- ZSetOperations:zset类型数据操作
- HashOperations:针对map类型的数据操作
- ListOperations:list类型的数据操作
- RedisTemplate和StringRedisTemplate的区别
- StringRedisTemplate继承RedisTemplate
- 两者的数据是不共通的(默认的序列化机制导致key不一样)
- StringRedisTemplate默认采用的是String的序列化策略
- RedisTemplate默认采用的是JDK的序列化策略,会将数据先序列化成字节数组然后在存入Redis数据库
- 总结
- 当redis数据库里面本来操作的是字符串数据的时候,那使用StringRedisTemplate即可
- 数据是复杂的对象类型,那么使用RedisTemplate是更好的选择
- 操作
- String结构
- 存储字符串
- 存储对象
- String结构
案例实战之注册登录-图形验证码+谷歌开源Kaptcha引入
- 背景
- 注册-登录-修改密码一般需要发送验证码,但是容易被攻击恶意调用
- 什么是短信-邮箱轰炸机
- 手机短信轰炸机是批、循环给手机无限发送各种网站的注册验 证码短信的方法。
- 公司带来的损失
- 短信一条5分钱,如果被大盗刷大家自己计算 邮箱通知不用钱,但被大盗刷,带宽、连接等都被占 用,导致无法正常使用
- 如何避免自己的网站成为”肉鸡“或者被刷呢
- 增加图形验证码(开发人员)
- 单IP请求次数限制(开发人员)
- 限制号码发送(一般短信提供商会做)
- 攻防永远是有的,只过加大了攻击者的成本,ROI划不 过来自然就放弃了
- Kaptcha 框架介绍
- 谷歌开源的一个可高度配置的实用验证 码生成工具
- 验证码的字体/大小/颜色
- 验证码内容的范围(数字,字母,中文汉字!)
- 验证码图片的大小,边框,边框粗细,边框颜色
- 验证码的干扰线 验证码的样式(⻥眼样式、3D、普通模糊)
- 谷歌开源的一个可高度配置的实用验证 码生成工具
高并发商品首页热点数据开发实战
- 热点数据
- 经常会被查询,但是不经常被修改或者删除的数据
- 首页-详情页
- 链路逻辑
- 检查缓存是否有
- 缓存不存在则查询数据库
- 查询结果放到缓存,设置过期时间
- 下次访问则命中缓存
- 接口开发
- 模拟数据库查询耗时200ms
- 未加缓存逻辑:controller-service-dao层
- 加缓存逻辑:controller-service-dao层
- 注意点
- 缓存击穿
- 缓存穿透
- 缓存雪崩
- 缓存和数据库数据一致性
Jmeter5.x压力测试工具
-
LoadRunner
- 性能稳定,压测结果及细粒度大,可以自定义脚本进行压测,但是太过于重大,功能比较繁多
-
Apache AB(单接口压测最方便)
- 模拟多线程并发请求,ab命令对发出负载的计算机要求很低,既不会占用很多CPU,也不会占用太多的内存,但却会给目标服务器造成巨大的负载, 简单DDOS攻击等
-
Webbench
- webbench首先fork出多个子进程,每个子进程都循环做web访问测试。子进程把访问的结果通过pipe告诉父进程,父进程做最终的统计结果。
-
Jmeter
- 开源免费,功能强大,在互联网公司普遍使用
-
压测工具本地快速安装Jmeter5.x
- 需要安装JDK8 以上
- 建议安装JDK环境,虽然JRE也可以,但是压测https需要JDK里面的 keytool工具
- 快速下载 https://jmeter.apache.org/download_jmeter.cgi
- 文档地址:http://jmeter.apache.org/usermanual/get-started.html
-
热点数据接口压测
- QPS: (Query Per Second): 每秒请求数,就是说服务器在一秒的时间内处理了多少个请求
-
新增聚合报告:线程组->添加->监听器->聚合报告(Aggregate Report)
lable: sampler的名称
Samples: 一共发出去多少请求,例如10个用户,循环10次,则是 100
Average: 平均响应时间
Median: 中位数,也就是 50% 用户的响应时间
90% Line : 90% 用户的响应不会超过该时间 (90% of the samples took no more than this time. The remaining samples at least as long as this)
95% Line : 95% 用户的响应不会超过该时间
99% Line : 99% 用户的响应不会超过该时间
min : 最小响应时间
max : 最大响应时间
Error%:错误的请求的数量/请求的总数
Throughput: 吞吐量——默认情况下表示每秒完成的请求数(Request per Second) 可类比为qps、tps
KB/Sec: 每秒接收数据量
- 基于当前机器配置压测
- 未用缓存接口
- 用缓存接口
- 当前架构存在的问题
-
分布式缓存和应用服务器网络需要内网通信
-
可以自己本地部署Redis进行测试
-
分布式锁核心知识介绍和注意事项
-
背景
-
就是保证同一时间只有一个客户端可以对共享资源进行操作
-
案例:优惠券领劵限制张数、商品库存超卖
-
核心
- 为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度
- 利用互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题
-
-
避免共享资源并发操作导致数据问题
- 加锁
- 本地锁:synchronize、lock等,锁在当前进程内,集群部署下依旧存在问题
- 分布式锁:redis、zookeeper等实现,虽然还是锁,但是多个进程共用的锁标记,可以用Redis、Zookeeper、Mysql等都可以
- 加锁
-
设计分布式锁应该考虑的东西
-
排他性
- 在分布式应用集群中,同一个方法在同一时间只能被一台机器上的一个线程执行
-
容错性
- 分布式锁一定能得到释放,比如客户端奔溃或者网络中断
-
满足可重入、高性能、高可用
-
注意分布式锁的开销、锁粒度
-