redis初识

目录

前言:

核心全局命令

key过期实现方式

定时器实现方式

基于优先级队列/堆

redis特性

redis优点

redis单线程模型

redis单线程为什么效率这么高?

核心五种数据类型内部编码方式


前言:

    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的实际编码方式。

你可能感兴趣的:(redis,redis,数据库,缓存)