Redis
2021-08-17 22:14:31 0 举报
Redis学习笔记
作者其他创作
大纲/内容
NIO-同步非阻塞-多路复用-epoll
client
网络请求会先到达操作系统内核
huenhui
Redisbitmap
0
list_value
交集、并集、差集
数值
fd 8
fd 9
链表
Redis 事务
3
kafka
sorted_set
手机
线程/进程
系统调用epoll
布隆过滤器的三种使用方式
一个socket就是一个文件描述符
映射函数
权重/聚合指令(平均、最大、最小)
JVM 是C语言写的
男
10个人,3个奖品,不可重复把10个人存入set--srandmember key 3
匹配成功正确标记
yum install man man-pages在linux安装,可查看帮助文档man lsman 2 readman 2 socketman 2 selectman 2 mmapman epoll
问题用户态和内核态之间,用户态有自己的内存空间,内核态也有自己的内存空间,系统调用过程中,fd需要来回拷贝
映射函数1、2、3
问题促使进步
红黑树
1
耳机数据库没有的数据
官方介绍: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)。
DB微服务
早期BIO模型
精准调用fd
type含义:value的类型命令:type k1
场景:排行榜
消费
手机数据库有的数据
select
read
skip list跳跃表
kernel
Set
每种映射方式得到的结果在bitmap中都为1,但实际数据库没有此类数据。说明此次请求映射恰好被布隆过滤器误加载,导致【少量请求缓存穿透】。查询数据库,没有,则在缓存层加一个空,下次再请求就被拦在了缓存,不会在穿透至数据库
read fd9
MySQL
sub2
排序是怎么实现的
b
无序去重
一:1先2后则1中get能获取到元素二:2先1后则1中get获取不到元素
集合操作并集、交集
问题如果有1000个fd,代表用户进程轮训调用1000次kernel用户态与内核态切换,成本很大
epoll
问题1. 线程多了,cpu调度成本变大2. 每个线程栈都是需要内存的,线程多了,内存成本变大
-2
物理内存:左小右大且不随命令发生变化所以反向指针和rev逆转是不同的
select(1000个fd)
平板电脑数据库没有的数据
用户收发消息的模型
Redis
查看更早期的聊天
-3
Redis负责发布订阅
-1
随机事件
操作系统内核发生变化出现select系统调用,把轮训放在了内核空间
根据映射函数,得到的结果在bitmap中不全是1,说明数据库中不存在此类数据,及【缓存穿透】使用布隆过滤器==》可以避免这种请求访问到数据库
2:exec
笔记本电脑
操作系统内核发生变化出现mmap
client2
生产
查看近三天聊天
1:mult
布隆过滤器 https://github.com/RedisBloom/RedisBloom过滤器选型: 布隆过滤器:Bloom Filter 增强版:Counting Bloom Filter 布谷鸟过滤器:Cuckoo Filter布隆过滤器特点: 1.概率解决缓存穿透问题,不能百分百解决 2.请求的数据可能被误标记,导致穿透,但一定程度上可以大量减少穿透 3.成本很低
每种映射方式得到的结果在bitmap中都为1,说明数据库有此类数据缓存中没有此类数据,则去数据库查此类数据,在加到缓存中
三种订阅者1.用户客户端,直接将新消息展示在界面2.另一台Redis实例,将消息保存在sorted_set供查询近期数据3.一个微服务项目,将消息发送至kafka,异步处理消息保存入库
微服务
现状socket是阻塞的,调用read会被阻塞,只有在读到数据后,程序才能继续运行,所以每个fd都要用一个线程处理
Client实现bloom算法
Redis模型介绍
spop key弹出一个
d
Hash
共享空间
Client
现状首先select系统调用,将所有fd传过去,会标记哪些fd数据已到达,在轮训调用read,只对数据到达的fd操作,减少无用调用
阻塞 单播订阅
123
Client实现bloom算法承载bitmap
bitmap
3个人,10个奖品,可以重复把3个人存入set--srandmember key -10
Redis 五种基本数据类型的使用
MySQL数据库存储全量数据
2
key
hash_value
name
List
返回可读/可写的fd
mmap
操作系统内核发生变化出现非阻塞socket(SOCK_NONBLOCK)
read fd8
Redisbloom modulebitmap
智能穿戴设备
场景:
list 双向链表,且有头尾指针
24
head
age
Sorted Set
sub3
匹配成功误标记
NIO-同步非阻塞-多路复用
现状socket是非阻塞的,调用read不会被阻塞,这样的话就可以用一个线程,死循环调用read,如果没有数据,就调用下一个,如果有数据就去处理
redis 支持正反向索引(所有类型)
client胡恩会
read fd8read fd9
现状使用共享空间,避免用户态与内核态中的数据拷贝
kernel 内核
2:del k1
abc
Redis 发布订阅
String_value
Redis单线程接收用户请求
redis_6379
pub
布隆过滤器
client刘鹤
NIO-同步非阻塞
轮训发生在内核空间同步:取出和处理都由该线程自己完成,所以是同步
encoding含义:value的编码命令:object encoding k1
Linux
sub1查看实时聊天
1:exec
-4
a
轮训发生在用户空间同步:取出和处理都由该线程自己完成,所以是同步
key是字符串value有五种类型
索引下标 【数组】
Redis是单线程接收用户请求的,所以不存在并发情况如果接收到开启事务命令,则会把事务中的一系列命令放到队列中,谁先发送exec提交,先执行谁WATCH:(check-and-set (CAS))-乐观锁,WATCH命令可以监控一个或多个key,对键的监视从 WATCH 执行之后开始生效, 直到调用 EXEC 为止。在事务执行exec时,如果该key的数据被修改过,则该事务不会被执行 DISCARD: 通过调用 DISCARD , 客户端可以清空事务队列, 并放弃执行事务
左进右出、右进左出 【队列】
io的发展历程--系统内核(kernel)的演进
sex
client1
redis_6380单进程、单线程、单实例(使用同步非阻塞的多路复用NIO)并发(很多请求)的时候,是如何变得很快的呢?内存快,io慢,使用epoll共享空间
字符串
tail
c
左进左出、右进右出 【栈】
1.把已有的数据加载到布隆过滤器中BF.ADD productFilter 笔记本电脑BF.ADD productFilter 智能穿戴设备BF.ADD productFilter 手机
String
2.判断请求数据是否存在于过滤器中BF.EXISTS productFilter 手机BF.EXISTS productFilter 平板电脑BF.EXISTS productFilter 耳机
srandmember key countcount为正数:取出一个去重的结果集(不能超过全部集合长度)count为负数:取出一个含重复的结果集
0 条评论
回复 删除
下一页