当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/137947.html

相关文章:

  • 死锁的典型情况、产生的必要条件和解决方案
  • 日志搞不定?手把手教你如何使用Log4j2
  • 基于Googlenet深度学习网络的交通工具种类识别matlab仿真
  • R语言04-R语言中的列表
  • [Linux]进程概念
  • GEE/PIE遥感大数据处理与应用
  • ● 647. 回文子串 ● 516.最长回文子序列
  • Mysql group by使用示例
  • 淘宝商品详情采集接口item_get-获得淘宝商品详情(可高并发线程)
  • uniapp写公众号h5开发 附件上传 下载功能
  • 机器学习基础09-审查分类算法(基于印第安糖尿病Pima Indians数据集)
  • C++ sort与优先队列排序的区别
  • 【Rust】Rust学习 第十九章高级特征
  • C++ 纯虚函数和虚函数的区别
  • Go中的有限状态机FSM的详细介绍 _
  • Python入门教程 | Python3 基本数据类型
  • STM32移植u8g2玩转oled 用软件iic实现驱动oled
  • C++ 学习系列 -- string 实现
  • C语言小练习(三)
  • 2023 js逆向爬虫 有道翻译 代码
  • 【物联网无线通信技术】NFC从理论到实践(FM17XX)
  • Python爬虫猿人学逆向系列——第六题
  • idea使用tomcat
  • 搭建Tomcat HTTP服务:在Windows上实现外网远程访问的详细配置与设置教程
  • Java学习笔记——继承(包括this,super的使用总结)
  • Android 获取应用sha1和sha256
  • c# 方法参数修饰符(out、ref、in)的区别
  • shell 编写一个带有进度条的程序安装脚本
  • 服务器数据恢复-AIX PV完整镜像方法以及误删LV的数据恢复方案
  • 首席执行官Adam Selipsky解读“亚马逊云科技的技术产品差异化”