1. 技术发展
技术的分类
- 解决功能性的问题:Java、Jsp、RDBMS、Tomcat、Linux、JDBC、SVN
- 解决扩展性的问题:Struts、Spring、SpringMVC、Hibernate、MyBatis
- 解决性能的问题:NoSQL、Java 多线程、Hadoop、Nginx、MQ、Elasticsearch
1.1 Web 1.0 时代
Web 1.0 的时代,数据访问量很有限,用一夫当关的高性能单点服务器可以解决大部分问题。

技术的分类
Web 1.0 的时代,数据访问量很有限,用一夫当关的高性能单点服务器可以解决大部分问题。
Redis 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis 事务的主要作用就是 串联多个命令 防止别的命令插队。
从输入 Multi 命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入 Exec 后,Redis 会将之前的命令队列中的命令依次执行。
组队的过程中可以通过 Discard 来放弃组队。
基础实现:
/**
* 模仿秒杀
*/
public class ImitateSecKillRedisUtil {
// 秒杀过程
public static String doSecKill(String uid, String prodid) throws IOException {
// 1 uid 和 prodid 非空判断
if (uid == null || prodid == null) {
return "uid 和 prodid 不能为空!";
}
// 2 连接redis
Jedis jedis = new Jedis("ip地址", 6379);
jedis.auth("*****");
// 3 拼接key
// 3.1 库存key
String kcKey = "sk:" + prodid + ":qt";
// 3.2 秒杀成功用户key
String userKey = "sk:" + prodid + ":user";
// 4 获取库存,如果库存为null,秒杀还没有开始
String kc = jedis.get(kcKey);
if (kc == null && "".equals(kc.trim())) {
System.out.println("秒杀还没有开始,请等待!");
jedis.close();
return "秒杀还没有开始,请等待!";
}
// 5 判断用户是否重复秒杀操作
if (jedis.sismember(userKey, uid)) {
System.out.println("已经秒杀成功了,不能重复秒杀!");
jedis.close();
return "已经秒杀成功了,不能重复秒杀!";
}
// 6 判断如果商品库存数量小于1,秒杀结束
if (Integer.parseInt(kc) <= 0) {
System.out.println("秒杀已经结束了!");
jedis.close();
return "秒杀已经结束了!";
}
// 7 秒杀过程
// 库存-1
jedis.decr(kcKey);
// 把秒杀成功用户添加清单里面
jedis.sadd(userKey, uid);
System.out.println("秒杀成功了...");
jedis.close();
return "秒杀成功了...";
}
}
以日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有写指令记录下来(读操作不会记录),只许追加文件但不可以改写文件,Redis 启动之初会读取该文件重新构建数据,换言之,Redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
主机数据更新后根据配置和策略,自动同步到备机的 master/slave 机制, Master 以写为主,Slave 以读为主
之前通过代理主机来解决,但是 中提供了解决方案,就是无中心化集群配置
key 对应的数据在数据源并不存在,每次针对此 key 的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户 id 获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
Redis ACL 是 Access Control List(访问控制列表)的缩写,该功能允许根据可以执行的命令和可以访问的键来限制某些连接。
在 Redis 5 版本之前,Redis 安全规则只有密码控制,还有通过 rename 来调整高危命令比如 flushdb,keys *,shutdown 等。Redis 6 则提供 ACL 的功能对用户进行更细粒度的权限控制:
(1)接入权限:用户名和密码
(2)可以执行的命令
(3)可以操作的 key