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

相关推荐
运维小文4 分钟前
服务器硬件介绍
运维·服务器·计算机网络·缓存·硬件架构
李少兄14 分钟前
解决Spring Boot整合Redis时的连接问题
spring boot·redis·后端
日里安31 分钟前
8. 基于 Redis 实现限流
数据库·redis·缓存
EasyCVR1 小时前
ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案
服务器·网络·数据库·音视频
Elastic 中国社区官方博客1 小时前
使用真实 Elasticsearch 进行更快的集成测试
大数据·运维·服务器·数据库·elasticsearch·搜索引擎·集成测试
明月与玄武2 小时前
关于性能测试:数据库的 SQL 性能优化实战
数据库·sql·性能优化
PGCCC3 小时前
【PGCCC】Postgresql 存储设计
数据库·postgresql
PcVue China5 小时前
PcVue + SQL Grid : 释放数据的无限潜力
大数据·服务器·数据库·sql·科技·安全·oracle
魔道不误砍柴功7 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
jerry6097 小时前
7天用Go从零实现分布式缓存GeeCache(改进)(未完待续)
分布式·缓存·golang