Redis -- 基础知识2

 1.Redis客户端介绍

1.基础介绍

Redis是一种客户端-服务器结构的程序,通过网络进行互动

客户端的多种形态

1.自带了命令行客户端:redis-cil

2.图形化界面的客户端:依赖windows系统,连接服务器有诸多限制,不建议使用

3.基于redis的api自行开发客户端:工作常见

2.特征与性能选择

1.Redis的快,是相对于MySQL这样的关系型数据库比较的

2.如果和内存中的操作变量相比,就没有优势了

3.是否要采用redis要结合实际的需求。单机系统不用redis,分布式再使用redis

2.通用命令

先redis-cil指令进入到客户端中

1.核心命令

1.set [key] [value]:把key和value存储进去

2.get [key]:根据key取出value。如果不存在,返回nil

key和value都是字符串

2.全局命令

Redis支持多种数据结构,整体Redis是键值对存储的,对应的value可以有多种形式

1.keys

keys pattern:用来查询当前服务器上匹配的key。通过一些特殊符号来描述key模样,匹配key上述模样的key查询出来.查询的时间复杂度为O(N)

? :匹配任意一个字符

* :匹配0个或者多个任意字符

[abc] :只能匹配[]内的字符,固定了选项

[^a] :不能匹配[]内的字符,其他都能找到

[a-c] :匹配[]内范围的的固定字符

特别注意的是:在生产环境上的key可能非常多,而redis是一个单线程服务器,如果执行keys *,那么时间就会非常长,redis服务器会被阻塞,使得其他客户端不能被服务器提供服务.并且这样可能会出现keys *阻塞其他的redis查询就会超时,导致数据读取要从MySQL中进行读取,MySQL比较脆弱,一波请求可能就把系统弄崩溃

2.exists

exists key [key...]:判断key是否存在,返回个数,可以查询多个key,至少输入一个.查一个redis是按照hash的方式进行组织的,使用时的时间复杂度为O(1),查多个就O(N)

3.del

del [key...]:删除指定key,可以删除多个.删除一个的时间复杂度为O(1).

redis一般作为缓存,其实del删除的是热点数据,数据依然存在MySQL中,所以删除几个key的安全影响不大.如果redis作为数据库,那么删除数据的影响更大.redis作为消息队列,那么影响会根据情况分析了.

4.expire

expire key second:作用是给指定的key设定过期时间,设定的key超时就会自动删除

pexpire key 毫秒:设定毫秒级别的超时时间

expire的时间复杂度为O(1)

应用:手机验证码,优惠券,基于redis实现的分布式锁,设定加锁的过期时间.

5.ttl

ttl key:查询过期时间还有多少

pttl key:毫秒级的查询

时间复杂度为O(1).-1表示没有关联过期时间,-2为key不存在

redis的过期策略的实现方式:

1.redis的策略有两方面定期删除和惰性删除

2.惰性删除:key到过期时间了,但是不先删除,下一次访问时使用key,那么就删除key并且返回nil

3.定时删除:会定期执行删除的操作,不过每次都只会抽取一部分,进行检验过期时间.保证这个检测过程的时间短,以为长时间进行检测会造成阻塞

4.两个删除策略,对整体效果一般,还会有很多的key残留.那么redis在此基础上还补充了一些内存的淘汰机制

5.redis最开始是单线程的,当然随着版本迭代,现在可以使用多线程.那么其实可以针对这一特性将加入一个定时器来节省cpu处理多个key.有两种方法可以实现:优先级队列和时间轮

6.实现优先级队列,我们对优先级队列设置出队列的要求,那么在数据设定过期时间后,我们可以实现一个数据结构,将过期的截至时间和key组合,并且将其放在优先级队列中,优先级队列对的头部为最先截至的时间的结构,找到key即可删除.并且每次根据头部的截至时间进行唤醒线程对优先级队列进行操作.一旦存在新数据,那么将线程唤醒,加入到队列中,更新一下最先截至的时间并且进行线程进行休眠操作

7.时间轮:创建一个数组,一个数组为单位时间,指针指向的位置就是执行的位置.指针往后走,并且数组为环形数组.只需要将超时时间挂到相对应的数组位置上,并且通过链表的形式存储.每次走到一个位置遍历下方的链表,删除超时的key即可

8.redis源代码中,删除的核心机制就是事件循环

6.type

type key:查看key对应value的类型

3.认识数据类型即其编码方式

1.key对应的value有很多种类型,常见的有:none,string,list,set,zset,hash,stream

2.不同的value类型对应的操作各不相同

3.在redis底层,针对实现不同类型进行特定的优化,来节省时间和空间的效果背后的数据结构不一定是保准的原数据结构,不过功能和效率达到同样效果

string

1.raw:最基本的字符串,对标C++为char

2.int:通常用于计数,存储整数一般用int

3.embstr:对短字符串进行优化,占据空间会更小

hash

1.hashtable:最基本的hash表

2.ziplist:压缩哈希表,redis内部的hash表,和真hash结构不太一样,思想是一致的.在hash表元素个数比较少的时候使用.

3.list

1.linkedlist:链表

2.ziplist:压缩链表,适用于元素少的,空间利用率高,元素多了操作效率会变低

3.quicklist: redis3.2版本的类型,同时兼顾上面两种的优点

4.set

1.hashtable:

2.intset:集合中存的都是整数时的优化

5.zset

1.skiplist:跳表,也是一种链表,不同于普通链表,每个节点都有多个指针域,巧妙通过这些指针域跳跃遍历

2.ziplist

object encoding key:查看key中value的具体结构类型

3.单线程模型

1.redis只是用一个线程来处理所有的命令请求,而不是redis服务器只有一个线程,其实也有多个线程,多线程在处理网络IO,而命令操作只有一个线程进行

2.假设多个客户端同时操作一个redis服务器,redis是单线程的,当前收到多个请求时是串行执行的.请求到服务器都在队列中排队,按顺序执行,而非并发执行命令

3.redis的业务逻辑短平快,所以串行也不太影响cpu效率

redis虽然是单线程模型,但是效率高的原因

1.效率高是与数据库进行比较的

2.redis访问的是内存,而数据库访问硬盘

3.redis核心功能比数据库的核心功能更简单

4.单线程模型,避免了一些多线程竞争的操作,由于redis的操作短平快

5.处理网络IO的时候,使用epoll进行IO多路复用机制(一个线程管理多个socket)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/118967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis -- 基础知识1

1.介绍 1.初识Redis Redis:The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker. in-memory data:在内存中存储,Redis是在分布式系统中存储起作用的 解释&am…

打印机连接网络后怎么安装驱动?

打印机在我们办公和生活中算是比较常见的设备,特别是在上班时需要时常打印各种文件,但是有时电脑上的打印机也会有无法打印的问题,或者新买的打印机需要先安装驱动才能正常打印的。 那么这个时候我们需要先检查电脑上的打印机是否有安装驱动&…

主线程和子线程的区别

在多线程编程中,我们通常会涉及到主线程(也称为父线程)和子线程(也称为工作线程)。 1. 主线程:主线程是程序的起点,它负责创建和管理其他线程。主线程通常执行程序的初始化操作,包括…

Kotlin中的嵌套类、内部类、枚举类、密封类、数据类、单例类、伴生对象

在Kotlin中,类可以分为以下几种类型,并使用样例代码进行说明: 嵌套类(Nested Class):嵌套类是指可以嵌套在其他类中的类。嵌套类不能直接访问外部类的成员。例如,在下面的代码中,&q…

正点原子嵌入式linux驱动开发——异步通知

上一篇笔记中使用阻塞或者非阻塞的方式来读取驱动中按键值都是应用程序主动读取的,对于非阻塞方式来说还需要应用程序通过poll函数不断的轮询。最好的方式就是驱动程序能主动向应用程序发出通知,报告自己可以访问,然后应用程序再从驱动程序中…

LCR 146. 螺旋遍历二维数组

LCR 146. 螺旋遍历二维数组 原题链接:完成情况:解题思路:参考代码: 原题链接: LCR 146. 螺旋遍历二维数组 https://leetcode.cn/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/description/ 完成情况: 解…

【Leetcode】【每日一题】【简单】2520. 统计能整除数字的位数

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/count-the-digits-that-divide-a…

LeetCode 面试题 16.03. 交点

文章目录 一、题目二、C# 题解 一、题目 给定两条线段(表示为起点 start {X1, Y1} 和终点 end {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值。 要求浮点型误差不超过 10^-6。若有多个交点(…

网络安全保险行业面临的挑战与变革

保险业内大多数资产类别的数据可以追溯到几个世纪以前;然而,网络安全保险业仍处于初级阶段。由于勒索软件攻击、高度复杂的黑客和昂贵的数据泄漏事件不断增加,许多网络安全保险提供商开始感到害怕继续承保更多业务。 保险行业 根据最近的路…

【方法】如何给PDF文件添加“打开密码”?

PDF文件可以在线浏览,但如果想要给文件添加“打开密码”,就需要用到软件工具,下面小编分享两种常用的工具,小伙伴们可以根据需要选择。 工具一:PDF编辑器 PDF阅读器一般是没有设置密码的功能模块,PDF编辑器…

python自动化测试(二):xpath获取元素

目录 前置代码 一、什么是xpath方式 二、通过xpath 单组属性名属性值 的方式进行元素定位 三、通过xpath的多组属性进行元素的定位 四、通过xpath文本值的方式进行元素定位 五、通过模糊的文本值方式进行元素定位 前置代码 # codingutf-8 from selenium import webdrive…

python树结构包treelib入门及其计算应用

树是计算机科学中重要的数据结构。例如决策树等机器学习算法设计、文件系统索引等。创建treelib包是为了在Python中提供树数据结构的有效实现。 Treelib的主要特点包括: 节点搜索的高效操作。支持常见的树操作,如遍历、插入、删除、节点移动、浅/深复制…

使用Go语言测试Redis性能

1. 前言 Redis是一个高性能的键值存储数据库,常用于缓存、队列、排行榜等场景。在实际应用中,我们需要对Redis的性能进行测试,以便了解其在不同场景下的表现。本文将介绍如何使用Go语言测试Redis的性能。 2. 环境准备 在开始测试前&#x…

MySQL精髓:如何使用ALL一次找到最大值

题目来自LeetCode 题目 表:Project -------------------- | Column Name | Type | -------------------- | project_id | int | | employee_id | int | -------------------- (project_id, employee_id) 是该表的主键(具有唯一值的列的组合)。 employee_id 是该表…

如何让家居设备快速通过Matter认证?移远通信为您带来标准回答

2022年10月,Matter协议正式面向全球发布;2023年10月23日,Matter 1.2最新版本正式发布。在Matter发布至今的时日里,众多头部厂商纷纷加速开发新产品,只为更快抢占市场先机,以“先发者”身份入局新赛道&#…

数据库安全定义以及重要性简单讲解

数据库安全定义 数据库安全指的是对数据库进行保护,以确保其数据的机密性、完整性和可用性,并防止非法访问、篡改、破坏、泄露等安全威胁。一般包括访问控制、数据加密、审计和监控、数据备份、漏洞修补、网络安全等方面。 数据库安全的重要性 1、数据…

微信小程序开发(四) - 页面配置 - json 文件

page.json 每一个小程序页面也可以使用.json文件来对本页面的窗口表现进行配置。 页面的配置比app.json全局配置简单得多 只须设置app.json中的 window 配置项的内容,页面中配置项会覆盖 app.json 的 window 中相同的 配置项。 页面的.json只能设置 window 相关…

C++ 学习 之 名字空间 namespace

必须在模块里面 extern 声明 在一个 cpp 文件中, 一个namespace 可以多次定义,最后合并,使用 using namespace A 这种引入方式的话,使用的时候可以用所有 A 中的数据 多个 cpp 文件的话,不能会自动合并相同的 名字空…

go WriteFile文件追加写入(适合小文件)

go 在做文件追加写入时一般用os.OpenFile 指定 FileMode 为 os.O_APPEND. 如官方文档示例: f, err : os.OpenFile("access.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)if err ! nil {log.Fatal(err)}if _, err : f.Write([]byte("appended some data\n&…

day37(事件轮询机制 ajaxGet执行步骤与案例(五个步骤) ajax属性 PHP返回JSON对象(两种))

一.事件轮询机制 1. 无论同步还是异步代码都要经过主线程编译,同步代码开始排在执行栈(主线程)上,异步代码开 始存放在任务队列中 2. 主线程优先执行同步代码,同步代码必须前一行执行完,后一行才能执行;当异步代码…