用过Redis吗,它使用在哪些地方(使用场景)?
1. 用过Redis吗,它使用在哪些地方(使用场景)?
Redis是一种内存型数据库,用作数据库,缓存和消息代理。数据结构简单,读写速度快(毫秒级),原子操作。
适用于: 数据高并发读写、海量数据读写、对扩展性要求高的数据 的场景。
解决应用服务器的CPU和内存压力;
减少IO的读操作,减轻IO的压力;
关系型数据库的扩展性不强,难以改变表结构。
常见应用场景:
-
缓存: 热点数据(读多写少),减轻数据库压力。
-
数据共享: 分布式会话session
-
排行榜: 谁得分高谁排名往上。命令:ZADD(有续集,sorted set)
-
限时业务: 秒杀 存储登录者用户信息 存储短信验证码
-
分布式锁: 单独的服务,原子性(单线程)
参考 java分布式锁终极解决方案之 redisson -
最新列表
List结构,LPUSH可以在列表头部插入一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去到对应的内容页即可。Redis查询不到key,再MySQL查询 -
队列(消息队列)
消息队列是大型网站必用中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。如果对于数据一致性要求高的话还是用RocketMQ等专业系统。由于redis把数据添加到队列是返回添加元素在队列的第几位,所以可以做判断用户是第几个访问这种业务;队列不仅可以把并发请求变成串行,并且还可以做队列或者栈使用。
-
计数器: 统计点击数等 int类型,incrby(incr)命令,利用原子性(单线程,可以避免并发问题),性能好100%毫秒级
浏览量(电商)、点赞数、收藏数、播放量、签到打卡、 -
限流: int类型,incrby(incr)命令
以访问者的ip和其他信息作为key,访问一次增加一次计数,超过次数则返回false -
时间轴(Timeline): 与最新列表场景类似
-
位统计(大数据处理): String类型的bitcount(1.6.6的bitmap数据结构介绍)
字符是以8位二进制存储的
set k1 a
setbit k1 6 1
setbit k1 7 0
get k1
/**
6 7 代表的a的二进制位的修改
a 对应的ASCII码是97,转换为二进制数据是01100001
b 对应的ASCII码是98,转换为二进制数据是01100010
因为bit非常节省空间(1 MB=8388608 bit),可以用来做大数据量的统计。
*/
参考
使用Redis的bitmaps统计用户留存率、活跃用户
用户日活月活怎么统计 – Redis HyperLogLog 详解
其他场景参考:
redis安装及应用场景
Redis的8大应用场景
Redis 16 个常见使用场景
更多面试题