Redis使用场景

dukuan 2018-06-04 原文

Redis使用场景

1、字符串使用场景

a) 缓存功能
典型使用场景:Redis作为缓存层,MySQL作为存储层,绝大部分请求的数据都是从Redis中获取,由于Redis具有支撑高并发的特性,所以缓存通常能起到加速读写和降低后端压力的作用。
开发提示:与MySQL等关系型数据库不同的是,Redis没有命令空间,而且也没有对键名有强制要求,但设计合理的键名,有利于防止键冲突和项目的可维护性,比较推荐的方式是使用“业务名:对象名:id:[属性]”作为键名。例如MySQL的数据库名为vs,用户表名为user,那么对应的键可以用”vs:user:1″,”vs:user:1:name”来表示,如果当前Redis只被一个业务使用,甚至可以去掉vs。如果键名比较长,例如”user:{uid}:friends:message:{mid}”,可以在能描述含义的前提下适当减少键的长度,例如采用缩写形式,从而减少由于键过长的内存浪费。

b) 计数
典型应用场景:视频播放数计数的基础组件,用户每播放一次视频,相应的视频播放数就会自增1。Redis可以实现快速计数、查询缓存的功能,同时数据可以异步落地到其他数据源。
开发提示:实际上一个真实的计数系统要考虑的问题会很多,防作弊、按照不同维度计数,数据持久化到底层数据源等。

c) 共享Session
典型应用场景:用户登陆信息,Redis将用户的Session进行集中管理,每次用户更新或查询登陆信息都直接从Redis中集中获取。

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

2、哈希使用场景

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

哈希类型和关系型数据库不同之处:
哈希类型是稀疏的,而关系型数据库是完全结构化的,例如哈希类型每个键可以有不同的field,而关系型数据库一旦添加新的列,所有行都要为其设置值(即使为NULL)。
关系型数据库可以做复杂的关系查询,而Redis去模拟关系型复杂查询开发困难,维护成本高。

三种缓存用户信息优缺点比较:
原生字符串类型:每个属性一个键
优点:简单直观,每个属性都支持更新操作。
缺点:占用过多的键,内存占用量较大,同时用户信息内聚性比较差,所以此种方案一般不会在生产环境使用。
序列化字符串类型:将用户信息序列化后用一个键保存。
优点:简化编程,如果合理的使用序列化可以提高内存的使用效率。
缺点:序列化和反序列化有一定的开销,同时每次更新属性都需要把全部数据取出进行反序列化,更新后再序列化到Redis中。
哈希类型:每个用户属性使用一对field-value,但是只用一个键保存。
优点:简单直观,如果使用合理可以减少内存空间的使用。
缺点:要控制哈希在ziplist和hashtable两种内部编码的转换,hashtable会消耗更多内存。

3、列表使用场景

a) 消息队列
Redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的”抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。

b) 文章列表
每个用户有属于自己的文章列表,现在需要分页展示文章列表。此时可以考虑使用列表,因为列表不但是有序的,同时支持按照索引范围获取元素。

c) 开发提示
lpush + lpop = Stack(栈)
lpush + rpop = Queue(队列)
lpush + ltrim = Capped Collection(有限集合)
lpush + brpop = Message Queue(消息队列)

4、集合

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

5、有序集合

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

PS:以上内容摘自《Redis开发与运维》

发表于 2018-06-04 11:48 杜先生的博客 阅读() 评论() 编辑 收藏

 

版权声明:本文为dukuan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dukuan/p/9132600.html

Redis使用场景的更多相关文章

  1. 【原创】redis库存操作,分布式锁的四种实现方式[连载一]–基于zookeeper实现分布式锁

    一、背景 在电商系统中,库存的概念一定是有的,例如配一些商品的库存,做商品秒杀活动等,而由于库存操作频繁且要求 […]...

  2. SmartSql 快速使用指南

    SmartSql 快速使用指南(https://github.com/Ahoo-Wang/SmartSql) […]...

  3. redis cluster的conf配置文件配置

    redis cluster的conf配置文件配置 redis cluster的conf配置文件配置 maste […]...

  4. Redis的集群配置

    如果我们redis的压力很大,如果我们的并发高到我们读数据和写数据都有了很大压力。 那么我们可能就需要把red […]...

  5. Redis:我是如何与客户端进行通信的

    江湖上说,天下武功,无坚不摧,唯快不破,这句话简直是为我量身定制。 我是一个Redis服务,最引以为傲的就是我 […]...

  6. Redis 设计与实现:字符串 SDS

    本文的分析没有特殊说明都是基于 Redis 6.0 版本源码 redis 6.0 源码:https://git […]...

  7. Redis源码解析之跳跃表(一)

    跳跃表(skiplist) 有序集合(sorted set)是Redis中较为重要的一种数据结构,从名字上来看 […]...

  8. Redis之Zset

    Zset描述 1、集合是有序的; 2、支持插入、删除,判断元素是否存在; 3、可以获取获取分数最高\最低的前N […]...

随机推荐

  1. 计算机基础:硬件知识(内存)

    一、内存 在计算机的组成结构中,有一个很重要的部分,就是存储器。存储器,是用来存储程序和数据的部件,对于计算机 […]...

  2. F#周报2019年第9期

    新闻 对于F#,Visual Studio 2019 RC有哪些更新 Visual Studio 2019 R […]...

  3. 【函数分享】每日PHP函数分享(2021-2-19)

    array_diff_uassoc — 用用户提供的回调函数做索引检查来计算数组的差集 说明 array_di […]...

  4. Spring任务执行和调度task:scheduler与task:executor的配置

    配置说明: 从Spring 3.0开始,有一个用于配置TaskExecutor和TaskScheduler实例 […]...

  5. Unreal Engine 4 系列教程 Part 1:入门

    .output_wrapper pre code { font-family: Consolas, Incon […]...

  6. Array对象的原型下实现一个数组去重的方法

    Array对象的原型下实现一个数组去重的方法 <script> //在Array对象的原型下实现一 […]...

  7. EasyPoi使用入门

     咱们在开发的时候,总会遇到需要通过代码操作办公软件的情况,而excel与word的操作最为频繁。    当然 […]...

  8. WINDOWS系统安装JAVA(详细版)

      1.下载JDK 官网下载: www.oracle.com/technetwork… 百度云下载: pan. […]...

展开目录

目录导航