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初识
目录 前言: 核心全局命令 key过期实现方式 定时器实现方式 基于优先级队列/堆 redis特性 redis优点 redis单线程模型 redis单线程为什么效率这么高? 核心五种数据类型内部编码方式 前言: redis作为当前主流的内存数据库(…...
死锁的典型情况、产生的必要条件和解决方案
前言 死锁:多个线程同时被阻塞,他们中的一个或全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 目录 前言 一、死锁的三种典型情况 (一)一个线程一把锁 (二)…...
日志搞不定?手把手教你如何使用Log4j2
系列文章目录 从零开始,手把手教你搭建Spring Boot后台工程并说明 Spring框架与SpringBoot的关联与区别 SpringBean生成流程详解 —— 由浅入深(附超精细流程图) Spring监听器用法与原理详解 Spring事务畅谈 —— 由浅入深彻底弄懂 Transactional注解 面试热点详解…...
基于Googlenet深度学习网络的交通工具种类识别matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ....................................................................................% 获…...
R语言04-R语言中的列表
概念 在R语言中,列表(List)是一种复杂的数据结构,用于存储不同类型的元素,包括向量、矩阵、数据框、函数等。列表是一种非常灵活的数据结构,可以将不同类型的数据组合在一起,类似于Python中的字…...
[Linux]进程概念
[Linux]进程概念 文章目录 [Linux]进程概念进程的定义进程和程序的关系Linux下查看进程Linux下通过系统调用获取进程标示符Linux下通过系统调用创建进程-fork函数使用 进程的定义 进程是程序的一个执行实例,是担当分配系统资源(CPU时间,内存…...
GEE/PIE遥感大数据处理与应用
随着航空、航天、近地空间等多个遥感平台的不断发展,近年来遥感技术突飞猛进。由此,遥感数据的空间、时间、光谱分辨率不断提高,数据量也大幅增长,使其越来越具有大数据特征。对于相关研究而言,遥感大数据的出现为其提…...
● 647. 回文子串 ● 516.最长回文子序列
647. 回文子串 class Solution { public:int countSubstrings(string s) {vector<vector<bool>>dp(s.size(),vector<bool>(s.size(),false));int res0;for(int is.size()-1;i>0;i--){for(int ji;j<s.size();j){if(s[i]s[j]){if(j-i<1){res;dp[i][…...
Mysql group by使用示例
文章目录 1. groupby时不能查询*2. 查询出的列必须在group by的条件列中3. group by多个字段,这些字段都有索引也会索引失效,只有group by单个字段索引才能起作用4. having条件必须跟group by相关联5. 用group by做去重6. 使用聚合函数做数量统计7. havi…...
淘宝商品详情采集接口item_get-获得淘宝商品详情(可高并发线程)
获得淘宝商品详情页面数据采集如下: taobao.item_get 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)注册key账号接入secretString是调用密钥api_nameString是API接口名称(包括在请求地址中࿰…...
uniapp写公众号h5开发 附件上传 下载功能
一。 uni-app实现文件上传功能 目前,找到一款第三方插件 文件上传插件地址 https://ext.dcloud.net.cn/plugin?id=1015 将插件下载并导入项目中直接拿来使用,插件市场也有对改插件用法的描述。 用法: 1. 以下代码写于根目录下第一个view顶部或跟在自定义导航栏后面 // 以…...
机器学习基础09-审查分类算法(基于印第安糖尿病Pima Indians数据集)
算法审查是选择合适的机器学习算法的主要方法之一。审查算法前并 不知道哪个算法对问题最有效,必须设计一定的实验进行验证,以找到对问题最有效的算法。本章将学习通过 scikit-learn来审查六种机器学习的分类算法,通过比较算法评估矩阵的结果…...
C++ sort与优先队列排序的区别
int main() {vector<int> data{3, 1, 2};cout << "从小到大排序" << endl;sort(data.begin(), data.end(), std::less<int>());printContainer(data);auto cmp1 [](int x, int y) { return x < y; };sort(data.begin(), data.end(), cmp…...
【Rust】Rust学习 第十九章高级特征
现在我们已经学习了 Rust 编程语言中最常用的部分。在第二十章开始另一个新项目之前,让我们聊聊一些总有一天你会遇上的部分内容。你可以将本章作为不经意间遇到未知的内容时的参考。本章将要学习的功能在一些非常特定的场景下很有用处。虽然很少会碰到它们…...
C++ 纯虚函数和虚函数的区别
在 C 中,虚函数(Virtual Function)和纯虚函数(Pure Virtual Function)都是用于实现多态性的机制,但它们之间有一些关键的不同。 虚函数(Virtual Function) 定义:在基类…...
Go中的有限状态机FSM的详细介绍 _
1、FSM简介 1.1 有限状态机的定义 有限状态机(Finite State Machine,FSM)是一种数学模型,用于描述系统在不同状态下的行为和转移条件。 状态机有三个组成部分:状态(State)、事件(…...
Python入门教程 | Python3 基本数据类型
赋值 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。 等号(ÿ…...
STM32移植u8g2玩转oled 用软件iic实现驱动oled
移植u8g2到stm int fputc(int ch,FILE *f) {ITM_SendChar(ch);return (ch); }void delay_us(uint32_t time) {uint32_t i8*time;while(i--); }uint8_t STM32_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) {//printf("%s:msg %d,arg_int …...
C++ 学习系列 -- string 实现
string是C标准库的重要部分,主要用于字符串处理。这里我们自己实现一个简单版本的 string. 一 思路 string 类中应该包含如下: 1. 类成员变量:char* m_data,利用 char* 指针存放字符串 2. 成员函数: 2.1 size(…...
C语言小练习(三)
🌞 “也许你感觉自己与周遭格格不入,但正是那些你一人度过的时光,让你变得越来越有意思,等有天别人终于注意到你的时候,他们就会发现一个比他们想象中更酷的人。”-《生活大爆炸》 Day03 📝 一.选择题&…...
2023 js逆向爬虫 有道翻译 代码
前置条件:nodejs环境、安装 crypto 和 python3环境 js.js文件: const crypto require("crypto")function decode(resp_data) {g_o ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHlg_n ydsecre…...
【物联网无线通信技术】NFC从理论到实践(FM17XX)
NFC,全称是Near Field Communication,即“近场通信”,也叫“近距离无线通信”。NFC诞生于2004年,是基于RFID非接触式射频识别技术演变而来,由当时的龙头企业NXP(原飞利浦半导体)、诺基亚以及索尼联合发起。NFC采用13.5…...
Python爬虫猿人学逆向系列——第六题
题目:采集全部5页的彩票数据,计算全部中奖的总金额(包含一、二、三等奖) 地址:https://match.yuanrenxue.cn/match/6 本题比较简单,只是容易踩坑。话不多说请看分析。 两个参数,一个m一个f&…...
idea使用tomcat
1. 建立javaweb项目 2. /WEB-INF/web.xml项目配置文件 如果javaweb项目 先建立项目,然后在项目上添加框架支持,选择javaee 3. 项目结构 4.执行测试:...
搭建Tomcat HTTP服务:在Windows上实现外网远程访问的详细配置与设置教程
文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器,不仅名字很有趣࿰…...
Java学习笔记——继承(包括this,super的使用总结)
继承: 使用情景:当类与类之间,存在相同(共性)的内容,并满足子类是父类的一种,就可以考虑使用继承,来优化代码 Java中提供一个关键字extends,用这个关键字,我…...
Android 获取应用sha1和sha256
在 Android 应用开发中,SHA-1(Secure Hash Algorithm 1)值是一种哈希算法,常用于生成应用的数字签名。这个数字签名用于验证应用的身份,并确保应用在发布到设备上时没有被篡改。 以下是生成 Android 应用的 SHA-1 值的…...
c# 方法参数修饰符(out、ref、in)的区别
在C#中,ref、out和in是三种方法参数修饰符,它们在传递参数的方式和作用上有所不同。 ref修饰符: 传递方式:使用ref修饰符的参数可以是输入输出参数,即在方法调用前后都可以对其进行修改。 作用:通过ref修…...
shell 编写一个带有进度条的程序安装脚本
需求 使用 shell 写一个 软件安装脚本,带有进度条 示例 #!/bin/bash# 模拟软件安装的步骤列表 steps("解压文件" "安装依赖" "配置设置" "复制文件" "")# 计算总步骤数 total_steps${#steps[]}# 安装进度的初…...
服务器数据恢复-AIX PV完整镜像方法以及误删LV的数据恢复方案
AIX中的PV相当于物理磁盘(针对于存储来说,PV相当于存储映射过来的卷;针对操作系统来说,PV相当于物理硬盘),若干个PV组成一个VG,AIX可以将容量不同的存储空间组合起来统一分配。AIX把同一个VG的所…...
深圳的网站建设公司/上海不限关键词优化
1. 问题描述 双色球中,红色球选号规则:红色球可以在1-33个编号中任意选择6个。 问题:红色球全部选中的概率为多少? 2. 代码: package v1ch03.BigIntegerTest;import java.math.*; import java.util.*;/*** This pr…...
网站搜索排名优化怎么做/网络营销推广方法十种
2019独角兽企业重金招聘Python工程师标准>>> Linux mmseg 同义词/复合分词处理: 其基本使用状况为: 词库包含: 南京西路、南京、西路 索引时: 文本中的“南京西路”会被同时索引为以上三者 查询时: 输入南京…...
how to use wordpress ninja forms/2022适合小学生的简短新闻
随着新一轮的信息技术与社会经济的大融合,大数据正日渐成为社会发展的战略性资源,互联网产业也已渗入到社会经济发展的方方面面,成为重塑创新体系和激发创新活力的驱动力量。 在刚刚结束的河西建邺信息服务业暨产业互联网峰会上,南…...
广州一起做网站/中国科技新闻网
这是一种可以创建多线程消息的函数 使用方法:1,首先创建一个Handler对象 Handler handlernew Handler(); 2,然后创建一个Runnable对象 Runnable runnablenew Runnable(){ Override public void run() { // TODO Auto-generated met…...
广东商城网站建设报价/海外网络推广服务
ZOJ Problem Set - 3829Known Notation(贪心) 题目链接 题目大意:给你一个后缀表达式(仅仅有数字和符号),可是这个后缀表达式的空格不幸丢失,如今给你一个这种后缀表达式,问最少须要…...
网站访问统计js代码/app推广平台网站
相信初学者在学习Python的过程中,不可避免的总会遇到 if __name__ main语句,虽然一直知道它的作用,但是可能一直比较模糊,今天菜鸟分析就与大家一起举例说说我的理解。 举个例子,我们在下面在test.py中写入如下代码&a…...