Redis前无古人后无来者
2022-03-19 14:22:21 1 举报
对Redis的由浅入深的理解
作者其他创作
大纲/内容
计算向数据移动
线程/进程
c
B+T
介绍
8x
多少颗cpu启动多少个进程worker
更老的数据
不支持拉链只有一个dump.rdb
client
sendfile
RDB
1
8:00 8:30
mmap
yum install man man-pagessocketfd nonblock同步非阻塞 NIO如果有1000fd代表用户进程轮询调用1000次kernel成本问题
List
映射函数
最终也是一个纯指令的日志文件
架构师
如果开启了AOF只会用AOF恢复
value
实时性的
b
key
B
缓存常见问题:击穿雪崩穿透一致性(双写)技术是易与人的使用!理论是极其复杂!
过期判定原理:1,被动访问时判定2,周期轮询判定(增量)*,目的,稍微牺牲下内存,但是保住了redis性能为王!!!!
fd 9
链表
查询就有可能被过滤掉
0
redis中,RDB和AOF可以同时开启
redis全网最权威的讲解
redis: fork()
https://db-engines.com/en/架构师:技术选型技术对比
read fd8read fd9
geo
集合操作相当多
正反向索引
type:value
元素2
内存
x11
data page4k
JVM c
存储层:1,快照/副本2,日志
SAPHANA内存级别的关系型数据库2T
fd 8
kafka
b=46
file.txt
4.0以后
时点性
redis
明确:比如,关机维护
String
数据在磁盘和内存体积不一样
1,会随着访问延长?不对!!2,发生写,会剔除过期时间3,倒计时,且,redis不能延长4,定时5,业务逻辑自己补全
x3
丢失数据少
安装
fd3
read fd9
x22
sub
setgetappendsetrangegetrangestrlen
文件里数据data.txtgrepawkjava随着文件变大,速度变慢为什么硬盘i/o成为瓶颈
client实现bloom算法自己承载bitmap
setbit k1 1 1setbit k1 7 1setbit k1 9 1字符集 ascii其他一般叫做扩展字符集扩展: 其他字符集不在对ascii重编码0xxxxxxx你自己写一个程序,字节流读取,每字节判断
1:exec
client1
cpu只有1颗JVM: 一个线程的成本 1MB1,线程多了调度成本CPU浪费2,内存成本
9w
磁盘
网卡
数值
redis的写操作记录到文件中
01 02 03 04sean 0 1 0 1 010101json 0 1 0 1 011111每用户46B * 用户数 10000000 =460 000 000
常识:磁盘:1,寻址:ms2,带宽:G/M内存:1,寻址:ns2,带宽:很大秒>毫秒>微秒>纳秒 磁盘比内存在寻址上慢了10W倍I/O buffer:成本问题磁盘与磁道,扇区,一扇区 512Byte带来一个成本变大:索引4K 操作系统,无论你读多少,都是最少4k从磁盘拿
read(fd3)
fork创建子进程
redisbitmap
物理内存左小右大不随命令发生变化zrangzrevrang
A
a=3
数据库:表很大,性能下降?如果表有索引增删改变慢查询速度呢?1,1个或少量查询依然很快2,并发大的时候会受硬盘带宽影响速度
-2
read(fd)
nil
对field进行数值计算场景:点赞,收藏,详情页
setbitbitcountbitposbitop
管道:1,衔接,前一个命令的输出作为后一个命令的输入2,管道会触发创建【子进程】echo $$ | moreecho $BASHPID | more$$ 高于 |
a3
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)。
缓存常见问题,面试回答思路
bitmap
0 1 2 3 4 5 6 7 8 9 10 11
x45
3天之内
b=4
2:exec
权重/聚合指令
fd4
队列反向命令
轮询发生在用户空间
1:mutli
redis作为数据库/缓存的区别缓存!!!!
单机自己:持久化
删除抵消的命令合并重复的命令
forkcow8点创建子进程父子进程对数据的修改,对方看不到
业务运转
save 900 1save 300 10save 60 10000dbfilename dump.rdbdir /var/lib/redis/6379
V
redis缓存解决数据的读请求快
元素1
write (fd4)
http://download.redis.io/releases/redis-5.0.5.tar.gz
lists
kernel
hashmap(k-v)
rediszset
插曲
配置文件中给出bgsave的规则: save这个标识
弊端,体量无线变大》 恢复慢
Set
AOF是一个混合体利用了RDB的快利用了日志的全量
AOF中包含RDB全量,增加记录新的写操作
业务逻辑
共享空间
epoll
抢购,秒杀,详情页,点赞,评论规避并发下,对数据库的事务操作完全由redis内存操作代替
incr
-1
client连接
kafkajvm
head
内存是有限随着访问的变化,应该淘汰掉冷数据
redis里的数据怎么能随着业务变化,只保留热数据,因为内存大小式有限的,也就是瓶颈
1,穿透了,不存在2,client,增加redis中的key,value标记3,数据库增加了元素5,完成元素对bloom的添加
2:del k1
StringByte
redis运行了10年开启了AOF10年头,redis挂了1,AOF多大:很大,10T*,恢复,会不会溢出2,恢复要多久:恢复用5年
内存多大呢?maxmemory <bytes>maxmemory-policy noevictionLFU 碰了多少次LRU 多久没碰他
集群
计算解析json
a=38
2:mutli
元素3
select
nginx
1:get k1
rediszookeeperES2到3周
select (1000fds)
x7
将老的数据RDB到aof文件中将增量的以指令的方式Append到AOF
centos 6.xredis 官网5.x
缓存数据不重要不是全量数据缓存应该随着访问变化热数据
redis进阶使用
主从复制
消费者
01000000
redis单进程
create epfd
spop取出1个
redis作为缓存
分值
h
tail
0100 0010
db.filea=3b=6时点混乱!
sorted_set
随机事件
bitmaps
hashes
4.0以前
爱做不做。。。过滤器:bloom布隆过滤器counting bloomcukcoo布谷鸟过滤器
stream
service
概率解决问题不可能百分百阻挡>1%1,你有啥2,有的向bitmap中标记3,请求的可能被误标记4,但是,一定概率会大量减少放行:穿透5,而且,成本低
fork()
重写
【无序】&&【随机性】放入的多少不同,元素存储的顺序不同去重
苹果
字符类型
数组
value没有类型的概念
copy on write:内核机制写时复制创建子进程并不发生复制创建进程变快了根据经验,不可能父子进程把所有数据都改一遍玩的是指针
db.file8:00
想让他们怎排序?名称含糖量大小价格吃货热度
原点:redis是内存数据库
索引
hdfs,fsimage+edits.log让日志只记录增量合并的过程
抽奖:10个奖品用户: <10 >10中将:是否重复解决家庭争斗!
折中缓存memcachedredis2个基础设施1,冯诺依曼体系的硬件2,以太网,tcp/ip的网络
client实现bloom算法
AOF
skip list跳跃表
kernel fd8 buffer
Mysql
5V场景
SRANDMEMBER key count正数:取出一个去重的结果集(不能超过已有集)负数:取出一个带重复的结果集,一定满足你要的数量如果:0,不返回
排序是怎么实现的增删改查的速度?
redis:6379
encoding
memcachedkey,value
appendonly yesappendfilename \"appendonly.aof\"auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbappendfsync alwaysappendfsync everysecappendfsync no
自学先宽,后深花钱老师具备 先宽后深说的出来
db.filea=3b=4时点正确8
redis:6380
1,速度:快2,空间:小
香蕉
2-1
日志,优点如果能保住,还是可以用的结果:设计一个方案让日志,AOF足够小
把你有的添加进去
数值类型
缓存:数据可以丢 急速!数据库:数据绝对不能丢的 速度+持久性掉电易失!redis+mysql 》 数据库 《 不太对
类型不是很重要redis的server中对每种类型都有自己的方法index()lpop
红黑树
2,京东就是你们的,618做活动:送礼物大库备货多少礼物假设京东有2E用户僵尸用户冷热用户/忠诚用户活跃用户统计!随即窗口比如说 1号~3号 连续登录要 去重setbit 20190101 1 1setbit 20190102 1 1setbit 20190102 7 1bitop or destkey 20190101 20190102BITCOUNT destkey 0 -1
插曲因为socket在这个时期是blockingBIO
鸭梨
元素
bgsave
复制
redis的持久化
save
ref:2
创建子进程的速度应该是什么程度如果父进程是redis,内存数据比如10G1,速度2,内存空间够不够
file
发布订阅
l
2
弊端
阻塞,单播队列FIFO
pub
linux
ctl add del sfdwait()
sets
1-2
kernel的epoll同步,非阻塞多路复用
sorted sets
栈同向命令
多路复用NIO用户态内核态fd相关数据考来考去
1:watch k1
DBservice
redisbloom.sobitmap
key的有效期
集合操作并集,交集
优点:类似java中的序列化恢复的速度相对快
client2
u1 u2 u3 20190101 0 1 0 00010020190102 1 1 0 10101
0-3
0100 0001
二进制 安全字节流*字符流
布隆过滤器HyperLogLog
随机 造层3类 平衡树平均值先对最优
单进程,单线程,单实例并发很多的请求如何变得很快的呢?
a
持久化
数据库全量
关系型数据库建表:必须给出schema类型:字节宽度存:倾向于行级存储
历史性
e
使用linux的时候:父子进程父进程的数据,子进程可不可以看得到?常规思想,进程是数据隔离的!进阶思想,父进程其实可以让子进程看到数据!linux中export的环境变量,子进程的修改不会破坏父进程父进程的修改也不会破坏子进程
read fd8
写操作会触发IO
丢失数据相对多一些时点与时点之间窗口数据容易丢失8得到一个rdb,9纲要洛一个rdb,挂机了
使用
memcache返回value所有的数据到clientserver 网卡IOclient要有你实现的代码去节码
多路复用NIO
字符串
“顺序”性每连接内的命令顺序
实操:安装 install
收藏
0 条评论
下一页