自己做菠菜网站,义乌做网站的,知页wordpress,湖南人文科技学院王牌专业目录
前言#xff1a;
核心全局命令
key过期实现方式
定时器实现方式
基于优先级队列/堆
redis特性
redis优点
redis单线程模型
redis单线程为什么效率这么高#xff1f;
核心五种数据类型内部编码方式 前言#xff1a; redis作为当前主流的内存数据库#xff08…目录
前言
核心全局命令
key过期实现方式
定时器实现方式
基于优先级队列/堆
redis特性
redis优点
redis单线程模型
redis单线程为什么效率这么高
核心五种数据类型内部编码方式 前言 redis作为当前主流的内存数据库NoSQL它是以键值对格式存储数据key-value相比于MySQL它具有更加快速访问数据的能力。同时redis在分布式系统中也有自己的一番作为redis的主从复制哨兵模式等等。redis也可以作为缓存解决数据库访问压力等等一些用武之地。
核心全局命令
1keys patten模式 一个字符*任意多个字符[abc]固定选项 [a - b]范围 [^a]排除a字符。时间复杂度ON
2exists key [key ...] 后可以写多个key返回存在key的个数。时间复杂度O1
3del key [key ...] 删除指定key返回删掉key的个数。时间复杂度O1
4expire key seconds秒 指定key设置过期时间。1设置成功0设置失败。时间复杂度O1
5ttl keytime to live 查询key剩余过期时间。-1没有关联过期时间-2key不存在。时间复杂度O1
6pexpire key 毫秒 设置key过期时间单位毫秒
7pttl key 查询key剩余过期时间单位毫秒
8type key 返回key对应数据类型。时间复杂度O1
key过期实现方式
1定期删除 每次抽取一部分key遍历进行验证过期时间。保证抽取检查的时间足够快。redis单线程处理命令防止阻塞
2惰性删除 如果key已经过期了但还没有删除。当使用这个key的时候就会触发key的删除操作。
注意 虽然redis将上述两种策略结合但还会有少量过期key没有被删除。redis补充上述问题还提供了一系列内存淘汰策略。
定时器实现方式
基于优先级队列/堆 队首元素为时间最小的任务扫描线程扫描队首元素。扫描也不能太频繁第一次扫描就计算出时间差然后扫描线程等待即可。 如果扫描线程等待过程中又有更小的任务更新到队首呢在新任务添加的时候唤醒一下线程重新检查队首元素。
redis特性
1内存中存储数据以键值对方式存储
2支持lua脚本批量操作redis。
3可扩展。通过使用适合的Redis扩展可以更好地利用Redis的潜力构建高性能和可靠的应用程序。
4支持持久化内存数据进行持久化操作RDBAOF混合持久化
5支持集群可以水平扩展类似mysql “分库分表”操作
6高可用。 Redis支持主从复制Master-Slave Replication和哨兵机制Sentinel以提供数据的高可用性和容错能力。通过配置主从复制和哨兵节点Redis可以实现自动故障恢复和故障转移。
redis优点
redis主要优点就是快。
1内存中存储数据。
2核心功能就是比较简单的逻辑操作快。
3网络角度redis使用了IO多路复用的方式。
4redis使用的是单线程模型减少了不必要的线程竞争开销高版本支持多线程也只是在网络IO处理
redis单线程模型
1redis只使用一个线程处理所有命令请求网络IO这里使用的是多线程。
2redis能够使用单线程很好的工作原因主要在于redis的核心业务逻辑都是短平快的。不太消耗cpu。
redis单线程为什么效率这么高
1redis操作内存数据库访问硬盘两者的访问效率不在一个量级上。
2redis核心功能比数据库核心功能更简单。
3单线程模型避免了不必要的线程竞争开销。
4处理网络IO使用epoll这样的IO多路复用。 IO多路复用一个线程管理多个socket在等待socket的同时处理别的socket。核心同一时刻只有少数socket是活跃的每一个socket使用线程并不是持续的 epoll事件通知/回调机制当对应socket处理完成之后socket主动通知该线程
核心五种数据类型内部编码方式
1string raw原生字符串类型字符串比较长的时候 int当value值为整数的时候 embstr字符串长度比较短的时候
2hash hashtable正常hash表hash表数据比较多的时候 ziplist压缩列表重新编码可以节省空间每个hash数据都不大的时候节省空间
3list linkedlist正常的双向链表 ziplist同上 quicklistredis3.2之后引入的结合了上述两种数据结构的特点并且取代了它们。链表的每个节点数据类型都是ziplist
4set hashtable正常hash表 intset集合中存储的都是整数
5zset skiplist跳表也是链表。每个节点上有多个指针域。巧妙的搭配这些指针域就可以做到在跳表上查询数据时间复杂度O(logN) ziplist同上
注意 object encoding key查询key对应value的实际编码方式。