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

相关推荐
vvvae12347 小时前
分布式数据库
数据库
雪域迷影7 小时前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
bug菌¹8 小时前
滚雪球学Oracle[4.2讲]:PL/SQL基础语法
数据库·oracle
逸巽散人8 小时前
SQL基础教程
数据库·sql·oracle
月空MoonSky9 小时前
Oracle中TRUNC()函数详解
数据库·sql·oracle
momo小菜pa9 小时前
【MySQL 06】表的增删查改
数据库·mysql
向上的车轮10 小时前
Django学习笔记二:数据库操作详解
数据库·django
编程老船长10 小时前
第26章 Java操作Mongodb实现数据持久化
数据库·后端·mongodb
全栈师10 小时前
SQL Server中关于个性化需求批量删除表的做法
数据库·oracle
Data 31711 小时前
Hive数仓操作(十七)
大数据·数据库·数据仓库·hive·hadoop