# Redis规范
为了避免出现因redis使用不当,而造成异常影响业务,以及方便后期运维,故而经团队内部人员协商,出具redis使用规范,通过规范更好、更高效,更安全的使用redis缓存。
### 目前情况
* redis命名不规范,各种命名规则混合使用
* redis被用于持久化存储数据,redis数据有丢失风险,无重新加载方案
* redis存储的key,未设置过期时间
### 关于文档中「能愿动词」的使用,参考psr使用规范的定义
为了避免歧义,文档大量使用了「能愿动词」,对应的解释如下:
* 必须 (MUST):绝对,严格遵循,请照做,无条件遵守;
* 一定不可 (MUST NOT):禁令,严令禁止;
* 应该 (SHOULD) :强烈建议这样做,但是不强求;
* 不该 (SHOULD NOT):强烈不建议这样做,但是不强求;
* 可以 (MAY) 和 可选 (OPTIONAL) :选择性高一点,在这个文档内,此词语使用较少;
### 键值设计
* redis key命名**应该**具有可读性以及可管理行,**不该**使用含义不清的key以及特别长的key名;
* redis key命名**必须**全部由小写字母、数字、英文点号(.)和英文半角冒号(:)组成,**必须**以英文字母开头;
* redis key命名**必须**按照模块区分前缀,具体模块定义参照上述模块划分中的内容,逻辑含义段**必须**使用英文半角冒号(:)分割,单词之间**必须**使用英文半角点号(.)分割,**一定不可**使用殊字符(下划线、空格、换行、单双引号以及其他转义字符等);
* redis key命名必须以key所代表的value类型结尾,见到key即可知道存储数据类型,以提高可读性;
* 总结,命名规范为 业务模块名:业务逻辑含义:其他:value类型\*\*`user:uid:1:string`\*\*
### 业务规范
* redis**应该**定位为缓存数据,除特殊需求外,聊天等
* redis,**应该**设置过期时间
* redis定位为缓存cache使用时,对于存放的key,应该使用expire设置过期时间;
* 若不设置的话,这些key会一直占用内存不释放,随着时间的推移会越来越大,直到达到服务器的内存上线,导致宕机等恶略影响;
* 对于key的超时时长设置,可根据业务需求自行评估,并非越长越好;
* 某些业务的确需要长期有效,可以在每次设置时,设置超时时间,让超时时间顺延;
* redis的使用,**应该**考虑冷热数据分离,**不该**将所有数据全部放到redis中,对于使用不频繁,且无关的日志等存入mysql,或正常的日志文件系统中
redis的数据存储全部都是在内存中的,成本昂贵。**应该**根据业务只将高频热数据存储到redis中,对于低频冷数据可以使用MySQL/MongoDB等基于磁盘的存储方式,不仅节省内存成本,而且数据量小在操作时速度更快、效率更高
* redis有数据丢失风险,程序处理数据时,**应该**考虑丢失后的重新加载过程
使用redis时,要考虑丢失数据的风险,项目架构时需要考虑到相应解决方案,程序需要处理如果redis数据丢失时重新可进行重新加载
* 对于必须要存储的大文本数据**应该**压缩后存储
对于大文本写入到Redis时,要压缩后存储。大文本数据存入redis,除了带来极大的内存占用外,在访问量高时,很容易就会将网卡流量占满,进而造成整个服务器上的所有服务不可用,并引发雪崩效应,造成各个系统瘫痪
* 线上redis**一定不可**使用Keys正则匹配操作
* 选择合适的数据类型
* 在不能确定其它复杂数据结构一定优于String类型时,避免使用Redis的复杂数据结构。
* 每种数据结构都有相应的使用场景,String类型是Redis中最简单的数据类型,建议使用String类型。
* 但是考虑到具体的业务场景,综合评估性能、存储、网络等方面之后使用适当的数据结构。
* 需要根据业务场景选择合适的类型,常见的如:String可以用作普通的K-V、简单数据类类型等;Hash可以用作对象如商品、经纪人等,包含较多属性的信息;List可以用作消息队列、医生粉丝/关注列表等;Set可以用于推荐;SortedSet可以用于排行榜等。
*****
- 搭建ThinkPHP6的开发环境
- 配置ThinkPHP6
- 必要的基础知识(basic)
- MVC开发模式
- 控制器(controller)
- 数据库(database)
- 模型(model)
- 模型关联(relation)
- 视图(view)
- Session
- Cookie
- 缓存(cache)
- 上传(upload)
- 验证器(validate)
- 验证码(captcha)
- 命令行(command)
- 服务器部署(deploy)
- 数据备份(backup)
- 数据同步(synchronization)
- 订阅服务(subscribe)
- PHP 易混淆知识点
- 助手函数
- MySQL规范
- Redis 规范
- office插件 phpoffice
- 拼音插件 pinyin
- 日期插件 datetime
- 消息插件 amqp
- 产品部署环境的搭建
- PDF 等杂项处理
- 文件上传
- 常用扩展
- flc/dysms
- 使用示例 ①
- 使用示例 ②
- qiniu/php-sdk
- 简介
- 使用示例
- 使用示例 2 ②
- liliuwei/thinkphp-jump
- 扩展介绍
- 下载扩展
- 使用方法
- topthink/think-captcha
- 安装扩展
- 验证码显示
- 更换验证码
- 验证码校验
- 验证码配置
- 自定义验证码
- phpoffice/phpspreadsheet
- 数据写入表格
- 读取表格数据
- topthink/think-queue
- 安装
- 自定义函数
- 任务类
- 带有日志的任务类