redis讲解与介绍

news2024/11/16 11:36:34

Redis介绍:

        Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

    下载教程: https://www.cnblogs.com/langjunnan/articles/15798670.html

为什么使用Redis?

 高性能:

        假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!

 高并发:

  直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。

redis 的线程模型

    redis 内部使用文件事件处理器 file event handler,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。  

  文件事件处理器的结构包含 4 个部分:  

  1.   多个 socket

  2.   IO 多路复用程序

  3.   文件事件分派器

  4.   事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)

  多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。

redis 常见数据结构以及使用场景分析  

  1.String

  常用命令: set,get,decr,incr,mget 等。

  String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。 常规key-value缓存应用; 常规计数:微博数,粉丝数等。

  2.Hash

  常用命令: hget,hset,hgetall 等。

  hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。 比如我们可以 hash 数据结构来存储用户信息,商品信息等等。比如下面我就用 hash 类型存放了我本人的一些信息:

key=JavaUser293847

value={  

“id”: 1,   

“name”: “SnailClimb”,   

“age”: 22,   

“location”: “Wuhan, Hubei”

}

 3.List  

  常用命令: lpush,rpush,lpop,rpop,lrange等  

  list 就是链表,Redis list 的应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表,消息列表等功能都可以用Redis的 list 结构来实现。  

  Redis list 的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。  

  另外可以通过 lrange 命令,就是从某个元素开始读取多少个元素,可以基于 list 实现分页查询,这个很棒的一个功能,基于 redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西(一页一页的往下走),性能高。

  4.Set  

  常用命令: sadd,spop,smembers,sunion 等  

  set 对外提供的功能与list类似是一个列表的功能,特殊之处在于 set 是可以自动排重的。  

  当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。可以基于 set 轻易实现交集、并集、差集的操作。  

  比如:在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis可以非常方便的实现如共同关注、共同粉丝、共同喜好等功能。这个过程也就是求交集的过程,具体命令如下:

sinterstore key1 key2 key3     将交集存在key1内

 5.Sorted Set  

  常用命令: zadd,zrange,zrem,zcard等  

  和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。  

  举例: 在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息,适合使用 Redis 中的 Sorted Set 结构进行存储。

redis 设置过期时间

  Redis中有个设置时间过期的功能,即对存储在 redis 数据库中的值可以设置一个过期时间。作为一个缓存数据库,这是非常实用的。如我们一般项目中的 token 或者一些登录信息,尤其是短信验证码都是有时间限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。  

  我们 set key 的时候,都可以给一个 expire time,就是过期时间,通过过期时间我们可以指定这个 key 可以存活的时间。  

  如果假设你设置了一批 key 只能存活1个小时,那么接下来1小时后,redis是怎么对这批key进行删除的?

  定期删除+惰性删除。

  通过名字大概就能猜出这两个删除方式的意思了。

  • 定期删除:redis默认是每隔 100ms 就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意这里是随机抽取的。为什么要随机呢?你想一想假如 redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会给 CPU 带来很大的负载!

  • 惰性删除 :定期删除可能会导致很多过期 key 到了时间并没有被删除掉。所以就有了惰性删除。假如你的过期 key,靠定期删除没有被删除掉,还停留在内存里,除非你的系统去查一下那个 key,才会被redis给删除掉。这就是所谓的惰性删除,也是够懒的哈!

  但是仅仅通过设置过期时间还是有问题的。我们想一下:如果定期删除漏掉了很多过期 key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?如果大量过期key堆积在内存里,导致redis内存块耗尽了。怎么解决这个问题呢? redis 内存淘汰机制。

redis 内存淘汰机制(MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?)

  redis 配置文件 redis.conf 中有相关注释,我这里就不贴了,大家可以自行查阅或者通过这个网址查看:http://download.redis.io/redis-stable/redis.conf

  redis 提供 6种数据淘汰策略:

  1.   volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

  2.   volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

  3.   volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

  4.   allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)

  5.   allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

  6.        no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧!

  4.0版本后增加以下两种:

  7.         volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰

  8.         allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的key

redis 持久化机制(怎么保证 redis 挂掉之后再重启数据可以进行恢复)

  很多时候我们需要持久化数据也就是将内存中的数据写入到硬盘里面,大部分原因是为了之后重用数据(比如重启机器、机器故障之后恢复数据),或者是为了防止系统故障而将数据备份到一个远程位置。  

  Redis不同于Memcached的很重一点就是,Redis支持持久化,而且支持两种不同的持久化操作。Redis的一种持久化方式叫快照(snapshotting,RDB),另一种方式是只追加文件(append-only file,AOF)。这两种方法各有千秋,下面我会详细这两种持久化方法是什么,怎么用,如何选择适合自己的持久化方法。  

  快照(snapshotting)持久化(RDB)  

  Redis可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。Redis创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis主从结构,主要用来提高Redis性能),还可以将快照留在原地以便重启服务器的时候使用。  

  快照持久化是Redis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置:

save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发BGSAVE命令创建快照。

save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发BGSAVE命令创建快照。

save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发BGSAVE命令创建快照。

  AOF(append-only file)持久化

  与快照持久化相比,AOF持久化 的实时性更好,因此已成为主流的持久化方案。默认情况下Redis没有开启AOF(append only file)方式的持久化,可以通过appendonly参数开启:

appendonly yes

  开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof。  

  在Redis的配置文件中存在三种不同的 AOF 持久化方式,它们分别是:

appendfsync always #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度

appendfsync everysec #每秒钟同步一次,显示地将多个写命令同步到硬盘

appendfsync no #让操作系统决定何时进行同步

  为了兼顾数据和写入性能,用户可以考虑 appendfsync everysec选项 ,让Redis每秒同步一次AOF文件,Redis性能几乎没受到任何影响。而且这样即使出现系统崩溃,用户最多只会丢失一秒之内产生的数据。当硬盘忙于执行写入操作的时候,Redis还会优雅的放慢自己的速度以便适应硬盘的最大写入速度。

  Redis 4.0 对于持久化机制的优化

  Redis 4.0 开始支持 RDB 和 AOF 的混合持久化(默认关闭,可以通过配置项 aof-use-rdb-preamble 开启)。  

  如果把混合持久化打开,AOF 重写的时候就直接把 RDB 的内容写到 AOF 文件开头。这样做的好处是可以结合 RDB 和 AOF 的优点, 快速加载同时避免丢失过多的数据。当然缺点也是有的, AOF 里面的 RDB 部分是压缩格式不再是 AOF 格式,可读性较差。

  补充内容:AOF 重写

  AOF重写可以产生一个新的AOF文件,这个新的AOF文件和原有的AOF文件所保存的数据库状态一样,但体积更小。

  AOF重写是一个有歧义的名字,该功能是通过读取数据库中的键值对来实现的,程序无须对现有AOF文件进行任何读入、分析或者写入操作。  

  在执行 BGREWRITEAOF 命令时,Redis 服务器会维护一个 AOF 重写缓冲区,该缓冲区会在子进程创建新AOF文件期间,记录服务器执行的所有写命令。当子进程完成创建新AOF文件的工作之后,服务器会将重写缓冲区中的所有内容追加到新AOF文件的末尾,使得新旧两个AOF文件所保存的数据库状态一致。最后,服务器用新的AOF文件替换旧的AOF文件,以此来完成AOF文件重写操作

redis 事务

  Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务(transaction)功能。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。  

  在传统的关系式数据库中,常常用 ACID 性质来检验事务功能的可靠性和安全性。在 Redis 中,事务总是具有原子性(Atomicity)、一致性(Consistency)和隔离性(Isolation),并且当 Redis 运行在某种特定的持久化模式下时,事务也具有持久性(Durability)。

  注意:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

缓存雪崩和缓存穿透问题解决方案

  缓存雪崩  

  简介:缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。  

  解决办法:  

  •   事前:尽量保证整个 redis 集群的高可用性,发现机器宕机尽快补上。选择合适的内存淘汰策略。

  •   事中:本地ehcache缓存 + hystrix限流&降级,避免MySQL崩掉

  •   事后:利用 redis 持久化机制保存的数据尽快恢复缓存

缓存穿透  

  简介:一般是黑客故意去请求缓存中不存在的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。  

  解决办法:

  有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

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

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

相关文章

linux adb命令

⏩ 大家好哇!我是小光,正在努力寻找自己的职业方向。 ⏩ 在调试设备时,经常会用到adb命令,本文对linux adb命令做一个知识分享。 ⏩ 感谢你的阅读,不对的地方欢迎指正。 1.adb命令 即 Android Debug Bridge 是一种允许…

从产品手册用户心理学分析到程序可用性与易用性的重要区别

注:机翻,未校对。 Designing for People Who Have Better Things To Do With Their Lives 为那些生活中有更重要事情要做的人设计 When you design user interfaces, it’s a good idea to keep two principles in mind: 在设计用户界面时,…

数据库:编程(打开、操作(增、删、改、查)、关闭)

一、需要的头文件 sqlite3.h 二、编译过程 gcc xxx -lsqlite3 三、编程框架 打开数据库 》读写数据库(增,删,改,查) 》关闭数据库 3.1 打开数据库: sqlite3_open int sqlite3_open(char * path,sqlite3 ** db); 功能&…

docker持久化

上周学习了docker的dockerfile,这周会往下学习一下docker的持久化;提到持久化,首先会涉及到一个UnionFS的概念; 1、什么是UnionFS? docker创建镜像的时候,会将各种依赖包括操作系统OS、工具包、依赖库等都放在文件系…

Zookeeper之CAP理论及分布式一致性算法

CAP理论 CAP理论告诉我们,一个分布式系统不可能同时满足以下三种 一致性(C:consistency)可用性(A:Available)分区容错性(P:Partition Tolerance) 这三个基本要求,最多只能同时满足…

内容长度不同的div如何自动对齐展示

平时我们经常会遇到页面内容div结构相同页,这时为了美观我们会希望div会对齐展示,但当div里的文字长度不一时又不想写固定高度,就会出现div长度长长短短,此时实现样式可以这样写: .e-commerce-Wrap {display: flex;fle…

小程序-模板与配置

一、WXML模板语法 1.数据绑定 2.事件绑定 什么是事件 小程序中常用的事件 事件对象的属性列表 target和currentTarget的区别 bindtap的语法格式 在事件处理函数中为data中的数据赋值 事件传参 (以下为错误示例) 3.事件传参与数据同步 4.条件渲染 …

人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解。 文章目录 一、引言二、梯度问题1. 梯度爆炸梯度爆炸的概念梯度爆炸的原因梯度爆炸的解决方案 2. 梯度消失梯度消失的概念梯度…

十九、【文本编辑器(五)】排版功能

目录 一、搭建框架 二、实现段落对齐 三、实现文本排序 一、搭建框架 (1) 在imgprocessor.h文件中添加private变量: QLabel *listLabel; //排序设置项QComboBox *listComboBox;QActionGroup *actGrp;QAction *leftAction;QAction *…

实践致知第16享:设置Word中某一页横着的效果及操作

一、背景需求 小姑电话说:现在有个word文档,里面有个表格太长(如下图所示),希望这一个设置成横的,其余页还是保持竖的! 二、解决方案 1、将鼠标放置在该页的最前面闪烁,然后选择“页面”》“↘…

Macbook pro插移动硬盘没反应,Macbook pro移动硬盘读不了怎么办 macbook插移动硬盘后无法使用

为了弥补Macbook pro硬盘容量的缺失,我们有时候会使用到外接硬盘或移动硬盘。一般来说,这些硬盘都是即插即用的,可能部分要安装插件。不过,在一些特殊情况下,也会遇到插硬盘没反应等问题。本文会给大家解答Macbook pro…

PyTorch张量创建和随机数生成器算法

文章目录 1、基本创建方式1.1、根据已有数据创建张量1.2、根据已有数据创建张量1.3、根据已有数据创建张量 2、创建线性和随机张量2.1、创建线性空间的张量2.2、创建随机张量2.3、什么是随机数种子2.4、initial_seed()和manual_seed() 3、创建01张量3.1、全0张量3.2、全1张量3.…

PGCCC|【PostgreSQL】PCP认证考试大纲#postgresql 认证

PostgreSQL Certified Professional PCP(中级) PCP目前在市场上非常紧缺,除了具备夯实的理论基础以外,要有很强的动手能力,获得“PCP(中心)“的学员,将能够进入企业的生产系统进行运…

MongoDB自学笔记(二)

一、前言 接着上一篇文章,在上一篇文章中学习了如何使用数据库、如何创建集合、如何往集合里添加文档,今天我们继续学习一下更新文档,更新文档相对来说比较复杂笔者打算分多次来记录学习过程。 二、文档操作 1、更新文档 基础语法&#x…

爬虫-requests和Selenium

1、了解requests的功能 1.1 使用post和get发送请求 HTTP中常见发送网络请求的方式有两种,GET和POST。GET是从指定的资源请求数据,POST是向指定的资源提交要被处理的数据。 GET的用法: import requestsr requests.get("https://www.…

面试题010-数据库-MySQL(MySQL+索引)

面试题010-数据库-MySQL(MySQL索引) 目录 面试题010-数据库-MySQL(MySQL索引)题目自测题目答案1. MySQL是什么?有什么优点?2. 什么是SQL注入?如何解决SQL注入?3. MyISAM 和 InnoDB 有什么区别?4. SQL在MySQL数据库中的…

【论文阅读】LLM4GCL: CAN LARGE LANGUAGE MODEL EMPOWER GRAPH CONTRASTIVE LEARNING?

LLM4GCL: CAN LARGE LANGUAGE MODEL EMPOWER GRAPH CONTRASTIVE LEARNING? https://openreview.net/forum?idwxClzZdjqP 图对比学习的重点就是图数据的增强,针对图中节点的表示或者图的结构进行扰动,通过对比学习得到对应的节点表示,以便于…

azure学习在日本IT工作的重要性

在日本数字化转型的浪潮中,微软Azure已经成为众多企业的首选云平台。作为全球第二大云服务提供商,Azure在日本市场的重要性与日俱增。本文将探讨为什么学习Azure对日本IT专业人士至关重要,以及如何通过lalapodo云原生技术的培训课程,快速掌握这一关键技能。 Azure在日本的战略地…

MongoDB教程(五):mongoDB聚合框架

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言MongoDB 聚…

如何申请抖音本地生活服务商?3种方式优劣势分析!

随着多家互联网大厂在本地生活板块的布局力度不断加大,以抖音为代表的头部互联网平台的本地生活服务商成为了创业赛道中的大热门,与抖音本地生活服务商怎么申请等相关的帖子,更是多次登顶创业者社群的话题榜单。 就目前的市场情况来看&#x…