终于把Redis场景设计搞清楚了,需要掌握的都在这了
分布式缓存是分布式系统中的重要组件,主要解决高并发、大数据场景下,热点数据访问的性能问题,提供高性能的数据快速访问。
使用缓存常见场景是:项目中部分数据访问比较频繁,对下游 DB(例如 MySQL)造成服务压力,这时候可以使用缓存来提高效率。下面来讲BAT等一线企业中Redis各种应用场景核心设计!
一、常用指令
接下来看看每个数据结构常用的指令有哪些,我们用一张表比较清晰的展示:
二、场景解析
1.1string存储
1.2String 类型使用场景
场景一:商品库存数
从业务上,商品库存数据是热点数据,交易行为会直接影响库存。而 Redis 自身 String 类型提供了:
- set goods_id 10; 设置 id 为 good_id 的商品的库存初始值为 10;
- 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 存储就是一个队列的存储形式:
- lpush key value; 在 key 对应 list 的头部添加字符串元素;
- 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场景设计搞清楚了,需要掌握的都在这了相关推荐
- Sketchup插件Vray户外场景设计渲染教程 Vray Next For Sketchup Exterior
Sketchup户外场景设计的Vray Next 你会学到什么 渲染白天和夜晚场景 后期制作 Sketchup的Vray Next 中级sketchup用户 大小解压后:3.83G 1280X720 ...
- 阿里JAVA面试题剖析:一般实现分布式锁都有哪些方式?使用 Redis 如何设计分布式锁?...
面试原题 一般实现分布式锁都有哪些方式?使用 redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高? 面试官心理分析 其实一般问问题,都是这么问的,先 ...
- Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理
基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...
- 【作者面对面问答】包邮送《Redis 5设计与源码分析》5本
墨墨导读:本文节选自<Redis 5设计与源码分析>,主要为读者分析Redis高性能内幕,重点从源码层次讲解了Redis事件模型,网络IO事件重在使用IO复用模型,时间事件重在限制最大执行 ...
- python文本框与数据库的关联_Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理...
基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3. ...
- 【8. Redis 的设计、实现】
Redis 的设计.实现 数据结构和内部编码 数据结构和内部编码 type命令 type 命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符 串)hash(哈希).list(列表) ...
- 终于有人把标签设计讲明白了
导读:标签是根据业务场景的需求,通过对目标对象(含静态.动态特性)运用抽象.归纳.推理等算法得到的高度精练的特征标识,用于差异化管理与决策. 作者:华为公司数据管理部 来源:大数据DT(ID:hzda ...
- 新书推荐 |《Redis 5设计与源码分析》
新书推荐 <Redis 5设计与源码分析> 点击上图了解及购买 好未来.滴滴.百度等公司专家联合撰写,掌握Redis 5设计与命令实现,透彻掌握分布式缓存. 编辑推荐 多名专家联袂推荐,资 ...
- 一个简单的字符串,为什么 Redis 要设计的如此特别
一个简单的字符串,为什么 Redis 要设计的如此特别 五种基本数据类型之字符串对象 二进制安全字符串 什么是二进制安全的字符串 sds 空间分配策略 空间预分配 惰性空间释放 sds 和 C 语言字 ...
最新文章
- error D8021 :无效的数值参数“/Wno-cpp” cython_bbox
- java 很垃圾_JAVA吧真的很垃圾!!!
- 小麦亩产一千八(jzoj 3461)
- Python基础-闭包
- js中变量作用域的小理解
- 读取excel并将其转换为xml
- xp系统如何更改计算机用户名,xp用administrator_XP系统修改administrator的用户名_xpadministrator...
- MySQL:Can't create test file XXX.lowe-test
- google 搜索接口
- eating的中文意思_eating是什么意思
- Windows10下如何创建VHDX(VHD)格式的虚拟硬盘文件
- 如何用 Java 对 PDF 文件进行电子签章
- sql server 添加表注释、字段注释
- 《Microsoft SQL Server入门教程》第03篇 示例数据库和示例表
- centos离线配置yun源
- Qt MSVC 2017 32bit 编译出现“error: C2131: 表达式的计算结果不是常数”错误
- 基于ELK的日志系统最佳实践
- 2021年职场百态:半数互联网人被迫内卷下,年轻人开始青睐“铁饭碗”
- PX4报错FAILED: external/Stamp/sitl_gazebo/sitl_gazebo-configure解决
- Windows 任务计划程序定时执行 powershell 脚本
热门文章
- mysql group_concat null_MySQL教程之concat以及group_concat的用法
- Linux-windows10下安装Ubuntu
- 计算机对民间音乐,《中国民间歌曲》
- java最小子串覆盖_LeetCode 76. 最小覆盖子串
- 线性代数知识点总结_[Github项目推荐] 机器学习amp; Python 知识点速查表
- erp无线架设服务器,erp数据库架设在云服务器上
- php io操作,lua 的io操作,非常详细
- redis发布与订阅
- C# 知识点笔记:IEnumerable的使用,利用反射动态调用方法
- 老李分享:持续集成学好jenkins之Git和Maven配置