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中的LRU淘汰策略分析

    Redis作为缓存使用时,一些场景下要考虑内存的空间消耗问题。Redis会删除过期键以释放空间,过期键的删除策 […]...

  2. Redis学习四:解析配置文件 redis.conf

    Redis学习四:解析配置文件 redis.conf 一、它在哪 地址: 思考:为什么要将它拷贝出来单独执行? […]...

  3. redis-事务

    事务 MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事务相关的命令。事务可以一 […]...

  4. redis 数据类型

    redis基本数据类型 上一篇文章主要写了redis在linux下的安装,这里讲一下redis基本的数据类型, […]...

  5. Spring Boot Cache Redis缓存

    1、集成MyBatis 1.1、引入maven依赖 1.2、生成Mapper 具体可以看MyBatis Gen […]...

  6. redis主从复制、主从延迟知几何

    本片章节主要从 redis 主从复制延迟相关知识及影响因素做简要论述。 本片章节主要从 redis 主从复制延 […]...

  7. 关于redis内存分析,内存优化

    关于redis内存分析,内存优化 对于redis来说,什么是最重要的? 毋庸置疑,是内存。 一、reids 内 […]...

  8. 重新整理 mysql 基础篇————— mysql 事务[三]

    前言 简单整理一下事务。 正文 事务有四大特性: 1.原子性(atomicity) 一个事务必须被视为一个不可 […]...

随机推荐

  1. Android单元测试(四):Mock以及Mockito的使用

    几点说明: 代码中的 //<== 表示跟上面的相比,这是新增的,或者是修改的代码,不知道怎么样在代码块里 […]...

  2. TCP协议

    1 TCP协议 1.1 TCP认识 TCP(Transmission Control Protocol 传输控 […]...

  3. HTML/JSP引入JS文件路径问题解析

    文档目录结构     可以看到我的测试test6.html页面与我的js文件所在的myUtils文件夹在同一个 […]...

  4. 并发编程之:JUC并发控制工具

    大家好,我是小黑,一个在互联网苟且偷生的农民工。 在上一期我们讲了Thread.join()方法和CountD […]...

  5. 跟着whatwg看一遍事件循环

    前言 对于单线程来说,事件循环可以说是重中之重了,它为任务分配不同的优先级,井然有序的调度。让js解析,用户交 […]...

  6. Awareness Kit让你的音乐APP脱颖而出,更懂用户,也更动人心

    让你的音乐APP脱颖而出,更懂用户,也更动人心、 场景 情景感知服务能带来什么?   作为音乐发烧友,闲下来的 […]...

  7. Java基础知识之设计模式–单例模式

    Java设计模式–单例模式 Java设计模式–单例模式 声明:本文根据慕课网汤小洋老师 […]...

  8. new new Foo().getName() 一道前端面试题引发的思考

    今天想着邻近毕业季,估计又会有很多稀奇古怪的面试题,看掘金社区的时候看到一道贼有意思的题,一开始看的十分懵逼, […]...

展开目录

目录导航