key名设计:
规范化,以数据库名为前缀,防止key冲突,用冒号分隔,如下:(数据库名:表名:ID)
tlz:order:1
简洁性,保证语义的前提下,控制key的长度,应该使用简写
不要包含特殊字符,不要包含空格、换行、单双引号以及其他符号
value设计:
拒绝bigkey,防止慢查询,string类型控制在10k以内,hash、lish、set、zset元素个数不要超过5000
控制key的声明周期:
建议使用expire设置过期时间,尽量打散过期时间,不要集中过期
禁用命令:
禁止线上使用keys、flushall、flushdb等,通过redis的rename机制禁掉命令,或者使用scan的方式渐进式处理。因为redis是单线程执行,容易导致线上不可用.
scan命令是通过游标分步进行,不会阻塞线程,提供count参数,不是结果数量,是Redis单次遍历字典数量,同keys一样也提供模式匹配功能。
scan 0 match user_token* count 5 #从0开始遍历,返回新游标,下次查询从新游标开始遍历
合理使用select:
redis的多数据库较弱,使用数字进行区分,很多客户端支持较差,同时多业务用多数据库实际还是单线程处理,会有干扰
尽量使用批量操作提高效率:
原生命令:例如mget、mset;非原生命令:可以使用pipeline提高效率。
但要注意控制一次批量操作的元素个数(例如500以内,实际也和元素字节数有关)。