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

相关推荐
“αβ”6 小时前
MySQL表的操作
linux·网络·数据库·c++·网络协议·mysql·https
p***s916 小时前
Spring数据库原理 之 DataSource
java·数据库·spring
虹科网络安全7 小时前
艾体宝干货 | Redis Java 开发系列#1 从零开始的环境搭建与实践指南
java·数据库·redis
火山引擎开发者社区7 小时前
火山引擎向量数据库 Milvus 版正式商业化:AI 时代的向量检索新标杆
数据库·milvus·火山引擎
神秘的土鸡7 小时前
openEuler 25.09 企业级 MySQL主从复制部署与性能优化实战提升50%
linux·数据库·mysql·性能优化·openeuler
韩立学长7 小时前
基于Springboot课堂教学辅助系统08922bq1(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
菜萝卜子8 小时前
k8s 启动一个redis
redis·容器·kubernetes
goxingman8 小时前
Oracle视图基础
数据库·oracle
serendipity_hky9 小时前
互联网大厂Java面试故事:核心技术栈与场景化业务问题实战解析
java·spring boot·redis·elasticsearch·微服务·消息队列·内容社区