个人思考:做了hash是否还需要读写分离

探讨了Redis中读写分离与数据分片的方法及其优缺点,包括hash取余和一致性hash算法的选择,以及这些策略如何帮助提高系统性能。
之前写了一个redis的组件。

出发点:
1.做数据源组件的一个重要的目的是负责回收连接。
2.基于@Bean注解可以做到对jedispool,jedis操作的自动装配,暴露出一个客户端。

所以最终的效果是:
1.提供了两个客户端,一个redis,一个codis。
2.支持基于zookeeper的配置管理,可以在properties中使用占位符,spring只支持在beanDefinitionParse阶段对xml文件替换占位符。所以解决办法就是把properties配置的内容声明为一个beanDefination对象注册到spring容器。
3.支持读写分离,这个用动态代理来实现。

但久而久之,开始考虑第3个功能是否有必要。
读写分离避不开的一个问题就是主从同步延迟,主库负责写,从库负责读。
在数据库上,主库把自己的binlog发送给从库,根据看到的资料,io线程是很快的,但从库把收到binlog重写到自己的数据库,是单线程,确实很慢的。虽然5.6的mysql提供了多线程的写入库。

在redis上,从库首次连接上主库时,主库开始把库中的数据写入日志文本落盘,并缓存这段时间收到的命令,写入完成后将日志发送给从库,然后再发送缓存的命令,这样就保证了主从数据一致,但同步不是实时的。

对于要求高一致性的应用,是否需要这个读写分离?
之前的认知认为从库就是用来分担主库压力,所以主库用来写,从库用来读。
但现在考虑一下,是否分担主库压力只有读写分离这一种办法?从库的主要作用是不是应该是出于数据冗余,容灾的考虑?

考虑不从数据的读写分担压力入手,考虑从数据量的水平拆分入手。
通过hash将数据拆分到多个库,单个库的访问量降低,读写在同一个库也避免的主从同步延迟。

这样达到了提供整体QPS的目的也没有引入新的问题。
目前hash常使用的有两种算法。

1.hash取余
2.一致性hash

hash取余比较简单,但扩容和缩容的时候有点麻烦,会造成之前的存储的所有记录都失效。如果是多个redis做集群的话会导致回源问题,所有的请求都会打到数据库上,这个时候数据库挂不挂就看人品了。

解决办法有两种:

1.每次扩容的机器数都是扩容前机器数的两倍,这样可以保证对hash取余时,几乎全部的数据请求的机器和之前扩容前的机器是同一台。
除了原本hash值在机器数n到2n之前的请求会回源。但一般hash值都不会这么小。

2.像codis这样,加一层,在redis实例之上一次性设置1024个slot,slot到机器的映射由proxy保证。这样即使扩容也只会影响部分slot,其余的slot正常提供服务。

一致性hash,根据其算法,扩容缩容的时候保证只会影响到当前机器的hash值大且差值最小的机器,也


就是原本会打到这个机器上的请求会转移到新加的这个机器上,只会影响到一个节点。虚拟节点也可以做到负载均衡。
比如nginx用了一致性hash。

所以,个人观点,做了hash,并不需要再使用读写分离。

update:
之前的表达存在问题。
根据场景,读多写少适合读写分离。
mysql的读写分离是为了降低写库的压力,问了我们公司DBA关于同步延时:取决于网络,和主库的操作频率,及大事务。
目前生产环境使用了读写分离,但对于有需要读写的应用都连接到了写库上,只有读的应用才代理到了读库上,绕过了读写延时的问题。
分片是最终的办法,解决的读写分离后写库依然承受不了访问压力。
对于Redis,本身在内存上操作,不会涉及IO吞吐,即使读写分离也不会提升太多性能,Redis在生产上的主要问题是考虑容量,单机最多10-20G,key太多降低redis性能,所以需要做集群,重复读写都要打到相同redis实例上,所以需要分片。

<think>好的,用户需要构建一个高级的登录和注册页面,采用前后端分离架构,并涉及接口和数据库设计。我需要分步骤思考如何解答这个问题。 首先,用户可能具备一定的开发基础,但可能对前后端分离的具体实现不太熟悉。需要明确前后端分离的概念,以及如何设计RESTful API接口。同时,数据库设计部分需要考虑到安全性和扩展性。 接下来,应该先从前端开始。用户需要的是一个高级页面,所以可能需要考虑响应式布局、表单验证、第三方登录、验证码等高级功能。需要选择合适的框架,比如React或Vue,并说明关键组件的实现,比如使用axios进行API调用,状态管理如Vuex或Redux。 然后是后端部分。需要选择合适的技术栈,比如Spring Boot或Django,设计API接口,处理用户请求,进行数据验证,与数据库交互。这里需要强调安全性,比如使用HTTPS、JWT令牌、密码哈希存储(如bcrypt),以及防止SQL注入等措施。 数据库设计方面,用户表需要包含基本字段,如用户ID、用户名、邮箱、密码哈希、创建时间等。可能需要添加索引优化查询,考虑分表分库的策略应对未来数据量增长。 接口设计要符合RESTful原则,使用POST方法进行注册和登录,返回合适的HTTP状态码和JSON数据。例如,注册接口返回201 Created,登录成功返回200 OK及JWT令牌。 另外,高级功能部分需要考虑验证码、第三方登录(OAuth2.0)、密码强度检查、登录日志等。这些功能可以提升安全性和用户体验,但实现起来有一定复杂度,需要逐步讲解。 可能用户没有提到的深层需求包括安全性措施、性能优化、错误处理等。需要提醒用户使用环境变量管理敏感信息,如数据库密码和JWT密钥,以及定期备份数据库的重要性。 最后,需要将整个流程结构化,分步骤说明,确保用户能够理解并逐步实施。同时,注意使用正确的中文术语,保持语言简洁明了,避免技术术语混淆。</think>我将分步骤为您讲解如何构建高级登录注册系统的完整技术方案: 一、系统架构设计 $$系统架构图$$ 前端(Client) ↔ 后端(API Server) ↔ 数据库(DB) 使用JWT进行认证,采用HTTPS加密传输 二、前端实现(以React+TypeScript为例) 1. 关键功能: - 响应式布局 - 实时表单验证 - 验证码集成 - 第三方登录(OAuth2.0) - 密码强度检测 2. 核心代码结构: ```typescript // 使用axios进行API调用 const handleRegister = async (data: FormData) => { try { const response = await axios.post('/api/register', { username: data.username, email: data.email, password: sha256(data.password) // 前端哈希处理 }); // 处理JWT存储 } catch (error) { // 统一错误处理 } } ``` 三、后端实现(Spring Boot示例) 1. 安全配置类: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/auth/**").permitAll() .anyRequest().authenticated() .and() .addFilter(new JWTAuthorizationFilter(authenticationManager())); } } ``` 2. 数据库设计(MySQL): ```sql CREATE TABLE users ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, password_hash CHAR(64) NOT NULL, -- 使用bcrypt加密 created_at DATETIME DEFAULT CURRENT_TIMESTAMP, last_login DATETIME, is_active BOOLEAN DEFAULT true, oauth_provider VARCHAR(20), oauth_id VARCHAR(100), INDEX idx_email (email) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 四、关键接口设计 1. 注册接口: ``` POST /api/auth/register Request Body: { "username": "user123", "email": "user@example.com", "password": "哈希后的密码", "captcha": "验证码" } Response: 201 Created { "id": 123, "token": "jwt_token" } ``` 2. 登录接口: ``` POST /api/auth/login Request Body: { "identifier": "user@example.com", // 支持用户名/邮箱登录 "password": "哈希后的密码", "remember_me": true } Response: 200 OK { "token": "jwt_token", "expires_in": 3600 } ``` 五、高级功能实现 1. 安全增强措施: - 使用bcrypt进行密码哈希($cost=12$) - 登录失败锁定策略(5次失败后锁定15分钟) - JWT刷新令牌机制 - 敏感操作日志记录 2. 性能优化方案: - Redis缓存用户会话信息 - 数据库读写分离 - 接口限流(使用Guava RateLimiter) - Nginx负载均衡 六、部署建议 1. 使用Docker容器化部署 2. 配置云数据库(如AWS RDS/AliCloud) 3. 启用Web应用防火墙(WAF) 4. 设置自动备份策略 开发建议流程: 1. 使用Swagger进行API文档管理 2. 编写单元测试(JUnit+Mockito) 3. 使用Postman进行接口测试 4. 实施CI/CD流水线 安全提醒: 1. 永远不要明文存储密码 2. 定期轮换加密密钥 3. 实施CORS白名单策略 4. 使用Helmet增强HTTP头安全 这个方案可根据具体需求扩展第三方登录(微信/Google登录)、生物识别认证、异地登录提醒等高级功能。建议使用Spring Security或Auth0进行认证体系增强。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值