redis-基础

news2024/9/27 7:23:59

1、redis简述

redis 是一门C语音开发的,redis开发者,一开始的本意是作用消息队列,后面随着IT圈的迅速发展,redis不满足诉求;最后开发成k/v形式的内存存储的工具

特性:速度快、单进程单线程、支持集群、持久化

为啥快?

a)、操作内存

b)、单进程单线程,不存在资源竞争,上下文切换

c)、多路复用,多路-->网络连接 复用--> 复用的是一个线程

2、redis支持类型

前言

所有key的类型是redis内部定义sds string类型,长度最大是512M,所有value的类型都是redisObject

但是redisObject里面又细分,这里后面不同类型阐述。

1、string

操作指令:set key value get key

外部类型 --> string

内部类型 --> 如下

可通过object encoding key或者debug object key,查看value信息

a)、内容是数字: < 44 --> int ; >44 -->raw

b)、内容非数字:< 44length --> empstr ; > 44 --> raw

c)、为什么是44length?

内存分配器(2/4/8/16/32/64 字节)

sds --> 3字节

redisObject --> 16字节

也就是19个字节,至少要分配内存32字节下来, 这里就不在深入进去,在深入我不懂ing,尬了尬了

2、hash

操作指令: hset hget hmgetAll不罗列

外部类型 --> 哈希表 key :: field :: value

内部类型 --> 如下

a)、hashtable哈表

dict外层 --> 字典数据结构,两个dictht表ht[0],ht[1],一个使用 一个为空,方便扩容

dictht -- > 指向dictentry数组的指针

dictentry -> 数组+链表形式存放

b)、ziplist

使用条件 --> 保存field数量小于512; 所有的field和value的字符串长度都小于64字节

经过特殊编码,连续的内存块组成双向链表, 不存指针的地址,存储的上节点长度和当前节点长度

c)、扩容 --> 元素的个数 / 数组的长度 > 5 触发扩容

触发扩容 --> 在空的dictht表里创建原本大小的2的幂次方, 重新rehash分配到新表 , 释放ht[0]的空间,

将ht[1]这张表改为ht[0],创建新的ht[1],为下次做准备

3、set

操作指令: sadd sget

存储类型: intset hashtable

4 、list

特性:存储有序的字符串(从左往右), 元素可重复

数据类型: quicklist -- > a) head 记录头节点

b) tail 记录尾节点

c) count 所有ziplist的元素个数

d) len 双向链表的长度

e) queicklistNode 双向链表 --> pre 上节点 tail 下节点 ziplist 压缩列表

5、zset

特性: 存储有序元素,不允许重复元素,按照score从小到大排序,score相同按照 ASCII码排序

数据模型 : ziplist -- > 元素数量小于128,所有长度小于64字节

skiplist + dict -- > skiplist跳表 -- >

6、BitMaps

a)、存储类型: 字符串存储

b)、数据模型 : 一个字节八位二进制位组成

7、Hyperloglog

未了解

8、Geospatial

存放经纬度,计算经纬度距离

3、redis内存淘汰、过期策略

a)、过期策略:redis采用定时清除和惰性清除,

定时清除 -> 定时清除ttl过期的key,扫描部分,造成可能大量已经ttl过期的key未删除

惰性清除 --> 客户端get的时候,查看是否ttl过期,过期就删除

大量ttl过期key未删除,会导致内存不够用,要保证redis是可用状态,就出了内存淘汰,过期

b)、内存淘汰 --> 如上过期数据还是可能出现内存不过用,所以淘汰一些数据来保证可用性

淘汰策略 --> lru 最少使用

--> lfu 最少使用(评率)

--> random 随机

--> volatile 设置了过期时间

--> allKey 全部key ,不看是否有设置ttl

--> noeviction 不做任务淘汰策略,直接报错

组合8种使用 --> volatile-lru --> 设置了ttl,最少使用, 例:A很少用,redis准备删除A了,客户端突然使用下A,

一下就热点数据了,不公平吧。

volatile-lfu --> 在volatile-lru基础下,增加次数,具体实现,出门左转百度下,这里不做阐述实现

volatile-ttl --> 快要过期的

volatile-random --> 随机删除设置时间的

不管你有没有设置时间

allKey-lru --> 挑选最近最少使用的数据淘汰

allKey-lfu --> 挑选最近最少次数使用的数据淘汰

allKey-random --> 随机挑选使用的数据淘汰

no-noeviction 不做淘汰,oom出去。不能插入,但是可以get操作

c)、建议使用: volatile-lru 保证正常服务的情况下,优先删除最近最少使用的key

4、redis持久化

1、aof

执行一次指令就保存

持久策略: no --> 不执行fsync,由操作系统保证数据同步到磁盘, 速度快,但是不安全

always --> set a 123, 先更新到redis缓存,在刷新到aof文件中

everysec(推荐) --> 先把执行命令写入到buffer中,在以每秒执行一次fsync, 效率可以保证,但可能会丢失一秒的数据

优点:提供丰富的同步策略

缺点:aof文件更大,不合适做数据备份

2、rdb

生成快照:在conf配置的x秒内达到ykey就会生成快照

正常关机也会生成快照

指令flushall会生成快照

指令save会生成快照,但是这个是阻塞式的,执行这个指令,其他不能执行

执行bgsave会生成快照,fork一个子进程,共享父类内存,不阻塞

优点: 生成的文件会比aof文件小,适合做数据备份,文件小,更合适恢复数据

缺点: 会丢失数据

aof,rdb的混合

Redis 4.0 中提出了一个混合使用 AOF 日志和内存快照的方法。简单来说,内存快照以一定的频率执行, 在两次快照之间,使用 AOF 日志记录这期间的所有命令操作。

在同时开启rdb和aof情况下
set a 123
set b 123
set c 123
aof每秒设置到aof文件中
同时也快快照到rdb文件中,在二次快照后,会清空aof文件。

3、方案比较

1、如果能忍受一小段时间的数据丢失,选择rdb,如果不能,就选择aof

2、(推荐)不要单独设置一种持久化机制,两种一起用,AOF比RDB的数据要完整

4、redis重启加载文件顺序

1、如果开启了aof,优先查看是否有aof文件,如果有,则加载aof文件,启动redis。

2、如果开启了aof,无aof文件,则查看是否有rdb文件,如果有,则加载rdb文件,启动redis。

3、如果开启了aof,无aof文件,则查看是否有rdb文件,如果无,启动redis。

4、如果无开启aof,则查看是否有rdb文件,如果有,则加载rdb文件,启动redis。

5、如果无开启aof,则查看是否有rdb文件,如果无,则加载rdb文件,启动redis。

3、redis集群

后面在写一篇文档关于集群

4、redis应用场景

1、string类型适合场景 --> 缓存热点时间

--> 分布式session登录

--> 分布式锁

--> 计数器incr/decr

--> 限流?

2、hash类型适合场景 --> 跟string差不多,但是field无法设置时间

3、list类型适合场景 --> 热点数据列表 (文章)

--> 消息队列

4、set类型适合场景 --> 抽奖(不能重复)

--> 点赞/打卡/签到

--> 关系模型

--> 交集/并集/差集操作

5、zset类型适合场景 --> 热搜/主题

6、bitmap类型适合场景 --> 用户访问统计

--> 在线用户统计

--> 用户签到

--> 与、或、异或、非运算

7、Hyperloglog类型适合场景 --> 不太精确的基数统计

--> 统计网站UV

--> 日活、月活

8、Geospatial类型适合场景 --> 经纬度操作,距离比较

5、redis高级特性

1、事物

特点: 把一组指令一起(进入队列顺序)执行

不会受到其他命令干扰,一组命令set 11 22 set 22 33 在开启事务后,如果有另外的命令在操作11,22 key的命令。那么事务会取消了。 事物是不能嵌套的

用法: multi开启命令

exec 执行事务 --> 只能捕捉错误语法的指令,事物不会执行成功

--> 没有语法错误,但是执行过程中,指令错误,已执行的指令执行成功,错误的且未执行的不成功

discard 取消事务

watch 监视 --> 防止事务过程中某个key的值被其他客户端修改,并且取消事务

--> CAS乐观锁行为

2、发布订阅

3、lua

特点:批量执行指令

原子性 --> 排斥其他客户端指令 (排他)

脚本写入文件,集合复用

应用场景: 限流

秒杀

好处:
①高效,在服务器上执行,节省了网络传输开销等,特别lua脚本,执行多个脚本,好处就体现出 来了。

②原子性;一个业务需要多个指令完成,lua脚本比较好的选择

缺点:那就是如果你lua过于复杂,假如在里面取bigkey操作了,获取取值过大等等,就会阻塞;

执行时间过长;

如果配置主从,有两种同步方式:

1、脚本复制:意思很明确,就是在从节点也执行一边,在5.0后,就移除了,默认就是效果复制。

2、效果复制:就是把结果同步。

指令:

1、加载lua脚本到redis服务中

./redis-cli -a 密码 -p 端口 script load '$(cat 1.lua)';

返回一个sha1的值

通过evelsha sha1的值

 

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

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

相关文章

32.Netty源码之服务端如何处理客户端新建连接

highlight: arduino-light 服务端如何处理客户端新建连接 Netty 服务端完全启动后&#xff0c;就可以对外工作了。接下来 Netty 服务端是如何处理客户端新建连接的呢&#xff1f; 主要分为四步&#xff1a; md Boss NioEventLoop 线程轮询客户端新连接 OP_ACCEPT 事件&#xff…

CS:GO升级 Linux不再是“法外之地”

在前天的VAC大规模封禁中&#xff0c;有不少Linux平台的作弊玩家也迎来了“迟到”的VAC封禁。   一直以来&#xff0c;Linux就是VAC封禁的法外之地。虽然大部分玩家都使用Windows平台进行游戏。但实际上&#xff0c;使用Linux畅玩CS:GO的玩家也不在少数。 以前V社主要打击W…

【React学习】—组件三大核心属性: state(七)

【React学习】—组件三大核心属性: state&#xff08;七&#xff09; 2.2.2. 理解 state是组件对象最重要的属性, 值是对象(可以包含多个key-value的组合)组件被称为"状态机", 通过更新组件的state来更新对应的页面显示(重新渲染组件) 2.2.3. 强烈注意 组件中rend…

版本控制工具Git集成IDEA的学习笔记(第一篇Gitee)

目录 一、Gitee的使用 1、注册网站会员 2、用户中心 3、创建远程仓库 4、配置SSH免密登录 二、集成IDEA&#xff0c;Git项目搭建 1、本地仓库搭建 1&#xff09;创建一个新项目 2&#xff09;打开终端&#xff0c;在当前目录新建一个Git代码库 3&#xff09;忽略文件 …

《HeadFirst设计模式(第二版)》第八章代码——模板方法模式

代码文件目录&#xff1a; CaffeineBeverage package Chapter8_TemplateMethodPattern;/*** Author 竹心* Date 2023/8/17**/public abstract class CaffeineBeverage {final void prepareRecipe(){boilWater();brew();pourInCup();//这里使用钩子customerWantsCondiments()来…

JavaScript 快速入门手册

本篇文章学习&#xff1a; 菜鸟教程、尚硅谷。 JavaScript 快速入门手册 &#x1f4af; 前言&#xff1a; 本人目前算是一个Java程序员&#xff0c;但是目前环境… ε(ο&#xff40;*))) 一言难尽啊&#xff0c;blog也好久好久没有更新了&#xff0c;一部分工作原因吧(外包真…

【word密码】word怎么限制格式,但可以修改文字?

想要限制word文件中文字的格式&#xff0c;但是又希望别人能够删除、输入文字&#xff0c;想要实现这种设置我们可以对word文件设置限制编辑。 点击word文件工具栏中的审阅 – 限制编辑&#xff0c;勾选上【限制对选定的样式设置格式】 然后在弹出的提示框中&#xff0c;输入我…

【Rust】Rust学习 第十四章智能指针

指针 &#xff08;pointer&#xff09;是一个包含内存地址的变量的通用概念。这个地址引用&#xff0c;或 “指向”&#xff08;points at&#xff09;一些其他数据。Rust 中最常见的指针是第四章介绍的 引用&#xff08;reference&#xff09;。引用以 & 符号为标志并借用…

C#__事件event的简单使用:工具人下楼问题

// 工具人类 namespace DownStair {delegate void DownStairDelegate(); // 定义了一个下楼委托class ToolMan{public string Name { get; set; } // 声明工具人的名字属性// public DownStairDelegate downStairDelegate null; // 初始化委托downStair为空委托// 解决方案pu…

分布式可视化 DAG 任务调度系统 Taier 的整体流程分析

Taier 作为袋鼠云的开源项目之一&#xff0c;是一个分布式可视化的 DAG 任务调度系统。旨在降低 ETL 开发成本&#xff0c;提高大数据平台稳定性&#xff0c;让大数据开发人员可以在 Taier 直接进行业务逻辑的开发&#xff0c;而不用关心任务错综复杂的依赖关系与底层的大数据平…

Unknown tree updater grow_gpu_histb报错

报错显示&#xff1a;由于xgboost的问题而报错 报错显示&#xff1a;Unknown tree updater grow_gpu_histb 原因是 XGBoost 在尝试使用 GPU 加速时无法识别指定的树更新器。也就是当前xgboost版本中没有grow_gpu_histb组件&#xff0c;所以需要安装正确的版本。 经搜索&#…

Git如何上传文件到github

Git下载网址&#xff1a; https://git-scm.com/downloads 1. 新建一个空文件夹&#xff0c;用来上传文件&#xff0c;第一次需创建&#xff0c;以后无需创建 2. 点进去空文件夹&#xff0c;鼠标右键&#xff0c;使用Git Bash Here 打开 3. 克隆远程仓库&#xff1a;git cl…

【业务功能篇67】异构数据源表结构迁移

业务涉及到需要将数据库迁移&#xff0c;并且还换了不同厂商的&#xff0c;比如Oracle 迁移到 Mysql, 方式一&#xff1a;Navicat工具 最简单的做法&#xff0c;由于是不同数据库类型的,sql语法可能会有点差别&#xff0c;直接用Navicat客户端&#xff0c;把两个数据库连接&a…

mac上如何压缩视频大小?

mac上如何压缩视频大小&#xff1f;由于视频文件体积庞大&#xff0c;常常会占据我们设备的大量存储空间。通常情况下&#xff0c;我们选择删除视频以释放内存&#xff0c;但这将永久丢失它们。然而&#xff0c;有一种更好的方法可以在不删除视频的情况下减小内存占用&#xff…

微信小程序 蓝牙设备连接,控制开关灯

1.前言 微信小程序中连接蓝牙设备&#xff0c;信息写入流程 1、检测当前使用设备&#xff08;如自己的手机&#xff09;是否支持蓝牙/蓝牙开启状态 wx:openBluetoothAdapter({}) 2、如蓝牙已开启状态&#xff0c;检查蓝牙适配器的状态 wx.getBluetoothAdapterState({}) 3、添加…

PHP 公交公司充电桩管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 公交公司充电桩管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 源码下载 https://download.csdn.net/download/qq_41221322/88220946 论文下…

如何把PDF转换成PPT?试试这个转换方法

在现代办公和学习中&#xff0c;我们经常会遇到需要将PDF文件转换成PPT文件的需求。PDF作为一种通用的文件格式&#xff0c;被广泛应用于文档的共享和传递。通过将PDF转换成PPT&#xff0c;我们可以更好地编辑、演示和展示内容&#xff0c;适应不同设备和平台&#xff0c;提升交…

PyQt6学习第一篇

PyQt6中文文档 PyQt6 Digia 公司的 Qt 程序的 Python 中间件。Qt库是最强大的GUI库之一。PyQt6 是基于 Python 的一系列模块。它是一个多平台的工具包&#xff0c;可以在包括Unix、Windows和Mac OS在内的大部分主要操作系统上运行。PyQt6 有两个许可证&#xff0c;开发人员可以…

OJ练习第149题—— 二叉树中的最大路径和

二叉树中的最大路径和 力扣链接&#xff1a;124. 二叉树中的最大路径和 题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根…

三分钟上手!一文看懂 Git 的底层工作原理

这是一篇能让你迅速了解 Git 工作原理的文章&#xff0c;实战案例解析&#xff0c;相信我&#xff0c;3 分钟&#xff0c;绝对能够有收获&#xff01; Git 目录结构 Git 的本质是一个文件系统&#xff08;很重要&#xff0c;记住这句话&#xff0c;理解这句话&#xff09;&…