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