Redis的基本操作与应用(附相关面试题...)

news2025/1/4 21:07:26

一、数据类型与操作步骤

1、概述:Redis是一款基于内存KV键值对存储的中间件技术,常用做缓存,支持数据持久化

2、数据类型: 

常用5种数据类型:String(字符串)、List(列表)、set(集合)、hash(哈希)、zset(有序集合)

结构类型结构存储的值应用
String(字符串)可以是字符串、整数或浮点数计数、共享session信息
List(列表)双向链表,链表上的每个节点都包含一个字符串消息队列
set(集合)包含字符串的无序集合聚合(交并差),点赞,抽奖,共同关注
hash(哈希)包含键值对的无序散列结合缓存对象,购物车
zset(有序集合)和散列一样,用于存储键值对(score字段排序)排行榜

3、Java操作Redis步骤

        步骤一:导入坐标

        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

        步骤二: 在application.properties中添加redis相关配置

# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=192.168.0.24
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=10
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=1000

        步骤三:在需使用Redis的地方@Autowired装配

@Autowired;

private RedisTemplate redisplate;

Spring-data-redis后它为我们提供了两个模板类帮助我们实现CRUD:

(1)RedisTemplate key value泛型都是object

(2)StringRedisTemplate key value泛型都是string

注意:

  • 两者数据各自存,各自取,数据不互通。 RedisTemplate不能取StringRedisTemplate存入的数据,StringRedisTemplate不能取RedisTemplate存入的数据
  • 序列化策略不同: RedisTemplate采用JDK的序列化策略(JdkSerializationRedisSerializer)保存的key 和value ; StringRedisTemplate采用String的序列化策略(StringRedisSerializer)保存的key和 value
  • 两者的关系是StringRedisTemplate继承RedisTemplate
  • 使用场景: 当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那 么你就使用StringRedisTemplate即可。 但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取 出一个对 象,那么使用RedisTemplate是更好的选择。

五大数据类型 :  redisTemplate.opsForValue();//操作字符串 *

                        redisTemplate.opsForList();//操作List *

                        redisTemplate.opsForSet();//操作Set *

                        redisTemplate.opsForZSet();//操作ZSet *

                        redisTemplate.opsForHash();//操作Hash *

二、应用

应用点1: Redis的set集合+任务调度====》定时清理"脏数据"

例如:添加套餐信息时,有套餐图片的选择,上传至七牛云服务器返回一个文件名存入数据库。

在实际项目中为提高用户体验,选择文件后就会上传至服务器。但用户选择图片后若选择取消按钮,那么服务器上就会产生“脏写”。解决这一问题可引入Redis,当用户选择图片上传至服务器后返回的文件名存入key为serverPic的set集合中,点击添加按钮后将写入数据库的同时把文件名再存入到一个key为dbPic的set集合中。启动任务调度对serverPic与dbPid作差集遍历删除服务器的文件与Redis中的文件名。

异步上传图片文件接口代码:

添加按钮请求的接口:

启动任务调度:

应用点2:在预约套餐时向邮箱发验证码进行身份验证(5分钟内有效)

选择预约套餐后填写基本信息,点击发送验证码:以邮箱作为key,验证码内容为value存储至Redis中并设置key的有效时间为5分钟,信息输入点击提交会将输入的验证码与Redis中的码做比对

发送邮件并存储验证码至Redis:

与Redis中的数据比对:

三、面试题整理

下面补充一些面试中Redis的相关问题:

1、redis有什么作用?为什么要用redis?

(1)高性能:假如用户是第一次访问数据库中的某些数据,这个过程是比较慢,毕竟是硬盘中读取。但是,如果说,用户访问的数据属于高频数据并且不经常改变的话,那么我们就可以很放心地将用户访问的数据存在缓存中。保证用户下一次在访问的时候就可以直接从缓冲中获取了,操作缓存就是直接操作内存,速度会很快

(2)高并发:一般像MYSQL这里的数据库QPS大概在1W左右,但是使用redis缓存很容易达到10W+

QPS:服务器每秒可以执行的查询次数

直接操作缓存能够承受的数据库请求数量远远大于直接访问数据库的,所有我们可以考虑把数据库中的部分数据转移到缓存中,这样用户的一部分请求会直接到缓存这里而不用经过数据库。进而,提高了系统整体的并发

2、redis给缓存数据设置过期时间有什么用?

因为内存是有限的,如果缓存中的所有数据都是一直保存的话,很容易Out Of Memory

Redis自带了给缓存数据设置过期时间的功能

注意:Redis中除了字符串类型有自己独有设置过期时间的命令setex外,其他数据类型都需要依靠expire命令来设置过期时间。另外persist命令可以移除一个键的过期时间。

应用场景:需要某个数据只在某一段时间段内存在,如验证码3分钟内有效

3、redis是如何判断数据是否过期呢?过期数据的删除策略了解过吗?

Redis通过一个叫做过期字典(可以看作是hash表)来保存数据过期的时间。过期字典的键指向Redis数据库中某个key,过期字段的值是一个long long类型的整数,这个整数保存了key所指向的数据库键的过期时间(毫秒精度的UNIX时间戳)

过期字典存储在redisDB中

typedef struct redisDb {
    dict *dict;     //数据库键空间,保存着数据库中所有键值对
    dict *expires   // 过期字典,保存着键的过期时间
    ...
} redisDb;

常用的过期数据的删除策略就两个:

(1)惰性删除:只会在取出key的时候才对数据进行过期检查。这样对cpu最友好,但是可能会早晨太多过期key没有被删除

(2)定期删除:每隔一段时间抽取一批key执行删除过期key操作。并且,Redis底层会通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响

定期删除对内存更加友好,惰性删除对CPU更加友好。两者各有千秋,所以Redis采用的是定期删除+惰性删除

4、什么是缓存穿透?怎么解决?雪崩呢?

缓存穿透

缓存穿透是指用于请求的数据在缓存中不存在即没有命中,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍,然后返回空。

如果有恶意攻击者不断请求系统中不存在的数据,会导致短时间大量请求落在数据库上,造成数据库压力过大,甚至击垮数据库系统。

缓存穿透常用解决方案

1、布隆过滤器 2、返回空对象

1、布隆过滤:布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思 想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问 redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数 据后,再将其放入到redis中, 假设布隆过滤器判断这个数据不存在,则直接返回 这种方式优点在于节约内存空间,存在误判,误判原因在于:布隆过滤器走的是哈希思想,只要哈希思 想,就可能存在哈希冲突

2、缓存空对象思路分析:当我们客户端访问不存在的数据时,先请求redis,但是此时redis中没有数据, 此时会访问到数据库,但是数据库中也没有数据,这个数据穿透了缓存,直击数据库,我们都知道数据 库能够承载的并发不如redis这么高,如果大量的请求同时过来访问这种不存在的数据,这些请求就都会 访问到数据库,简单的解决方案就是哪怕这个数据在数据库中也不存在,我们也把这个数据存入到redis 中去,这样,下次用户过来访问这个不存在的数据,那么在redis中也能找到这个数据就不会进入到缓存

缓存雪崩是指缓存中数据大批量过期时间,而查询数据量巨大,请求直接落在数据库上,引起数据库压力过大甚至宕机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库

解决方案:给不同key的TTL添加随机值、利用Redis集群提高服务可用性

给缓存业务添加降级限流策略、给业务添加多级缓存

缓存击穿问题也叫热点key问题,就是一个高并发访问并且缓存重建业务比较复杂的key突然失效了,无数的请求访问会再瞬间给数据库带来巨大的冲击。常见的解决方案有两种:互斥锁、逻辑过期

5、redis内存淘汰机制了解吗?

6种淘汰策略,Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据;

○no-eviction:当内存不足以容纳新写入数据时,新写入操作会报错;

○allkeys-lru: 当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key; ○allkeys-random: 当内存不足以容纳新写入数据时,在键空间中,随机移除某个key; ○volatile-Iru: 当内存不足以容纳新写入数据时,在设置了过期时间的键健空间中,移除最近最少使用的key;

○volatile-random: 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key;

○volatile-ttl: 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除;

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

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

相关文章

GaussDB数据库SQL系列-数据去重

目录 一、前言 二、数据去重应用场景 三、数据去重案例&#xff08;GaussDB&#xff09; 1、示例场景描述 2、定义重复数据 3、制定去重规则 4、创建测试数据&#xff08;GaussDB&#xff09; 5、编写去重方法&#xff08;GaussDB&#xff09; 6、附&#xff1a;全字段…

【Linux安装java环境】超简单,以jdk8为例

文章目录 前言详细步骤总结 前言 一些小伙伴在到手一台虚拟机后&#xff0c;发现需要配置java环境&#xff0c;看了文章后会发现超级简单&#xff0c;以下内容以安装jdk1.8为例。 详细步骤 查看是否存在java环境java -version若弹出找不到java命令&#xff0c;执行下一步。官…

【2023高教社杯】C题 蔬菜类商品的自动定价与补货决策 问题分析、数学模型及python代码实现

【2023高教社杯】C题 蔬菜类商品的自动定价与补货决策 1 题目 C题蔬菜类商品的自动定价与补货决策 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&…

BLE架构与开源协议栈

BLE架构&#xff1a; 简单来说&#xff0c;BLE协议栈可以分成三个部分&#xff0c;主机(host)程序&#xff0c;控制器(controller)程序&#xff0c;主机控制器接口(HCI)。如果再加上底层射频硬件和顶层用户程序&#xff0c;则构成了完整的BLE协议&#xff0c;如下图所示&#…

@Autowired为什么会报错?如何解决?

作者 | 磊哥 来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09; 转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09; Autowired报错信息相信大部分程序员都遇到过&#xff0c;奇怪的是虽然代码报错&#xff0c;但丝毫不影响程序的正常执行&…

第一次去新加坡Token2049?这份行前攻略请收好

TOKEN2049是行业领先的Web3盛会&#xff0c;往届的Token2049&#xff0c;知名项目的创始人主会场遍地跑&#xff0c;了解亚洲区块链前沿&#xff0c;BD更多新项目&#xff0c;寻找潜在投资机会&#xff0c;Token2049不会让你失望。 Moonbeam中文社区今年也会出席Token2049系列活…

安科瑞智能微型断路器在某银行网点的设计与应用

安科瑞 崔丽洁 【摘要】&#xff1a;随着人工智能、移动互联等现代信息技术和通信技术在电力行业的应用&#xff0c;实现电力系统各个环节人机交互、万物互联&#xff0c;打造状态全方面感知、信息合理处理、应用便捷灵活的泛在电力物联网已成为必然趋势。本文主要对智能微型断…

C++ 围炉札记

文章目录 内存检测ProtoBufCMake、vscode、clion、Qt右值1、临时变量右值引用2、右值引用本质 函数返回std::functionPOD&#xff08;Plain Old Data&#xff09;thread_localnew / delete1、定位new运算符 可变参数模板typename和class1、C模板类头文件和实现文件分离的方法2、…

BT8959T2/5 LCD 驱动

1 Preface/Foreword LCD驱动路径&#xff1a;app/gui/lcd/ SDK默认的LCD驱动&#xff1a;lcd_gc9c01.c 2 数据结构 3 代码分析

高忆管理:科创板中签率?

科创板于当时已经成为出资者追捧的板块&#xff0c;许多新股都在科创板上市&#xff0c;那么科创板新股的中签率是高仍是低呢&#xff1f;是取决于哪些要素形成的呢&#xff1f;下面&#xff0c;本文将从多个角度剖析这个问题。 一、科创板中签率是什么&#xff1f; ​ 科创…

LeetCode 1126.查询活跃业务

数据准备 Create table If Not Exists Events (business_id int, event_type varchar(10), occurences int); Truncate table Events; insert into Events (business_id, event_type, occurences) values (1, reviews, 7); insert into Events (business_id, event_type, occu…

三段视频怎么合并在一起?三种方法教你快速合并

合并视频可以节省存储空间。如果我们有多个视频文件&#xff0c;每个文件可能需要一定的存储空间。但是&#xff0c;如果将它们合并到一个文件中&#xff0c;就可以节省存储空间并更轻松地管理文件。此外合并视频还使其更易于共享。如果需要将视频发送给其他人&#xff0c;您只…

Python实操:内存管理与优化策略

在 Python 开发过程中&#xff0c;合理有效地管理和优化内存使用是提高程序性能和效率的关键。本文将深入探讨 Python 中的内存管理机制&#xff0c;并分享一些实用的优化策略和具体操作步骤&#xff0c;帮助您更好地利用资源、减少内存占用并提升代码执行速度。 一、了解 Pyth…

【Python】【Fintech】解决用pandas_datareader从yahoo下载股票数据时出错

【背景】 要做一个预测投资组合portfolio未来收益的python脚本,类似的功能需要从数据源获取相关指数和股票的数据,一直以来都是用pandas_datareader从yahoo上面拿,但是后来忽然发现不能用了,这篇就说明一下遇到此问题的walk around. 【分析】 由于数据源是yahoo那边的,…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十二:通用详情组件封装实现

一、本章内容 本章实现通用详情组件,自动识别实体配置信息,并自动生成对应组件,填充组件数据,并完成数据自动加载等过程。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 3.1 B站视频地址࿱

Vue 前端项目使用alibaba矢量库svg图标

Vue 前端项目使用alibaba矢量库svg图标 这里主要是记录 vue项目中使用阿里矢量库图标的操作流程&#xff0c;方便以后查阅&#xff01;&#xff01;&#xff01; 一、简介 iconfont 是由阿里巴巴体验团队打造的&#xff0c;一款设计和前端开发的便捷工具.拥有着很强大且图标内…

手把手教你在视频剪辑及数字人训练中花式抠图

本文为阿里云智能媒体服务IMS「云端智能剪辑」实践指南第三期&#xff0c;讲述围绕 视频剪辑及数字人训练中的抠图需求&#xff0c;如何运用 绿幕抠图、实景抠图能力&#xff0c;实现高效、便捷的视频制作及合成体验。 昱尘&#xff5c;作者 悬刃&#xff5c;算法支持 “你这背…

达梦数据库awr报告收集

1、找出快照点snap_id与时间的对应关系 SYS.WRM$_SNAPSHOT表中记录了快照点snap_id与时间的对应关系 例如如下语句可以得出2023-09-04这一天各个时间点对应的快照点snap_id select snap_id,end_interval_time from SYS.WRM$_SNAPSHOT where end_interval_time between to…

亚马逊鲲鹏系统多渠道引流功能快速增加你的listing流量

如果亚马逊Listing没有流量&#xff0c;那么亚马逊产品排名也会在很靠后的位置&#xff0c;从而就会导致吸引不到客户点击进行下单购买&#xff0c;因此引流就很重要了&#xff0c;普通的引流方法很难达到效果&#xff0c;并且还会花费大量的时间&#xff0c;那么我们可以用亚马…

Elasticsearch实现词云效果Demo

文章目录 前言前期准备springbootElasticsearch依赖 思路准备数据查询数据处理文本样式处理 具体实施数据准备创建索引数据存储进行查询 踩坑记录聚合查询不生效问题 demo地址总结 前言 最近项目中使用Elasticsearch在做快速查询的功能&#xff0c;然后就想到了之前的一个项目…