redis 规范

一、键值设计

key名设计

  1. 可读性和可管理性【建议】
    以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id ugc:video:1

  2. 简洁性【建议】
    保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视,例如: user:{uid}:friends:messages:{mid}简化为u:{uid}:fr:m:{mid}

  3. 不要包含特殊字符【强制】
    反例:包含空格、换行、单双引号以及其他转义字符
    详细解析

value设计

  1. 拒绝bigkey(防止网卡流量、慢查询)【强制】

    string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。
    反例:一个包含200万个元素的list。

    非字符串的bigkey,不要使用del删除,使用hscan、sscan、zscan方式渐进式删除,同时要注意防止bigkey过期时间自动删除问题(例如一个200万的zset设置1小时过期,会触发del操作,造成阻塞,而且该操作不会不出现在慢查询中(latency可查)),查找方法和删除方法。

    在应用层,对k/v序列化时,进行判断大小,如果大小超过10KB,则不允许提交到redis。
    详细解析

  2. 选择适合的数据类型【推荐】
    例如:实体类型(要合理控制和使用数据结构内存编码优化配置,例如ziplist,但也要注意节省内存和性能之间的平衡)
    反例:

    set user:1:name tom
    set user:1:age 19
    set user:1:favor football
    

    正例

    hmset user:1 name tom age 19 favor football
    

控制key的生命周期,redis不是垃圾桶【推荐】

建议使用expire设置过期时间(条件允许可以打散过期时间,防止集中过期,bigkey过期需要设置在可控范围之类),不过期的数据重点关注idletime。

key过期删除机制
.
注: big key设置过期时间通过exipreat设置在可控时间范围内,Redis 2.8 key淘汰机制:定期扫描一小批量过期key(20个)删除,内部删除
.
hash、list、set、zset删除会遍历里面的field 一个个删除,由于Redis单线程如果扫描到到big key ,正好且高峰期,内部删除会引起抖动。
.
Redis 存储: hash,list,set的不同类型的key会存储到一个hash表, 某个hash key的field会单独存储到一个hash表。
.
Redis 2.8 delete dict相关代码: dict dictGenericDelete方法

二、命令使用

  1. O(N)命令关注N的数量【推荐】
    例如hgetall、lrange、smembers、zrange、sinter等并非不能使用,但需要通过 hlen 、llen等明确N个数。有查询需求,可以使用hscan、sscan、zscan遍历(也可以开发统一查询平台供开发查询)。

  2. 禁用命令【推荐】
    禁止线上使用keys、flushall、flushdb等,通过redis的rename机制禁掉命令,或者使用scan的方式渐进式处理。

  3. 合理使用select 【推荐】
    建议使用一个redis db,方便运维维护以及排查,由于redis 是单线程,使用多个db并不能带来好处

  4. 使用批量操作提高效率【推荐】
    原生命令:例如mget、mset。
    非原生命令:可以使用pipeline提高效率。
    但要注意控制一次批量操作的元素个数(例如500以内,实际也和元素字节数有关)。
    注意两者不同:

  1. 原生是原子操作,pipeline是非原子操作。
  2. pipeline可以打包不同的命令,原生做不到
  3. pipeline需要客户端和服务端同时支持。
  1. Redis事务功能较弱,不建议使用【建议】
    Redis的事务功能较弱(不支持回滚),而且集群版本(自研和官方)要求一次事务操作的key必须在一个slot上(可以使用hashtag功能解决)

  2. 核心业务排行榜(如果key比较多)/队列(操作频繁),最好单独一个集群。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis设计规范可以根据具体的使用场景和需求来确定,下面是一些常见的设计规范: 1. 键的命名规范:选择一个有意义的键名,以便于维护和理解。可以使用统一的命名前缀来区分不同的业务或模块。 2. 数据结构的选择:根据实际需求选择适合的数据结构来存储数据。Redis支持多种数据结构,如字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(sorted set)等。 3. 内存优化:由于Redis是基于内存的数据库,需要合理使用内存。可以通过设置过期时间、压缩数据、使用合适的数据结构等方式来减少内存占用。 4. 数据持久化:Redis支持两种方式的数据持久化,即快照(snapshotting)和AOF(Append-Only File)。可以根据实际情况选择合适的持久化方式,并设置适当的保存频率和策略。 5. 高可用性和容灾:可以通过主从复制(replication)和哨兵(sentinel)机制来实现Redis的高可用性和容灾。设置合适的主从配置和哨兵监控可以保证系统的稳定性和可用性。 6. 性能优化:可以通过批量操作、管道(pipeline)、使用连接池等方式来提高Redis的性能。同时,合理设置连接超时时间、最大连接数等参数也能够优化性能。 7. 安全性保护:为了保护数据的安全性,可以通过密码认证、限制访问IP、使用SSL加密等方式加强安全性。 需要根据具体场景和需求进行设计和调优,以上只是一些常见的设计规范,具体还需根据实际情况来确定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值