Redis开发常用规范
- 格式:docx
- 大小:20.65 KB
- 文档页数:5
开发方案样板概述本文档为开发团队制定的开发方案样板,主要包括需求分析、技术选型、开发流程、测试方案和上线部署等内容,旨在为团队成员提供开发流程和配套工具的规范和说明,确保项目开发的顺利进行。
需求分析目标用户针对本项目,我们的目标用户主要有以下几类:1.普通用户:使用产品进行浏览、交互等操作;2.管理员:发布、维护、管理产品内容的操作人员;3.开发人员:参与项目开发者,需要按照需求进行相应的开发工作;4.技术支持人员:维护系统运行、解决用户问题等工作。
功能需求基于以上用户群体,我们需要实现以下功能:1.用户注册、登录、找回密码等基本功能;2.产品分类、产品列表、产品搜索、产品详情展示等功能;3.用户留言、反馈、收藏等互动功能;4.管理员发布产品、管理产品、审核评论等功能;5.系统报错、异常处理等功能。
数据分析基于用户行为和使用情况,我们需要对用户行为数据进行统计和分析,提供如下数据分析功能:1.用户数据分析:统计用户地域分布、活跃度、留存率等;2.产品数据分析:统计产品浏览量、收藏量、留言数量等;3.运营数据分析:对广告投放、营销推广等进行统计分析。
技术选型本项目采用如下技术选型:1.前端框架:Vue.js;2.后端框架:Spring Boot;3.数据库:MySQL;4.缓存:Redis;5.数据分析:Elasticsearch。
Git Flow项目采用 Git Flow 工作流程,主要分为以下分支:•master:主分支,正式线上版本;•dev:开发分支,集成所有功能并进行测试;•feature:功能分支,根据需求拆分出来的模块;•release:预发布分支,即将发布的版本,在这个分支上进行冻结和波动。
统一代码规范团队内部规定了统一的代码规范,主要包括代码格式、注释规范、命名规范等,所有代码需严格按照规范来写。
敏捷开发采用敏捷开发方式,每个迭代周期为2周,每个周期内包含需求评审、开发、单元测试、集成测试和交付等操作。
后端开发岗位职责要求 后端开发是软件开发中的一项重要岗位,主要负责处理服务器端的逻辑和数据处理。下面将详细介绍后端开发岗位的职责要求。
1. 服务器端逻辑开发:后端开发人员负责设计和开发服务器端的逻辑,实现网站或应用的核心功能。他们需要熟悉并掌握各种后端开发语言和框架,如Java、Python、PHP等,并能够根据项目需求选择合适的技术栈进行开发。
2. 数据库设计与管理:后端开发人员需要掌握数据库的设计和管理,包括数据表的设计、索引的创建和优化、数据的导入和导出等。他们需要熟悉常用的关系型数据库如MySQL、Oracle,以及非关系型数据库如MongoDB、Redis等,能够根据项目需求合理选择和使用数据库。
3. 接口开发与集成:后端开发人员需要与前端开发人员紧密合作,设计和开发各种接口,实现前后端的数据交互。他们需要熟悉RESTful架构和API设计原则,能够设计出安全、高效、易用的接口,并能够与其他系统进行集成,如第三方登录、支付接口等。
4. 性能优化与调优:后端开发人员需要对服务器端的性能进行优化和调优,确保系统能够稳定高效地运行。他们需要通过对系统进行监控和分析,识别性能瓶颈,优化数据库查询、网络请求等,提高系统的响应速度和并发能力。 5. 安全与权限控制:后端开发人员需要对系统进行安全性设计和权限控制,确保用户数据的安全和系统的稳定。他们需要熟悉常见的安全漏洞和攻击方式,设计和实现合适的安全机制,如用户认证、数据加密、访问控制等,保护系统的安全。
6. 代码质量与测试:后端开发人员需要编写高质量的代码,并进行测试和调试。他们需要遵循良好的编码规范和代码管理流程,保证代码的可读性和可维护性。他们需要进行单元测试、集成测试和性能测试,确保代码的质量和系统的稳定性。
7. 团队合作与沟通:后端开发人员需要与项目经理、产品经理、设计师等各个团队成员紧密合作,理解并满足项目需求。他们需要具备良好的沟通能力和团队合作精神,能够与他人协作解决问题,保证项目的顺利进行。
技术规范书范本技术规范书范本一、XX系统设计规范一、需求分析1、概述:xx系统是一款B2B平台,其主要功能在于为不同行业的企业提供服务,包括采购、销售、供应链管理、支付等方面。
本次需求分析旨在从用户角度出发,完整地描述xx系统所需的功能和性能要求,为系统后续的设计、开发和测试提供指导。
2、用户场景:xx系统的主要用户群体包括企业、供应商、采购商,其所处的行业非常广泛,包括但不限于服装、数码产品、建材、化妆品、食品等领域。
这些用户的需求各有所不同,但由于平台的设计目标,他们使用系统时有一些共性:例如,需要便捷地找到所需的商品,进行预算和交易,及时了解物流信息等。
3、需求分析:综上所述,xx系统的需求分析应围绕以下几个方面展开:(1)登录和注册:用户需要有账号才能使用平台,账号的注册和登录应该是便捷、安全可靠的。
(2)商品浏览和搜索:用户可通过平台浏览各类商品,还可以进行关键词搜索。
应该提供多种筛选条件,帮助用户快速找到想要的商品。
(3)商家报价:卖家可以在平台上发布商品的报价,买家可以选择报价最优的商家。
平台应该提供一个便捷的系统,方便商家报价并对报价进行审核。
(4)供应链管理:平台应该能够管理物流、支付和订单等方面的信息。
物品的配送等流程应该尽可能自动化,以提高效率。
(5)数据分析:平台应该能够提供数据分析功能,帮助用户评估自己业务的情况和趋势,为业务决策提供参考。
(6)安全性和稳定性:平台应该具有较高的可靠性和稳定性,并能保证用户数据安全。
二、系统架构设计1、总体架构:xx系统采用B/S架构,使用Java编程语言,基于Spring框架和Maven构建。
在前端方面使用了AngularJS等开源框架,以提高用户体验,并提供了丰富的API接口,方便集成第三方服务。
2、模块划分:系统可以分成以下几个模块:(1)用户模块:主要负责用户的注册、登录以及个人信息管理等。
(2)商品模块:主要负责商品的展示、发布和检索等功能。
Java初级开发工程师的岗位要求汇总岗位要求1:1、本科及以上学历,计算机科学与技术类、软件技术及其应用、软件工程专业相关专业。
2、有Java开发相关经验,扎实的Java编程基础,熟练掌握Java 编程语言,熟练掌握Linux操作系统,并能熟练掌握Git等工具;3、熟悉Spring、SpringBoot、Spring MVC、MyBatis等开源框架,掌握MVC框架模式及BS架构;4、熟悉MySQL等数据库开发,熟悉SQL语句编写和调试;5、有较强的责任心,能有效跟团队成员沟通;6、热爱软件开发行业,热爱学习新知识,有快速掌握新技能能力。
岗位要求2:1. 计算机或相关本科以上学历,具有1年及以上JAVA方面开发经验;2. 熟悉Spring, Spring Boot, SpringCloud,Dubbo,MyBatis等开源框架和其理念3. 熟悉Linux下的常用命令,熟悉Mysql,[Mongo,ES]4. 熟悉Redis、MQ等中间件;5. 有丰富的Java Web项目开发经验,有大型项目开发经验者优先;6. 具备良好的表达和沟通能力、具备团队合作精神,对工作热情,有一定的抗压能力,有责任心和独立分析能力。
岗位要求3:1、计算机及相关专业,专科及以上;2、熟悉软件工程、数据结构及Web开发等专业知识;3、1年以上实际java开发经验,熟练掌握J2EE开发;4、熟练掌握ORACLE、MySql等常用数据库,熟悉HTTP协议;5、熟悉spring-mvc、struts2等MVC开源框架;6、熟悉spring-jdbc、mybatis等持久化架构,了解数据库规范,熟悉sql脚本语言;7、沟通良好,能承受一定的工作压力岗位要求4:1、计算机相关专业,全日制本科及以上学历;2、扎实的JAVA编程基础,熟悉各种设计模式;3、熟练掌握主流框架spring boot或者spring cloud;4、具备良较强的沟通和学习能力,有团队和敬业精神。
java工程师的工作职责(必备5篇)1.java工程师的工作职责第1篇职责1、维护和升级现有产品,快速修复Bug和缺陷。
新产品新特性高质量的开发;2、根据开发规范与流程独立完成编码、测试及相关文档;3、负责模块的任务开发,并按照设计和进度要求编码和单元测试;4、完成项目经理交付的开发工作,完成团队中相互code review的工作,并能够给出自己的意见和建议;5、管理方向:协助项目经理参与部分项目管理工作,比如计划的制定、跟进、协调、组织等。
任职要求:1、大学本科以上学历,计算机相关专业,学历真实可查,至少四年以上JAVA开发经验;2、熟悉Linux操作系统及常用命令;3、熟悉linux下使用Tomcat应用服务器的配置、部署;4、熟悉至少一种(Mysql、Oracle、SQL Server等)主流关系型数据库开发,熟练掌握SQL语句的编写;5、熟悉Java EE技术,对各种开源的软件如Spring、Struts、hibernate/mybatis等有深入的了解;6、懂得单元测试的相关知识,懂得各种单元测试覆盖率的含义及应用优先;7、具有良好的学习能力、沟通理解能力,乐于承担工作压力,富有团队精神2.java工程师的工作职责第2篇职责:负责产品架构设计和关键模块研发工作,及系统稳定性、性能优化等相关工作;根据项目具体要求,带领项目组,按计划完成任务目标,解决开发过程中的技术问题;负责新技术的研究及可行性分析;任职要求:统招二类本科及以上学历,至少3个实际中型项目开发1年以上工作经验;精通Java编写,Java web开发常用开源框架Spring、SpringMVC、Mybatis等;熟练、JQuery、H5、CSS3等前端技术;熟悉前后端分离,对代码设计有研究,常见设计模式应用业务代码;熟悉Oracle、MySQL、MSSQL等关系型数据库的安装部署、开发、调优、排障、备份还原等;熟练Nginx、Tomcat、Redis等主流应用的原理和配置开发负载均衡;有过工作流引擎activiti、SSO、MQ、websocket、webrtc等开发经验者优先考虑;有过微信接口、人脸识别、GIS应用开发者优先考虑;3.java工程师的工作职责第3篇职责:1、参与公司产品研发,完成开发任务,并对负责开发的模块进行测试、维护;2、按规范编写相关技术文档;3、与团队成员合作、沟通,对开发过程中问题进行总结;4、负责系统需求分析和规划系统功能和接口;5、参与产品的需求分析与讨论,完成部分功能设计,制定开发计划;6、参与产品的技术支持工作;任职资格:1、本科以上学历,211,985院校优先,3年及以上JAVA及Web项目开发经验;2、熟悉J2EE规范,熟悉常用的数据结构,算法和设计模式;3、熟悉主流JavaWeb框架,熟练使用JSP、Jquery、Bootstrap、H5等WEB开发基础技术;熟练使用Spring,SpringMVC,SpringCloud,SpringBoot,Mybatis等;4、熟练使用Oracle或Mysql,拥有较好的数据库开发及设计能力;掌握Redis、MQ、ES等技术技术者优先;5、有Hbase、Hive、Impala等Nosql经验者优先考虑;6、熟练使用常见开发工具及技术Maven,Junit;7、了解高并发和大数据相关知识者优先;8、熟悉Linux常用命令;9、熟练使用Github,SVN版本控制工具;10、有良好的沟通表达能力,有大型互联网经验者优先。
JavaWeb开发中的最佳实践在当今日益发展的互联网世界,JavaWeb开发已经成为了开发者们不可或缺的技能之一。
作为一门广泛应用于企业级开发的编程语言,JavaWeb已经在企业应用开发中扮演着重要的角色。
在JavaWeb开发过程中,如何实现最佳实践成为了关注的焦点。
下面将从技术选型、代码实践、性能优化三个方面为大家分析JavaWeb开发中的最佳实践。
一、技术选型JavaWeb开发中,技术选型是至关重要的一个环节。
选择一些可靠、稳定的技术框架既可以提升开发效率,也可以保证系统的安全性和可扩展性。
以下是一些常用的JavaWeb技术框架:1. Spring框架:Spring是一个轻量级的Java开发框架,可以用来构建Web应用、RESTful API、企业级应用等。
它提供了IoC容器,用来管理对象之间的依赖关系,简化了代码。
Spring还提供了MVC框架,用于构建Web应用。
2. Hibernate框架:Hibernate是一个ORM框架,用于将Java对象映射到关系型数据库中。
它提供了一种简单的方式来执行增、删、改、查操作,减少了传统的JDBC编程的工作量。
3. MyBatis框架:MyBatis是一个持久层框架,也是一种ORM框架,用于将Java对象映射到关系型数据库中。
相比Hibernate,MyBatis更加灵活,支持自定义SQL语句和动态查询,可以更好地控制SQL执行。
4. Struts2框架:Struts2是一个MVC框架,用于构建Web应用。
它提供了分离前端和后端的解决方案,使开发人员可以专注于业务逻辑的实现,提高代码的可读性和可维护性。
二、代码实践在JavaWeb开发中,代码实践对于开发一个成功的Web应用来说是至关重要的。
以下提供一些代码实践的最佳实践:1. 符合MVC设计模式:MVC(Model-View-Controller)设计模式是一种常用的软件架构模式,用于分离应用程序的逻辑、数据和表示。
Java中级程序员任职要求一、工作经验要求1、2年以上Java开发经验:Java中级程序员需要具备2年以上Java实际项目开发经验,能够熟练掌握Java基础知识和常用框架,能够独立完成开发任务。
2、1年以上互联网工作经验:互联网行业是Java应用的主要领域之一,因此,Java中级程序员需要具备1年以上互联网工作经验,熟悉互联网产品的开发流程和规范,能够应对互联网产品的复杂性和高并发性。
二、技术要求1、熟练掌握Java基础:Java中级程序员需要熟练掌握Java基础,包括IO、多线程、集合等基础知识,能够熟练使用Java语言进行编程。
2、熟悉常用框架:Java中级程序员需要熟悉Spring、SpringMVC、MyBatis、Hibernate等常用框架,能够使用这些框架进行快速开发。
3、熟悉数据库和缓存:Java中级程序员需要熟悉Oracle或MySQL等主流数据库,能够熟练使用SQL语句,编写存储过程等。
同时,需要熟悉Redis、Memcached等缓存框架,提高系统性能。
4、熟悉系统设计和设计模式:Java中级程序员需要熟悉系统设计,熟练使用常见设计模式,有模块化开发意识,有一定的系统架构能力。
三、能力和素质要求1、良好的沟通表达能力:Java中级程序员需要具备良好的沟通表达能力,能够完整准确理解沟通内容,并且能够清晰准确地表达自己的想法和意见。
2、团队合作精神:Java中级程序员需要具备良好的团队合作精神,能够与团队成员紧密合作,共同完成项目任务。
3、工作规范意识:Java中级程序员需要具备工作规范意识,能够遵守公司的工作规范和流程,保证工作质量和效率。
4、学习能力:Java技术不断发展,Java中级程序员需要具备学习能力,不断学习和掌握新的技术和工具,保持技术领先。
四、其他要求1、有移动端接口开发经验者优先:随着移动互联网的快速发展,移动端接口开发成为Java中级程序员的重要技能之一。
因此,有移动端接口开发经验者优先。
程序员词语1. 数据结构(Data Structure):程序员常用的术语,指的是在计算机科学中,数据结构是存储和组织数据的方式,通常需要提供一组操作来访问或修改这些数据。
2. 算法(Algorithm):指的是解决问题的一组明确步骤,它描述了通过执行一系列有限步骤来实现某个任务的过程。
算法与数据结构紧密相关,通常需要合理地选择和使用数据结构来实现算法。
3. 编程语言(Programming Language):用来编写软件和程序的一种语言,有多种不同的编程语言可供选择,如C、Python、Java等。
每种编程语言都有其特定的语法和功能,适用于不同的应用场景。
4. 接口(Interface):指的是软件或系统提供给外部使用的功能和方法,它定义了软件或系统与其他组件之间的约定。
接口可以是函数的参数列表、类的方法等,用于实现不同模块之间的交互和通信。
5. 数据库(Database):用于存储和管理数据的系统,它可以提供数据的持久化存储和高效的数据访问。
常见的数据库包括关系型数据库(如MySQL、Oracle)和非关系型数据库(如MongoDB、Redis)。
6. 操作系统(Operating System):管理计算机硬件和软件资源的核心系统软件,为应用程序提供了统一的接口和资源管理功能。
常见的操作系统包括Windows、Linux、iOS等。
7. 并发(Concurrency):指的是多个任务或操作同时进行的能力,常见于多线程编程、分布式系统等场景。
并发编程需要考虑资源竞争、死锁等问题,通常使用锁、信号量等机制来保证程序的正确性。
8. 网络编程(Network Programming):涉及到在计算机网络上进行数据传输和通信的编程技术。
程序员需要了解网络协议、套接字编程等相关知识,来实现网络应用和分布式系统。
9. 虚拟化(Virtualization):指的是通过软件技术在一台物理机上创建多个虚拟的计算环境,可以提高硬件资源的利用率和系统的灵活性。
软件开发项目管理及实施方案第1章项目立项与规划 (4)1.1 项目背景分析 (4)1.2 项目目标与需求 (4)1.3 项目可行性研究 (5)1.4 项目规划与时间表 (5)第2章项目团队组织与管理 (6)2.1 团队组建与职责分配 (6)2.2 团队沟通与协作 (6)2.3 人员培训与技能提升 (7)2.4 团队绩效考核与激励 (7)第3章软件需求分析 (7)3.1 用户需求调研 (7)3.1.1 调研目标 (7)3.1.2 调研方法 (7)3.1.3 调研对象 (8)3.2 需求分析过程 (8)3.2.1 需求收集 (8)3.2.2 需求分析 (8)3.2.3 需求确认 (8)3.2.4 需求优先级排序 (8)3.3 需求规格说明书 (8)3.3.1 编写目的 (8)3.3.2 内容结构 (8)3.4 需求变更控制 (9)3.4.1 变更原因 (9)3.4.2 变更流程 (9)3.4.3 变更控制措施 (9)第4章软件设计与架构 (9)4.1 系统架构设计 (9)4.1.1 架构概述 (9)4.1.2 架构模式 (9)4.1.3 技术选型 (10)4.2 模块划分与接口设计 (10)4.2.1 模块划分 (10)4.2.2 接口设计 (10)4.3 数据库设计 (10)4.3.1 数据库选型 (10)4.3.2 数据库表设计 (10)4.3.3 数据库访问层设计 (11)4.4 设计评审与优化 (11)4.4.1 设计评审 (11)第5章编码与实现 (11)5.1 编程规范与技术选型 (11)5.1.1 编程规范 (11)5.1.2 技术选型 (12)5.2 代码编写与质量控制 (12)5.2.1 代码编写 (12)5.2.2 质量控制 (12)5.3 代码审查与测试 (12)5.3.1 代码审查 (12)5.3.2 测试 (12)5.4 版本控制与协同开发 (13)5.4.1 版本控制 (13)5.4.2 协同开发 (13)第6章软件测试 (13)6.1 测试策略与计划 (13)6.1.1 测试策略 (13)6.1.2 测试计划 (13)6.2 单元测试与集成测试 (13)6.2.1 单元测试 (13)6.2.2 集成测试 (14)6.3 系统测试与验收测试 (14)6.3.1 系统测试 (14)6.3.2 验收测试 (14)6.4 缺陷管理与跟踪 (14)第7章项目风险管理 (14)7.1 风险识别与评估 (15)7.1.1 风险识别 (15)7.1.2 风险评估 (15)7.2 风险应对策略 (15)7.2.1 需求风险应对策略 (15)7.2.2 技术风险应对策略 (15)7.2.3 人员风险应对策略 (16)7.2.4 进度风险应对策略 (16)7.2.5 质量风险应对策略 (16)7.2.6 成本风险应对策略 (16)7.2.7 外部风险应对策略 (16)7.3 风险监控与沟通 (16)7.3.1 风险监控 (16)7.3.2 风险沟通 (16)7.4 风险管理总结 (17)第8章项目进度与成本控制 (17)8.1 项目进度计划与监控 (17)8.1.1 进度计划编制 (17)8.1.3 进度更新与调整 (17)8.2 成本预算与控制 (17)8.2.1 成本预算编制 (17)8.2.2 成本控制方法 (17)8.2.3 成本控制措施 (17)8.3 资源分配与优化 (18)8.3.1 资源分配原则 (18)8.3.2 资源优化方法 (18)8.3.3 资源监控与调整 (18)8.4 项目调整与变更管理 (18)8.4.1 项目调整原则 (18)8.4.2 变更管理流程 (18)8.4.3 变更控制措施 (18)第9章项目交付与验收 (18)9.1 项目成果整理与交付 (18)9.1.1 成果整理 (18)9.1.2 成果审查 (19)9.1.3 成果交付 (19)9.2 客户验收与满意度调查 (19)9.2.1 客户验收 (19)9.2.2 满意度调查 (19)9.3 项目总结与经验教训 (19)9.3.1 项目总结 (20)9.3.2 经验教训 (20)9.4 后期维护与优化 (20)9.4.1 后期维护 (20)9.4.2 优化服务 (20)第10章项目质量管理 (20)10.1 质量管理体系构建 (20)10.1.1 制定质量方针和目标 (20)10.1.2 确定质量标准和规范 (21)10.1.3 设计质量组织结构 (21)10.1.4 分配质量责任和权限 (21)10.1.5 制定质量流程和程序 (21)10.1.6 建立质量培训和提升机制 (21)10.2 质量控制与检查 (21)10.2.1 质量计划制定 (21)10.2.2 质量控制工具和方法选择 (21)10.2.3 质量检查流程设计 (21)10.2.4 监控质量指标和关键绩效指标 (21)10.2.5 质量问题识别、分析和解决 (21)10.3 质量改进与持续优化 (21)10.3.1 质量改进计划制定 (21)10.3.2 质量改进团队组织与职责划分 (21)10.3.3 质量改进方法与工具应用 (21)10.3.4 质量改进实施与跟踪 (21)10.3.5 持续优化质量管理体系 (21)10.4 项目质量评估与审计 (21)10.4.1 质量评估标准与指标体系构建 (21)10.4.2 质量评估方法与工具选择 (21)10.4.3 质量审计流程设计 (21)10.4.4 质量评估与审计结果分析 (21)10.4.5 质量评估与审计报告编制 (21)第1章项目立项与规划1.1 项目背景分析信息技术的飞速发展,软件行业已成为国民经济的重要组成部分。
Redis开发常用规范
1.冷热数据分离,不要将所有数据全部都放到Redis中
虽然Redis支持持久化,但是Redis的数据存储全部都是在内存中的,成本昂贵。建议根据业务只
将高频热数据存储到Redis中【QPS大于5000】,对于低频冷数据可以使用
MySQL/ElasticSearch/MongoDB等基于磁盘的存储方式,不仅节省内存成本,而且数据量小在操
作时速度更快、效率更高!
2.不同的业务数据要分开存储
不要将不相关的业务数据都放到一个Redis实例中,建议新业务申请新的单独实例。因为Redis为
单线程处理,独立存储会减少不同业务相互操作的影响,提高请求响应速度;同时也避免单个实例
内存数据量膨胀过大,在出现异常情况时可以更快恢复服务!
3.规范Key的格式
合适的key,便于查看,统计,排错。
比如:
网关 GW
平台名 平台缩写
“平台缩写“+“:”+“项目名”+“:”+“业务含义”
例如:GW:TRADE:USERID
GW是新网关,TRADE是交易项目,USERID为业务ID。
":"-作为key分隔符,方便客户端工具作为目录分级
4.存储的Key一定要设置超时时间
如果应用将Redis定位为缓存Cache使用,对于存放的Key一定要设置超时时间!因为若不设置,
这些Key会一直占用内存不释放,造成极大的浪费,而且随着时间的推移会导致内存占用越来越大,
直到达到服务器内存上限!另外Key的超时长短要根据业务综合评估,而不是越长越好!(某些业务
要求key长期有效。可以在每次写入时,都设置超时时间,让超时时间顺延。)
public Boolean set(final byte[] key, final byte[] value, final long liveTime) {
return redisTemplate.execute(new RedisCallback
public Boolean doInRedis(RedisConnection
connection) throws DataAccessException {
connection.set(key, value);
if (liveTime > 0) {
connection.expire(key, liveTime);
}
return Boolean.TRUE;
}
});
}
5.对于必须要存储的大文本数据一定要压缩后存储
对于大文本【超过500字节】写入到Redis时,一定要压缩后存储!大文本数据存入Redis,除了
带来极大的内存占用外,在访问量高时,很容易就会将网卡流量占满,进而造成整个服务器上的所
有服务不可用,并引发雪崩效应,造成各个系统瘫痪!
public Boolean setBigValue(final byte[] key, final byte[] value, final long liveTime){
return redisTemplate.execute(new RedisCallback
public Boolean doInRedis(RedisConnection
connection) throws DataAccessException {
byte[] compressedBytes = CompressUtil.compress(value);
connection.set(key, compressedBytes);
if (liveTime > 0) {
connection.expire(key, liveTime);
}
return Boolean.TRUE;
}
});
}
压缩可参考:
public class CompressUtil {
private static final Inflater infl = new Inflater();
private static final Deflater defl = new Deflater();
private CompressUtil(){
}
public static byte[] uncompress(byte[] inputByte) throws IOException {
int len = 0;
infl.setInput(inputByte);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] outByte = new byte[1024];
try {
while (!infl.finished()) {
len = infl.inflate(outByte);
if (len == 0) {
break;
}
bos.write(outByte, 0, len);
}
infl.end();
} catch (Exception e) {
} finally {
bos.close();
}
return bos.toByteArray();
}
public static byte[] compress(byte[] inputByte) throws IOException {
int len = 0;
defl.setInput(inputByte);
defl.finish();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] outputByte = new byte[1024];
try {
while (!defl.finished()) {
len = defl.deflate(outputByte);
bos.write(outputByte, 0, len);
}
defl.end();
} finally {
bos.close();
}
return bos.toByteArray();
}
}
6.线上Redis禁止使用Keys正则匹配操作
Redis是单线程处理,在线上KEY数量较多时,操作效率极低【时间复杂度为O(N)】,该命令一
旦执行会严重阻塞线上其它命令的正常请求,而且在高QPS情况下会直接造成Redis服务崩溃!如
果有类似需求,请使用scan命令代替!
//此操作禁止
public Set
return redisTemplate.execute(new RedisCallback
@Override
public Set
connection) throws DataAccessException {
return connection.keys(pattern);
}
});
}
7.可靠的消息队列服务
Redis List经常被用于消息队列服务。假设消费者程序在从队列中取出消息后立刻崩溃,但由于该消
息已经被取出且没有被正常处理,那么可以认为该消息已经丢失,由此可能会导致业务数据丢失,
或业务状态不一致等现象发生。为了避免这种情况,Redis提供了RPOPLPUSH命令,消费者程序
会原子性的从主消息队列中取出消息并将其插入到备份队列中,直到消费者程序完成正常的处理逻
辑后再将该消息从备份队列中删除。同时还可以提供一个守护进程,当发现备份队列中的消息过期
时,可以重新将其再放回到主消息队列中,以便其它的消费者程序继续处理。
8.谨慎全量操作Hash、Set等集合结构
在使用HASH结构存储对象属性时,开始只有有限的十几个field,往往使用HGETALL获取所有成
员,效率也很高,但是随着业务发展,会将field扩张到上百个甚至几百个,此时还使用HGETALL
会出现效率急剧下降、网卡频繁打满等问题【时间复杂度O(N)】,此时建议根据业务拆分为多个Hash
结构;或者如果大部分都是获取所有属性的操作,可以将所有属性序列化为一个STRING类型存储!
同样在使用SMEMBERS操作SET结构类型时也是相同的情况!
9.根据业务场景合理使用不同的数据结构类型
目前Redis支持的数据库结构类型较多:字符串(String),哈希(Hash),列表(List),集合(Set),
有序集合(Sorted Set), Bitmap, HyperLogLog和地理空间索引(geospatial)等,需要根据业务场
景选择合适的类型,常见的如:String可以用作普通的K-V、计数类;Hash可以用作对象如商品、
经纪人等,包含较多属性的信息;List可以用作消息队列、粉丝/关注列表等;Set可以用于推荐;
Sorted Set可以用于排行榜等!