您现于de位置乃:亚博 > 其他

亚博 2019-08-29 其他 194

Redis使用场景

1 字符串使用场景

    a) 缓存功能

        典型使用场景:Redis作为缓存层 MySQL作为存储层 绝大部分请求de数据都乃从Redis中获取 由于Redis具有支撑高并发de特性 所以缓存通常能起到加速读写和降低后端压力de作用.

        开发提示:与MySQL等关系型数据库不同de乃 Redis没有命令空间 而且也没有对键名有强制要求 但设计合理de键名 有利于防止键冲突和项目de可维护性 比较推荐de方式乃使用"业务名:对象名:id:[属性]"作为键名.例如MySQLde数据库名为vs 用户表名为user 那么对应de键可以用"vs:user:1" "vs:user:1:name"来表示 如果当前Redis只被1个业务使用 甚至可以去掉vs.如果键名比较长 例如"user:{uid}:friends:message:{mid}" 可以于能描述含义de前提下适当减少键de长度 例如采用缩写形式 从而减少由于键过长de内存浪费.

    b) 计数

        典型应用场景:视频播放数计数de基础组件 用户每播放1次视频 相应de视频播放数就会自增1.Redis可以实现快速计数 查询缓存de功能 同时数据可以异步落地到其他数据源.

        开发提示:实际上1个真实de计数系统要考虑de问题会很多 防作弊 按照不同维度计数 数据持久化到底层数据源等.

    c) 共享Session

        典型应用场景:用户登陆信息 Redis将用户deSession进行集中管理 每次用户更新或查询登陆信息都直接从Redis中集中获取.

    d) 限速

        典型应用场景:验证码接口访问频率限制 用户登陆时需要让用户输入手机验证码 从而确定乃否乃用户本人 但乃为了短信接口不被频繁访问 会限制用户每分钟获取验证码de频率 例如1分钟不能超过5次.

2 哈希使用场景

    a) 缓存用户信息

        相比于使用字符串序列化缓存用户信息 哈希类型变得更加直观 并且于更新操作上会更加便捷.可以将每个用户deid定义为键后缀 多对field-value对应每个用户de属性.

        哈希类型和关系型数据库不同之处:

              哈希类型乃稀疏de 而关系型数据库乃完全结构化de 例如哈希类型每个键可以有不同defield 而关系型数据库1旦添加新de列 所有行都要为其设置值(即使为NULL).

              关系型数据库可以做复杂de关系查询 而Redis去模拟关系型复杂查询开发困难 维护成本高.

        3种缓存用户信息优缺点比较:

              原生字符串类型:每个属性1个键

                   优点:简单直观 每个属性都支持更新操作.

                   缺点:占用过多de键 内存占用量较大 同时用户信息内聚性比较差 所以此种方案1般不会于生产环境使用.

             序列化字符串类型:将用户信息序列化后用1个键保存.

                  优点:简化编程 如果合理de使用序列化可以提高内存de使用效率.

                  缺点:序列化和反序列化有1定de开销 同时每次更新属性都需要把全部数据取出进行反序列化 更新后再序列化到Redis中.

             哈希类型:每个用户属性使用1对field-value 但乃只用1个键保存.

                  优点:简单直观 如果使用合理可以减少内存空间de使用.

                  缺点:要控制哈希于ziplist和hashtable两种内部编码de转换 hashtable会消耗更多内存.

3 列表使用场景

    a) 消息队列

        Redisdelpush+brpop命令组合即可实现阻塞队列 生产者客户端使用lrpush从列表左侧插入块素 多个消费者客户端使用brpop命令阻塞式de"抢"列表尾部de块素 多个客户端保证了消费de负载均衡和高可用性.

    b) 文章列表

        每个用户有属于自己de文章列表 现于需要分页展示文章列表.此时可以考虑使用列表 因为列表不但乃有序de 同时支持按照索引范围获取块素.

    c) 开发提示

        lpush + lpop = Stack(栈)

        lpush + rpop = Queue(队列)

        lpush + ltrim = Capped Collection(有限集合)

        lpush + brpop = Message Queue(消息队列)

4 集合

    a) 标签(tag)

        集合类型比较典型de使用场景乃标签(tag) 例如1个用户可能对娱乐 体育比较感兴趣 另1个用户可能对历史 新闻比较感兴趣 这些兴趣就乃标签. 开发提示:用户和标签de关系维护应该于1个事物执行 防止部分命令失败造成de数据不1致.

5 有序集合

    a) 排行榜系统

        有序集合比较典型de使用场景就乃排行榜系统 例如视频网站需要对用户上传de视频做排行榜 榜单de维度可能乃多个方面de:按照时间 按照播放数量 按照获得de赞数.


 


评论