写给自己的话,博客应该是记录你一些心得,属于你自己的东西,而不是当笔记本,如同百度云盘保存那么多不看的资料,只要是你自己的哪怕简单一点,有你自己的思想,那么就是一个很好的起步。致浮华。
形成自己的一套对于新技术的想法,怎么去熟悉新技术,为未来提供知识储备。
目前业务需求引出业务需求,来当做自己学习新技术的一个方法。
A.技术基本是springboot+mybatis+mysql来当做后端的模板。数据储存在mysql中,每一次增删改查都需要调用连接数据库进行查询,查询有对应消耗,单个数据每秒最多查询不超过2000次。
场景是需要你进行某一个用户消费记录的显示,用户有多个并且需要显示用户名字。很简单的sql就可以实现了查询用户消费表,然后用户id关联出用户表,通过子查询带出对应用户名字就可以实现。一个sql就可以解决问题。组长要求sql里面要干净,不要带子查询逻辑,sql就是一个单表的增删改查,那么怎么处理?先写一个查询所有的用户消费记录,然后获取对应消费记录中id,分别去查询对应用户id。重复太多,如何去处理?最好哪里可以有缓存一下,本地使用缓存,创建一个map,里面存放所有id对应名字,然后对应id放到map中取出对应的名字来实现用户姓名的显示。效率分析,数据库操作是只有二次,但是问题来了,对应压力到了服务器,而且所有名字,其中大部分可能是不需要的,随着数据库用户变多,你获取所有然后保存到map中,之后再遍历的是绝对不行的。进一步,引入redis。依然是查询所有的用户消费记录表的信息,然后对应用户id先查询redis中是否存在,如果不存在,查询一次数据库,并且对应用户id跟用户名称放到redis缓存,设置过期时间。redis基于内存,查询数据快于mysql数据库查询。那么原先将调用数据库1+N次,优化到调用数据库1+ Z (Z<=N)+ 调用redis (N-Z)次 ,对应最差就是每次都调用数据库,但是如果redis缓存可以命中一些用户数据,那么就是提高了效率,而且redis比mysql抗揍,redis基于内存,4w qps 也能抗下来,比mysql的2000 qps 要抗揍很多。所以本次技术引入使用是成功的。
B.初识redis,那么怎么去学习redis。其实redis本身你也可以当成第三方来调用,只是这个第三方反馈很及时。
这里省略redis的安装以及对应客户端安装。默认是有16个db (0-15),如果不设置默认是0.需要提醒到的是,不同db的数据不同步的,出现过客户端跟管理端使用的是不同的redis的db,其中客户端是1,管理端是2。然后客户端存在用户登录失败,就会记录到失败次数在对应db1,当用户手机号对应失败次数到达5,就会直接返回用户被禁止登录,请等待解封之后处理。当然如果用户失败4次,然后第5次成功了,就清空对应用户失败次数。同理在管理端,也实现用户的登录重置,一开始只是简单跟客户端一样,查询是否有对应key,如果存在就清空。结果问题出现对应redis数据库不一样,所以后面调整到对应共用一个数据库,(网上查询了一下,可以切换对应数据库开支不大但是没找到在线切换数据库的方法,所以就采取了共用一个数据库的方法。不过客户端跟管理端的缓存都放在了一起,这里对应用户key添加user跟manage拼接到key作为区分)。另外redis最显著二个特点是高可用,高并发。其中高并发只是通过网上了解对应redis基于内存,可以承受4wqps的访问量,远比mysql的2000qps要来的高很多,而且redis访问速度比mysql快。但是redis无法代替mysql,因为redis是作为缓存的,它并不能代替数据库,redis的数据总会有清空的。
C.redis的数据类型理解
String的get key value跟set key value属于单个操作,群操为前面加上M 也就是Mset跟Mget,删除为 del key,数字递增 incr key 指定整数增加 incrby key increment。数字递减decr key 指定整数减少 decrby key decrement。尾部追加值 append key value。场景对应,简单的key-value应用在用户登录验证部分,用户每次登录都会携带对应token,如果用户进行操作都要进行权限token验证,那么每次查询都需要访问数据库,交互就很频繁,所以token放到redis中保存。另外,原先是一些功能访问有对应次数,为了防止被频繁爬虫,就设置了对应使用次数的校验,每次使用功能一次就自增一次,并且设置过期时间,比如在10s内该账号访问次数达到20次,就进行禁止登录,token清空处理,以此来实现对账号的把控,更进一步则是记载对应访问的ip地址,在对应云服务器上进行设置黑名单。对应解封,微信联系客服进行解封。