redis的基本概念和常见问题的解决!

一、什么是redis 

Redis是一个NoSQL(非关系型数据库)数据库之一,是一个用C语言开发的一个开源的高性能键值对(key-value)数据库或者说是一个缓存键值对数据库 ,用作数据库、缓存、消息中间件等。它支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等,并且支持丰富的操作命令,如查找、插入、删除等。 

(1)从Redis缓存中获取数据,如果存在数据,直接返回值。

(2)如果不存在,执行数据库的查询方法

(3)将数据库中的值放入缓存,并返回值

二、redis的优点

  1. 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) ;
  2. 支持丰富数据类型,支持string,list,set,sorted set,hash;
  3. 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 
  4. 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除。

三、redis的数据结构

五种数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)

  • String:可以是字符串、整数或者浮点数,字符串最大支持512MB。对整个字符串或者字符串的其中一部分执行操作;对象和浮点数执行自增(increment)或者自减(decrement)     (使用场景:缓存数据,简单计数,定期过时)
  • List:有序的字符串列表,可以当做栈、队列或者阻塞队列使用。读取单个或者多个元素;根据值来查找或者移除元素。                  (使用场景:用户排队,有序消息)
  • Set:无序的字符串集合,添加、获取、移除单个元素;检查一个元素是否存在于某个集合中;计算交集、并集、差集;从集合里随机获取元素。    (使用场景:去重,交集,并集,差集,获取随机数)
  • Hash:包含键值对的无序散列表。添加、获取、移除单个键值对;获取所有键值对。      (使用场景:同一资源的不同属性)
  • Zset:字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定,添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素。       (使用场景:排行榜,分数)

四、Redis的持久化功能

Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘上,一旦服务器退出,数据库状态约会消失。所以,Redis提供了持久化功能。两种方式:

  • RDB方式:在指定的时间间隔内将内存中的数据集快照写入磁盘,它恢复时是将快照文件直接读到内存里。
  • AOF方式:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令,达到恢复数据的目的。

五、key过期后的回收(删除策略

  • 定时删除在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
  • 惰性删除放任过期键不管,每次从键空间中获取键时,检查该键是否过期,如果过期,就删除该键,如果没有过期,就返回该键。
  • 定期删除每隔一段时间,程序对数据库进行一次检查,删除里面的过期键,至于要删除哪些数据库的哪些过期键,则由算法决定。

其中定时删除和定期删除为主动删除策略,惰性删除为被动删除策略

六、逐出算法

Redis使用内存存储数据,在执行每个命令前会调用freeMenoryNeeded()方法检测内存是否充足,如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据作为当前指令清理存储空间。

检查易失数据(可能会过去的数据)

  • volatile-lru:挑选最近最少使用的数据淘汰
  • volatile-lfu:挑选最近使用次数最少的数据淘汰
  • volatile-ttl:挑选将要过期的数据淘汰
  • volatile-random:任意选择数据淘汰

检查全库数据

  • allkeys-lru:挑选最近最少使用的数据淘汰
  • allkeys-lfu:挑选最近使用次数最少的数据淘汰
  • allkeys-random:任意选择数据淘汰

放弃数据驱逐

  • no-enviction:禁止驱逐数据

七、redis常见问题的解决

(1)缓存预热:

就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据

问题: 

  • 请求数量较大
  • 数据吞吐量较大
  • 数据同步操作频率较高

解决方案:

  • 统计数据访问记录
  • 统计频率较高的热点数据 

(2)缓存雪崩: 

缓存雪崩是指缓存同一时间大面积的失效,所以,所有的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉

解决方案:

  • 给不同的key的TTL 添加随机值
  • 利用redis集群提高服务的可用性
  • 给缓存业务添加降级限流策略
  • 给业务添加多级缓存

(3)缓存击穿:

是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案:

  • 互斥锁:用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试。
  • 逻辑过期方案 :用户查询某个热门产品信息,如果缓存未命中(即信息为空),则直接返回空,不去查询数据库。如果缓存信息命中,则判断是否逻辑过期,未过期返回缓存信息,过期则重建缓存,尝试获得互斥锁,获取失败则直接返回已过期缓存数据,获取成功则开启独立线程去重构缓存然后直接返回旧的缓存信息,重构完成之后就释放互斥锁。

    (只要命中了缓存,无论是否过期,是否获得锁看,都返回同一个缓存信息。)

(4)缓存穿透:

是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。

解决方案:

  • 缓存空对象:请求的数据即使不存在也存进redis内存中 (简单易维护)
  • 布隆过滤:将数据库中所有的查询条件,放入布隆过滤器中,当一个查询请求过来时,先经过布隆过滤器进行查,如果判断请求查询值存在,则继续查;如果判断请求查询不存在,直接丢弃。

八、Redis的模板类

Redis的模板类是一种封装了常用 Redis 操作的类,它可以简化 Redis 操作的代码,并提高代码的可读性。通常情况下,使用 Redis 的模板类可以避免在代码中直接使用 Redis 命令,而是使用预定义的方法。(redis提供了两种模板类)

RedisTemplate模板类:存时先将数据先序列化成字节数组再存入Redis。

StringRedisTemplate模板类(继承自RedisTemplate):存时先将数据先序列化成字符串再存入Redis。

两者的区别:

(1)两者数据各自存,各自取,数据不互通

  • RedisTemplate存入数据后,key与value在Redis中均变为了字节数组。那么,如果使用StringRedisTemplate以相同的key去Redis中查询,会查询不到该key,则会报null。
  • StringRedisTemplate存入数据后,key与value在Redis中均为可读数据。那么,如果使用RedisTemplate以相同key去Redus中查询,key变为了字节数组的形式,查询不到该字节数组形式的key,则会报null。

(2)序列化策略不同

  • RedisTemplate采用JDK的序列化策略
  • StringRedisTemplate采用String的序列化策略

 八、Redis的应用场景

  1. 缓存 :作为Key-Value形态的内存数据库,Redis 最先会被想到的应用场景便是作为数据缓存。而使用 Redis 缓存数据非常简单,只需要通过string类型将序列化后的对象存起来即可。
  2. 数据共享:数据共享分布式String 类型,因为 Redis 是分布式的独立服务,可以在多个应用之间共享
  3.  计数器:在 Redis 的数据结构中,stringhashsorted set都提供了incr方法用于原子性的自增操作。
  4. 时间轴:list作为双向链表,不光可以作为队列使用。如果将它用作栈便可以成为一个公用的时间轴。当用户发完微博后,都通过lpush将它存放在一个 key 为LATEST_WEIBOlist中,之后便可以通过lrange取出当前最新的微博。
  5. 抽奖:利用set结构的无序性,通过 Spop( Redis Spop 命令用于移除集合中的指定 key 的一个或多个随机元素,移除后会返回移除的元素。 ) 随机获得值。

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

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

相关文章

【Flowable】FlowableUI使用以及在IDEA使用flowable插件(二)

前言 之前有需要使用到Flowable,鉴于网上的资料不是很多也不是很全也是捣鼓了半天,因此争取能在这里简单分享一下经验,帮助有需要的朋友,也非常欢迎大家指出不足的地方。 一、部署FlowableUI 1.准备war包 在这里提供了&#xf…

026-从零搭建微服务-文件服务(二)

写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue 源码地址(前端):https://gitee.com/csps…

关于运行PR提示vcruntime140.dll无法继续执行代码的4个解决方法分享

关于运行安 PR提示vcruntime140.dll无法继续执行代码的困扰,小编将为您提供详细的解决方法。在此之前,我们需要了解一下vcruntime140.dll文件的作用。 vcruntime140.dll 是 Visual C Redistributable 的动态链接库文件,它包含了 C运行时库的一…

GeoSOS-FLUS未来土地利用变化情景模拟模型

软件简介 适用场景 GeoSOS-FLUS软件能较好的应用于土地利用变化模拟与未来土地利用情景 的预测和分析中,是进行地理空间模拟、参与空间优化、辅助决策制定的有效工 具。FLUS 模型可直接用于: 城市发展模拟及城市增长边界划定;城市内 部高分…

Zabbix监控组件及流程

Zabbix 由5大组件构成 Zabbix Web、Zabbix Server、Zabbix Proxy、Zabbix Database、Zabbix Agent Zabbix监控系统具体监控系统流程如图: Zabbix Web Zabbix Web是基于PHP语言编写的WEB UI界面,展示Zabbix整个监控平台监控数据、配置信息、方便对整个…

SQL Server 2012下载和安装配置详细教程手册

SQL Server 2012 下载和安装详细教程 目录 SQL Server 2012 下载和安装详细教程1、软件下载2、软件安装3、软件验证 1、软件下载 (1)官网地址 https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads (可能不太行) &a…

家庭安全不容小觑!青犀AI智能分析算法+摄像头助力家庭安全

你知道吗?高层家庭更需要人工摄像头!虽然现在社会治安十分稳定,高层建筑更是安全,但高层盗窃、陌生人入室这些新闻还是层出不穷,为了解决这些安全隐患,给广大人民一个安心的生活环境,旭帆科技将…

Android MeidiaCodec之OMXPluginBase与QComOMXPlugin实现本质(四十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

Flink报错处理-1

在 flink job 运行一段时间后,观察日志发现出现了如下的 warn日志: The operator name {} exceeded the {} characters length limit and was truncated 完整的 warn 日志如下: The operator name TriggerWindow(GlobalWindows(), ListStat…

机器学习技术(十)——决策树算法实操,基于运营商过往数据对用户离网情况进行预测

机器学习技术(十)——决策树算法实操 文章目录 机器学习技术(十)——决策树算法实操一、引言二、数据集介绍三、导入相关依赖库四、读取并查看数据1、读取数据2、查看数据 五、数据预处理1、选择数据2、数据转码 六、建模与参数优…

OPC是通讯协议吗安全性

目录 1 安全防护 1.1 防火墙 1.2 网闸 2 OPC是通讯协议吗 2.1 什么通讯协议 2.2 那么OPC又是什么? OPC官方说明文档 1 安全防护 本文阐述了控制网络以OPC接口接入信息网络应当采用的安全防护。 1.1 防火墙 防火墙是大家熟知的网络安全产品,并被用作控制网…

Jmeter —— 常用的几种断言方法(基本用法)

在使用JMeter进行性能测试或者接口自动化测试工作中,经常会用到的一个功能,就是断言,断言相当于检查点,它是用来判断系统返回的响应结果是否正确,以此帮我们判断测试是否通过,本文 主要介绍几种常用的断言&…

【服务器 | 测试】如何在centos 7上面安装jmeter

安装之前需要几个环境,以下是列出的几个环境 CentOS 7.7 64位JDK 1.8JMeter 5.2 1. 下载jmeter安装包 JMeter是开源的工具,安装 JMeter 要先安装好 JDK 的环境,安装JDK在前面的文章已经讲到 JMeter最新版下载地址:Apache JMeter…

[npm]npm包的分类

[npm]npm包的分类 工具包的安装工具包的使用工具包的开发工具包的发布 node 与 npm 是一体的,只要安装了 node 的环境,那么你就可以使用 npm 命令,npm 是一个包管理工具; 自从可以使用 npm 后,npm 库中增加了各种包&a…

Git(8)——Git命令总结

一、简介 本篇文章将基于Git(4)——Git命令小总结,补充后续的Git使用命令 二、总结 # 添加远程连接 git remote add origin 远端地址# 推送本地代码 git push origin 分支名称# 拉取远端代码(第一次) git clone 远端克隆地址# 更新远端代码…

Windows本地mysql 的安装教程(一步一步进行安装)

目录 1 下载安装包2 安装 1 下载安装包 下载网址: https://dev.mysql.com/downloads/ 选择这个 2 安装 编写MySQL配置文件 在解压目录下新建my.ini文件 将下面文本拷贝进my,ini文件中 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 ----------…

Xline 源码解读(三) —— CURP Server 的实现

在上一篇文章Xline 源码解读(一) —— 初识 CURP 协议当中,我们对 CURP Protocol 进行了一个初步的介绍。接下来,就让我们话接上回,来一起看看 CURP Server 的内部实现吧。 01、Curp Crate 的源码组织 现在&#xff…

RCNA 锐捷培训

第一章 网络基础入门 1.1 OSI参考模型及TCP/IP协议栈 数据是如何传输的? 数据在计算机网络中传输通常依赖于TCP/IP协议模型。 什么是网络? 网络是一种连接多个计算机、设备或系统的通信基础设施,其目的是实现资源共享、信息传递、接收和共享…

Python技巧---tqdm库的使用

文章目录 一、tqdm基本知识二、在pytorch中使用tqdm 提示:以下是本篇文章正文内容,下面案例可供参考 一、tqdm基本知识 “tqdm” 是一个 Python 库,用于在命令行界面中创建进度条。 基本使用如下: from tqdm import tqdm impor…

创建UI账号密码登录界面

头文件 #ifndef MYWND_H #define MYWND_H#include <QPushButton> #include <QMainWindow>class MyWnd : public QMainWindow {Q_OBJECTpublic:MyWnd(QWidget *parent nullptr);~MyWnd(); }; #endif // MYWND_H 源文件 #include "mywnd.h" #include &…