Redis是一种内存型数据库,用作数据库,缓存和消息代理。数据结构简单,读写速度快(毫秒级),原子操作。 适用于: 数据高并发读写、海量数据读写、对扩展性要求高的数据 的场景。
解决应用服务器的CPU和内存压力; 减少IO的读操作,减轻IO的压力; 关系型数据库的扩展性不强,难以改变表结构。
常见应用场景:
- 缓存: 热点数据(读多写少),减轻数据库压力。
- 数据共享: 分布式会话session
- 排行榜: 谁得分高谁排名往上。命令:ZADD(有续集,sorted set)
- 限时业务: 秒杀 存储登录者用户信息 存储短信验证码
- 分布式锁: 单独的服务,原子性(单线程)
- 最新列表 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),可以用来做大数据量的统计。
*/
\