分布式缓存是分布式系统中的重要组件,主要解决高并发、大数据场景下,热点数据访问的性能问题,提供高性能的数据快速访问。

使用缓存常见场景是:项目中部分数据访问比较频繁,对下游 DB(例如 MySQL)造成服务压力,这时候可以使用缓存来提高效率。下面来讲BAT等一线企业中Redis各种应用场景核心设计!

一、常用指令

接下来看看每个数据结构常用的指令有哪些,我们用一张表比较清晰的展示:

二、场景解析

1.1string存储

1.2String 类型使用场景

场景一:商品库存数

从业务上,商品库存数据是热点数据,交易行为会直接影响库存。而 Redis 自身 String 类型提供了:

  1. set goods_id 10; 设置 id 为 good_id 的商品的库存初始值为 10;
  2. decr goods_id; 当商品被购买时候,库存数据减 1。

依次类推的场景:商品的浏览次数,问题或者回复的点赞次数等。这种计数的场景都可以考虑利用 Redis 来实现。

场景二:时效信息存储

Redis 的数据存储具有自动失效能力。也就是存储的 key-value 可以设置过期时间:set(key, value, expireTime)。

比如,用户登录某个 App 需要获取登录验证码, 验证码在 30 秒内有效。那么我们就可以使用 String 类型存储验证码,同时设置 30 秒的失效时间。

2.1hash存储数据

2.2Hash 类型使用场景

Redis 在存储对象(例如:用户信息)的时候需要对对象进行序列化转换然后存储。

还有一种形式,就是将对象数据转换为 JSON 结构数据,然后存储 JSON 的字符串到 Redis。

对于一些对象类型,还有一种比较方便的类型,那就是按照 Redis 的 Hash 类型进行存储。

例如,我们存储一些网站用户的基本信息, 我们可以使用:

这样就存储了一个用户基本信息,存储信息有:{name : 小明, phone : “123456”,sex : “男”}

当然这种类似场景还非常多, 比如存储订单的数据,产品的数据,商家基本信息等。以淘宝购物车为主

2.3实现信息存储的优缺点

1.原生:

  • set user: 1:name james;
  • set user:1:age 23;
  • set user:1:sex boy;

优点:简单直观,每个键对应一个值

缺点:键数过多,占用内存多,用户信息过于分散,不用于生产环境

2.将对象序列化存入

redis set user:1 serial ize (userInfo);

优点:编程简单,若使用序列化合理内存使用率高

缺点:序列化与反序列化有一定开销,更新属性时需要把userInfo全取出来进行反序列化,更新后再序列化到redis

3.hash存储:

hmset user:1 name james age 23 sex boy

优点:简单直观,使用合理可减少内存空间消耗

缺点:要控制ziplist 与hashtable两种编码转换,Mhashtable会消耗更多内存。

3.1List 类型使用场景

list 是按照插入顺序排序的字符串链表。可以在头部和尾部插入新的元素(双向链表实现,两端添加元素的时间复杂度为 O(1)) 。

场景一:消息队列实现

目前有很多专业的消息队列组件 Kafka、RabbitMQ 等。 我们在这里仅仅是使用 list 的特征来实现消息队列的要求。在实际技术选型的过程中,大家可以慎重思考。

list 存储就是一个队列的存储形式:

  1. lpush key value; 在 key 对应 list 的头部添加字符串元素;
  2. rpop key;移除列表的最后一个元素,返回值为移除的元素。

场景二:最新上架商品

在交易网站首页经常会有新上架产品推荐的模块, 这个模块是存储了最新上架前 100 名。

这时候使用 Redis 的 list 数据结构,来进行 TOP 100 新上架产品的存储。

Redis ltrim 指令对一个列表进行修剪(trim),这样 list 就会只包含指定范围的指定元素。

start 和 stop 都是由 0 开始计数的,这里的 0 是列表里的第一个元素(表头),1 是第二个元素。

如下伪代码演示:

4.1set 类型使用场景

set 也是存储了一个集合列表功能。和 list 不同,set 具备去重功能。当需要存储一个列表信息,同时要求列表内的元素不能有重复,这时候使用 set 比较合适。与此同时,set 还提供的交集、并集、差集。

例如,在交易网站,我们会存储用户感兴趣的商品信息,在进行相似用户分析的时候, 可以通过计算两个不同用户之间感兴趣商品的数量来提供一些依据。

获取到两个用户相似的产品, 然后确定相似产品的类目就可以进行用户分析。

类似的应用场景还有, 社交场景下共同关注好友, 相似兴趣 tag 等场景的支持。

4.2Set集合特殊的操作命令

setA={A,B,C} setB={B, C}

1)集合与集合之间的交集

sinter setA setB-->得到集合{B,C}

集合与集合之间的并集

sunion setA setB -->得到集合{A,B,C}

3)集合与集合之间的差集

sdiff setA setB-->得到集合{A}

4.3Set集合特殊的操作命令应用场景

如何实现微博的微关系设计?

5.1 Zset有序集合

常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数与集合有联系,不能有重复的成员

5.2Zset 类型使用场景

终于把Redis场景设计搞清楚了,需要掌握的都在这了相关推荐

  1. Sketchup插件Vray户外场景设计渲染教程 Vray Next For Sketchup Exterior

    Sketchup户外场景设计的Vray Next 你会学到什么 渲染白天和夜晚场景 后期制作 Sketchup的Vray Next 中级sketchup用户 大小解压后:3.83G 1280X720 ...

  2. 阿里JAVA面试题剖析:一般实现分布式锁都有哪些方式?使用 Redis 如何设计分布式锁?...

    面试原题 一般实现分布式锁都有哪些方式?使用 redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高? 面试官心理分析 其实一般问问题,都是这么问的,先 ...

  3. Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...

  4. 【作者面对面问答】包邮送《Redis 5设计与源码分析》5本

    墨墨导读:本文节选自<Redis 5设计与源码分析>,主要为读者分析Redis高性能内幕,重点从源码层次讲解了Redis事件模型,网络IO事件重在使用IO复用模型,时间事件重在限制最大执行 ...

  5. python文本框与数据库的关联_Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理...

    基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3. ...

  6. 【8. Redis 的设计、实现】

    Redis 的设计.实现 数据结构和内部编码 数据结构和内部编码 type命令 type 命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符 串)hash(哈希).list(列表) ...

  7. 终于有人把标签设计讲明白了

    导读:标签是根据业务场景的需求,通过对目标对象(含静态.动态特性)运用抽象.归纳.推理等算法得到的高度精练的特征标识,用于差异化管理与决策. 作者:华为公司数据管理部 来源:大数据DT(ID:hzda ...

  8. 新书推荐 |《Redis 5设计与源码分析》

    新书推荐 <Redis 5设计与源码分析> 点击上图了解及购买 好未来.滴滴.百度等公司专家联合撰写,掌握Redis 5设计与命令实现,透彻掌握分布式缓存. 编辑推荐 多名专家联袂推荐,资 ...

  9. 一个简单的字符串,为什么 Redis 要设计的如此特别

    一个简单的字符串,为什么 Redis 要设计的如此特别 五种基本数据类型之字符串对象 二进制安全字符串 什么是二进制安全的字符串 sds 空间分配策略 空间预分配 惰性空间释放 sds 和 C 语言字 ...

最新文章

  1. error D8021 :无效的数值参数“/Wno-cpp” cython_bbox
  2. java 很垃圾_JAVA吧真的很垃圾!!!
  3. 小麦亩产一千八(jzoj 3461)
  4. Python基础-闭包
  5. js中变量作用域的小理解
  6. 读取excel并将其转换为xml
  7. xp系统如何更改计算机用户名,xp用administrator_XP系统修改administrator的用户名_xpadministrator...
  8. MySQL:Can't create test file XXX.lowe-test
  9. google 搜索接口
  10. eating的中文意思_eating是什么意思
  11. Windows10下如何创建VHDX(VHD)格式的虚拟硬盘文件
  12. 如何用 Java 对 PDF 文件进行电子签章
  13. sql server 添加表注释、字段注释
  14. 《Microsoft SQL Server入门教程》第03篇 示例数据库和示例表
  15. centos离线配置yun源
  16. Qt MSVC 2017 32bit 编译出现“error: C2131: 表达式的计算结果不是常数”错误
  17. 基于ELK的日志系统最佳实践
  18. 2021年职场百态:半数互联网人被迫内卷下,年轻人开始青睐“铁饭碗”
  19. PX4报错FAILED: external/Stamp/sitl_gazebo/sitl_gazebo-configure解决
  20. Windows 任务计划程序定时执行 powershell 脚本

热门文章

  1. mysql group_concat null_MySQL教程之concat以及group_concat的用法
  2. Linux-windows10下安装Ubuntu
  3. 计算机对民间音乐,《中国民间歌曲》
  4. java最小子串覆盖_LeetCode 76. 最小覆盖子串
  5. 线性代数知识点总结_[Github项目推荐] 机器学习amp; Python 知识点速查表
  6. erp无线架设服务器,erp数据库架设在云服务器上
  7. php io操作,lua 的io操作,非常详细
  8. redis发布与订阅
  9. C# 知识点笔记:IEnumerable的使用,利用反射动态调用方法
  10. 老李分享:持续集成学好jenkins之Git和Maven配置