redis
2024-07-05 21:25:46 2 举报
AI智能生成
redis
作者其他创作
大纲/内容
redis为什么快
在网络层面redis采用了多路复用的设计,提升了并发处理的连接数,在6.0以前server端所有IO操作都是同一个主线程来处理的,6.0以后增加了多线程处理,优化了io的能力,不过具体的数据操作仍然由主线程处理,,对数据的处理依然是单线程的
从cpu层面 如果采用多线程那么需要同步的方式来保证线程的安全,反而影响redis性能
redis基于内存,内存的操作速度快
redis底层数据结构是一个哈希表
redis集群模式有哪些
主从模式
哨兵模式
哨兵模式在主从模式基础上加哨兵节点监控主从服务器,,当主节点发生故障时,哨兵节点会自动从从节点中选取出一个新的主节点,并通知其它从节点和客户端实现故障转移
cluster模式
通过数据分片实现负载均衡和高可用模式,redis将多个数据分布在不同的节点上,,每个节点负责一部分数据,称为槽位,,通过数据分片实现更大规模的存储
redis支持的数据类型和应用场景
String
计算器
整型(int)
embstr编码的简单动态字符串
C语言字符串的缺陷 获取字符串长度是0(n) 除了字符串末尾以外 字符串不能够含有"\0"字符串 不能保存图片 音频 视频等二进制数据,c语言字符串操作函数不是很安全,稍微不注意就容易缓冲区溢出
raw编码的简单动态字符串
字符串长度超过45时为该类型
hash
电商购物车
hset hincrby hlen hdel hgetall
哈希表
用一个字典表示2个hash表来进行rehash扩容
压缩表
list
微博微信信息流
lpush rpush lpop rpop lrange key start stop blpop brpop (如果没有数据阻塞等待 可以设置等待时间 设置为0 一直等待)
可用实现栈,队列阻塞队列
双端链表
压缩表
set
抽奖 点赞,关注 共同关注
sadd srem smembers scard sismember sdiff sinter sunion
整型的数组集合
哈希表
zset
排行榜
有可能用压缩列表(0(N))有可能用跳表(0Log(N) 跳表是在链表上面加了冗余的索引层
子主题
redis的持久化机制
RDB
在指定的时间内间隔内,把内存的数据集快照写入磁盘,二进制压缩文件执行bgslave命令触发异步快照,执行sava同步快照会阻塞客户端的运行
优点恢复大数集数据比aof快
AOF
记录服务器接收到的所有写操作命令并且把这些命令追加到文件里面持久化到磁盘
更加稳定数据的完整性更好
redis的过期策略
惰性过期策略
当redis访问的时候才会去判断是否过期,过期则删除 缺点占用内存
定时过期策略
redis每隔一段时间随机检查设计过期时间的键
redis内存淘汰策略
lru 最近最少使用
volatile-ttl (根据过期时间优先)
优先删除过期时间最短的
volatile-random (设置过期时间的随机删除)
allkeys-lru (从所有键中选择最近最少使用的)
allkeys-random (全局随机删除)
如何解决redis和数据库数据不一致问题
redis和数据库只能保证最终一致性 可用通过cannel等来做,高并发下无论先更新后删除 还是更新后更新缓存 都会有不一致情况,一般公司选择先更新数据库再删除缓存
redis主从复制原理
全量复制
slave服务器连接maste并发送sync命令,master收到命令后会生成数据快照,然后把数据快照发送给slave节点,slave节点在收到数据后丢弃旧的数据并且重新载入新的数据
增量复制
master收到数据变更后,会把变更的数据同步给slave节点,maste和slave都会维护一个复制偏移量,用来表示master向slave传递的字节数量
AOF重写机制
首页根据当前redis的内存数据重新构建一个新的AOF文件,,然后读取当前数据写入到新的AOF文件中,,重写完成后去覆盖现有的AOF文件,,redis会根据键值的数据再去生成对应的新的指令,,这样比较耗着redis会放在子进程处理,,主进程数据变化会追加到AOF的重写缓冲区里面,等待AOF重写完成后再把AOF重写缓冲区里面的数据追加到AOF文件中
redis事务支持ACID特性吗
redis是支持事务的
multi
开启一个事务,multi执行后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是放到一个队列中
exec
执行队列中的所有命令
discard
中断当前事务,然后清空事务队列并放弃执行事务
watch key1 key2
监视一个或者多个key ,如果在事务执行之前执行这个,当对其监视key有修改,那么事务将被会打断
开启multi命令后,命令语法导致执行错误会放弃当前所有队列中的命令
开启multi命令后,命令逻辑执行错误,会主动忽略报错语句,继续执行后面语句
原子性
redis事务保证队列中命令作为一个整体 要么全部执行,要么全部不执行,但如果因为命令逻辑错误而执行失败,会继续执行后面的操作,而不会回滚
无隔离级别
redis rehash
redis的哈希表满足一定条件后会进行扩缩容,一次rehash可能导致服务器出现阻塞并且停止对外服务,redis利用渐进式rehash,redis字典数据是使用2个哈希表来实现的,并且还利用rehashidx字段来记录当前rrehash操作的下标位置
select poll和epoll区别
select调用时内核需要遍历整个位图,检查每个文件描述符是否就绪,这种轮询方式在连接很少时很有效 当连接数量增加时性能就会降低,由于使用位图来保存描述符还有数量的限制一般支持2048个 select跨平台性比较好
poll使用链表来表示文件描述符的状态没有最大连接数的限制和select 一样需要轮询来获取就绪的描述符,因此随着监视的描述符数量增长其效率也会降低
epoll使用事件驱动模型没有数量限制,他将文件描述符添加到epoll事件集合中,等待事件的发生,他与select poll不同时epoll不需要轮询,他使用回调的方式只关注真正发生的事件描述符,epoll适合连接数较多大规模并发场景下
redis分布式锁
如何保证redis分布式锁可重入
0 条评论
下一页