基础常识
磁盘
寻址:ms
带宽: G/M
内存
寻址:ns(纳秒级)
带宽:byte/s
秒>毫秒>微秒>纳秒
磁盘寻址上比内存少了10w倍
I/O BUffer:成本问题
磁盘有磁道和扇区,一个扇区512byte
会造成索引成本增大
因此进行4K对齐,操作系统无论读多少都最少从磁盘里面拿4k出来
数据库的表很大,性能会下降吗?
如果表有索引,
那么对于增删改的操作肯定会变慢
查询速度
如果是1个或者少量查询依然很快
但如果是并发大的时候会受到硬盘带宽的影响,从而影响速度
数据在内存和磁盘中体积不一样
redis出现原因:
内存 ==> 贵
磁盘 ==> 慢
两个基础设施限制:
冯诺依曼体系的硬件制约 ===> 硬盘io带宽问题
以太网,tcp/ip的网络 ===> 不稳定
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
上述数据类型是指value的数据类型
memcache 和redis区别在于,memcache value没有类型
将返回value所有数据到client端,会受到server 网卡IO的限制,而且client要有解码的逻辑
redis因为value有类型,所以对于数据的请求根据不同情况直接调用相应类型方法返回少量数据即可
做到了计算向数据移动
redis是单进程,单线程,单实例的,通过epoll快速处理并发请求
epoll是同步非阻塞的多路复用机制
jvm: 一个线程成本是1MB
线程多了会增加调度成本,从而使CPU浪费,也会增加内存成本
BIO—>NIO(同步非阻塞)—>多路复用—>epoll(引入共享空间避免fd相关数据考来考去)
redis 对不同数据类型不同encoding类型的数值具有不同的方法
key有两个属性:
type标识值的类型
encoding标识值的编码类型
二者决定对值的操作可以使用哪些方法,从而加速计算
String 类型
字符串的相关操作:
set,get,append,setRange,getRange,strlen
适用场景:
使用内存存储的session,对象,小文件
数值的相关操作:
incr,decr
适用场景:
限流,计数
秒杀一般会用数据库
bitmap的相关操作:
setbit, bitcount,bitpos,bittop
使用场景:web, 离线数据
1.用户系统,统计用户登录天数,且窗口随机
key标识用户,每个用户准备365位,每一位表示当天是否登录,登录置一
setbit sean 1 1
setbit sean 7 1
setbit sean 364 1
STRLEN sean ===>46 每个用户只需要46个字节来存储这些信息
BITCOUNT sean -2 -1 计算多少天范围内一共登录了几天
电商做618活动,需要给活跃用户登录后送礼物,请问应该备货多少礼物
假设这里活跃用户统计规则为20220901-20220903三天内登录的用户,三天内只要登录一次就算活跃用户
key标识当天用户登录情况,将用户编号映射到二进制位的相应位置上,每一位二进制代表一位用户是否登录
setbit 20220901 1 1
setbit 20220902 1 1
setbit 20220902 7 1
bittop or destkey 20220901 20220902
bitcount destkey 0 -1存储oa权限信息
- 布隆过滤器,模块调用
List 类型相关操作
按不同放入顺序排列
栈:同向命令
队列:反向命令
数组
阻塞,单播队列
ltrim
使用场景:
数据共享,迁出
无状态
Hash类型
对filed进行数值计算
场景:
点赞,收藏,详情页
聚合场景
Set类型
无序去重集合
元素变多扩容,会触发rehash,造成原顺序颠倒不稳定
集合操作多
随机事件:
RANDMEMBER key count
正数:取出一个去重的结果集(不能超过已有集)
负数:取出一个带重复的结果集,一定满足你要的数量
如果是0,不返回
应用场景:
随机事件==>抽奖:
10个精品,参与人数> 10 时,传正数,得到10个随机不重复值
10个精品,参与人数< 10 时,传负数,得到10个可重复的值
中奖是否重复
Spop 不重复取出一个
推荐系统:
共同好友:交集
推荐好友:差集
Sorted set
排序
物理内存左小右大(根据分值从左到右从小到大)
不随命令发生变化
集合操作(并集,交集)权重、聚合指令
排序是怎么实现的。 ==> skip List 跳跃表
增删改查的速度
场景:
排行榜,
有序事件
评论+分页
redis持久化
持久化意味着性能会下降
两个指标
快照:rdb,恢复的速度快,但缺失的多
日志:aof, ,
满足完整性好,恢复速度变慢,===>采用不同日志策略避免
指令追加造成冗余量比较大 ===> 使用重写
redis 分布式集群
可用性:
单点故障可通过主从主备一变多集群构建镜像,需要同步
强一致性,会破坏使用性
弱一致性,可用性强,但同步一致性低(默认)
最终一致性,使用黑盒可靠集群做中间缓存,保证主从数据最终一致性
数据存储压力问题(装不下),采用分片式集群代理集群,也是一变多,但不需要同步
AkF拆分原则
根据业务划分数据到不同redis实例