KANG's BLOG

Let's have some fun

Mybatis是如何做到防止sql注入

Mybatis是如何做到防止sql注入 Mybatis的预编译功能 MyBatis框架作为一款半自动化的持久层框架,其SQL语句都要我们自己手动编写,这个时候当然需要防止SQL注入。其实,MyBatis的SQL是一个具有“输入+输出”的功能,类似于函数的结构,参考上面的两个例子。其中,parameterType表示了输入的参数类型,resultType表示了输出的参数类型。回应上文,如果我们想防止SQL注入,理所当然地要在输入参数上下功夫。上面代码中使用#的即输入参数在SQL中拼接的部分,传入参数后,打印出执行的SQL语句,会看到SQL是这样的: select id, username, password, role from user where username=?

一致性hash算法(hash环)

一致性hash算法(hash环) 概念 一致性哈希算法是对2^32取模 如果解决hash环的偏移 实际使用时,请求可能分布机器不均匀,多个请求顺序匹配同一台机器,这个情况就是hash环的偏移。 使用虚拟节点,使机器的分布更加均匀,避免请求都打到同一个机器上的问题。 与哈希槽的区别 哈希槽并不是闭合的,key的定位规则是根据CRC-16(key) % 16384的值来判断属于哪个槽区,从而判断该key属于哪个节点,而一致性哈希是根据hash(key)的值来顺时针找第一个hash(ip)的节点,从而确定key存储在哪个节点。 一致性哈希是创建虚拟节点来实现节点宕机后的数据转移并保证数据的安全性和集群的可用性的。redis cluster是采用master节点有多个slave节点机制来保证数据的完整性的,master节点写入数据,slave节点同步数据。当master节点挂机后,slave节点会通过选举机制选举出一个节点变成master节点,实现高可用。但是这里有一点需要考虑,如果master节点存在热点缓存,某一个时刻某个key的访问急剧增高,这时该mater节点可能操劳过度而死,随后从节点选举为主节点后,同样宕机,一次类推,造成缓存雪崩。

堆排序

堆排序 1. 堆的定义 堆是二叉树的一种,其分为大顶堆和小顶堆 大顶堆: ​ 每个节点的值都大于其左右子节点 小顶堆: ​ 每个节点的值都小于其左右子节点

单链表反转

public ListNode reverseList (ListNode head) { ListNode first = null; ListNode current = head; ListNode next = null; while (current !

红黑树

概念 是一种自平衡二叉查找树。 添加节点的过程中,通过变色和旋转完成节点的完美平衡。 规则 节点是红色或者黑色 根节点是黑色 每个叶子的节点都是黑色的空节点(NULL) 每个红色节点的两个子节点都是黑色的。 从任意节点到其每个叶子的所有路径都包含相同的黑色节点

AMQP协议

概念 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息的网络协议。 AMQP模型 工作过程 发布者(Publisher)发布消息(Message),经由交换机(Exchange)。 交换机根据路由规则将收到的消息分发给与该交换机绑定的队列(Queue)。 最后 AMQP 代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。

Redis持久化方式区别(RDB & AOF)

持久化方式RDB和AOF的区别 RDB每次进行快照方式会重新记录整个数据集的所有信息。 RDB在恢复数据时更快,可以最大化redis性能,子进程对父进程无任何性能影响。 AOF有序的记录了redis的命令操作。 Redis默认使用everysec,每秒。 随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。

接口限流算法实现

计数器法 计数器法是限流算法里最简单也是最容易实现的一种算法。比如我们规定,对于A接口来说,我们1分钟的访问次数不能超过100个。那么我们可以这么做:在一开始的时候,我们可以设置一个计数器counter,每当一个请求过来的时候,counter就加1,如果counter的值大于100并且该请求与第一个请求的间隔时间还在1分钟之内,那么说明请求数过多;如果该请求与第一个请求的间隔时间大于1分钟,且counter的值还在限流范围内,那么就重置counter。 public class CounterDemo { public long timeStamp = getNowTime(); public int reqCount = 0; public final int limit = 100; // 时间窗口内最大请求数 public final long interval = 1000; // 时间窗口ms public boolean grant() { long now = getNowTime(); if (now < timeStamp + interval) { // 在时间窗口内 reqCount++; // 判断当前时间窗口内是否超过最大请求控制数 return reqCount <= limit; } else { timeStamp = now; // 超时后重置 reqCount = 1; return true; } } } 计数器法有一个十分致命的问题,那就是临界问题。

彩虹表

彩虹表-如何暴力破解Md5 由于哈希算法的不可逆性,破解密码只能采取匹配加密结果的暴力破解方式,但是时间成本较高,如果构建一个明文和密码的键值对数据库,随着原始字符串的长度增加,密码库的大小将指数级增加,非人类资源可满足。 彩虹表算法是通过字典法的基础上进行改进,在时间和空间取得平衡点的一种算法。 彩虹表的前身–预先计算的散列链 何为预先计算的散列链 既然存储所有的明文密码对需要的空间太大,密码学家们想出了一种以计算时间降低存储空间的办法:“预计算的哈希链集”(Precomputed hash chains)。 这是一条k=2哈希链: H函数就是要破解的哈希函数。 R函数(约简函数reduction function是构建这条链的时候定义的一个函数:它的值域和定义域与H函数相反。通过该函数可以将哈希值约简为一个与原文相同格式的值。 这条链是这样生成的:

lua脚本实现令牌桶

通过lua脚本实现原子操作 令牌桶实现 local ratelimit_info=redis.pcall("HMGET",KEYS[1],"last_mill_second","curr_permits","max_burst","rate","app") local last_mill_second=ratelimit_info[1] local curr_permits=tonumber(ratelimit_info[2]) local max_burst=tonumber(ratelimit_info[3]) local rate=tonumber(ratelimit_info[4]) local app=tostring(ratelimit_info[5]) if app == nil then return 0 end local local_curr_permits=max_burst; if(type(last_mill_second) ~='boolean' and last_mill_second ~=nil) then local reverse_permits=math.