初识Redis

    • 简介Redis
    • Redis安装
    • 怎么远程连接
    • 基础命令
    • 常用类型
      • 字符串类型
      • 字典类型
      • 列表类型
      • 集合类型
      • 有序集合类型
    • spring boot集成Redis
      • 代码操作Redis
    • 实现一个session储存到redis
    • 持久化
      • 缓存雪崩
      • 缓存穿透
      • 缓存击穿
      • 缓存预热
    • 项目升级之Redis储存Session

简介Redis

Redis是一种内存数据存储系统,也被称为键值存储系统。之所以能这么快;因为他的数据是储存在内存中;在内存就意味着可能会因为断电关机而丢失;但是我们的云服务器是7*24小时工作的;而Redis也是有持久化机制;把数据写入硬盘里(RDB、AOF等)
Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合。它可以存储非结构化数据(文本、图片、音频),适用于缓存、队列等场景。
如果session存在内存:只能单机部署;存在Redis到时候大家都连接这个redis;实现分布式。(假设我觉得一台服务器处理100w客户端压力很大;所以我选择两台服务器;用Redis就不会说有台服务器是没有Session的情况)

Redis安装

官方的redis只提供了linux版本。windows装的那都是绿色版本;我们在Xshell上所以:yum -y install redis

Redis启动:以后台方式运行
redis-server /etc/redis.conf& (默认是在etc路径)

启动redis客户端:redis-cli (这里注意不能带空格)

在这里插入图片描述

怎么远程连接

1.将 redis 配置文件下载到本地: redis 配置文件是 linux 下的 /etc/redis.conf ;
找到你要下载的文件;路径+文件名。通过sz /路径+文件名;然后会谈出一个框让你选择下载到哪里
在这里插入图片描述

2.将 redis.conf 中的"bind 127.0.0.1”注释掉
在这里插入图片描述

3.将 redis.conf 中的“protected-mode yes”改为“protected-mode no"
在这里插入图片描述

4.将修改后的 redis.conf 上传至 liunx 下的 /etc 目录;(将文件拖进去就能上传;亲测:得把原先的redis.conf配置文件删除掉再上传;记得云服务器端口开放一下)
5.使用命令“redis-cli shutdown” 先关 redis 服务,再使用“redis-server /etc/redis.conf &"启动 redis 服务。

安装Redis可视化客户端:如有需要的伙伴私我发你;我会在第一时间分享与你;Redis没有用户名;6.0以后才有用户名
在这里插入图片描述

基础命令

操作命令:官方文档
多问问chatgpt;一般我们都是通过代码来操作的比较多;

常用类型

字符串类型

key-value:
在这里插入图片描述
String类型也能相加
在这里插入图片描述

设置过期时间:
在这里插入图片描述
使用场景:存用户登录信息、文章信息、列表信息、累计网页统计信息。string可以存万物;哪怕是对象也能按json存;只是要转来转去

字典类型

字典类型(Hash) 又被成为散列类型或者是哈希表类型,它是将一个键值(key) 和一个特殊的“哈希表”关联起来,这个“哈希表”表包含两列数据: 字段和值,它就相当于 Java 中的Map<String,Map<String,String>> 结构。套娃是吧!
在这里插入图片描述
使用:
在这里插入图片描述

设置多个:
在这里插入图片描述
但是这个设置多个是有问题的;这一个起始的版本是4.0。我们装的是3.多;所以这个是用不了的
在这里插入图片描述

使用HMSET设置多个时:
在这里插入图片描述

使用场景:用户对象;把用户id、用户名、创建时间都传进来;

列表类型

列表类型(list)是一个使用链表结构存储的有序结构,它的元素插入会按照先后顺序存储到链表结构中,因此它的元素操作(插入和删除)时间复杂度为 O(1),所以相对来说速度还是比较快的,但它的查询时间复杂度为 O(n).因此查询可能会比较慢
在这里插入图片描述
使用场景:
消息队列: 列表类型可以使用 push 实现先进先出的功能,同时又可以使用 pop 轻松的弹出(查询并删除)第一个元素,所以列表类型可以用来实现简单消息队列;
文章列表:对于博客站点来说,当用户和文章都越来越多时,为了加快程序的响应速度,我们可以把用户自己的文章存入到 List 中,因为 List 是有序的结构,所以这样又可以完美的实现分页功能,从而加速了程序的响应速度。

集合类型

list是先进先出;可以重复;set不可以重复;如果存的重复就合并数据;
在这里插入图片描述
使用场景:去重复
微博关注我的人和我关注的人都适合用集合存储,可以保证人员不会重复;
中奖人信息也适合用集合类型存储,这样可以保证一个人不会重复中奖

集合类型 (Set) 和列表类型 (List) 的区别如下:
列表可以存储重复元素,集合只能存储非重复元素
列表是按照元素的先后顺序存储元素的,而集合则是无序方式存储元素的。

有序集合类型

能保证顺序;能根据用户设置的值进行排序:
有序集合类型(Sorted Set) 相比于集合类型多了一个排序属性 score (分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序结合的元素值,一个是排序值。有序集合的存储元素值也是不能重复的,但分值是可以重复的。
在这里插入图片描述
在这里插入图片描述
使用场景:学生成绩排名;粉丝列表;根据关注的先后时间排序
在这里插入图片描述

spring boot集成Redis

上述类型;字符串类型最常用;我们需要通过spring boot项目操作这些数据类型;连接redis

1:添加依赖
在这里插入图片描述

2:添加配置
如果你有设置密码;那这里就要写密码;key=value;默认的database有16个;而我们选择默认的是0。edis不能像MySQL自己建数据库。
如果超过16个;那就再搭建用一个redis服务器。
spring data redis底层基于lettuce设置的;所以我们这里可以设置lettuce的信息;相当于你设置redis。。后面这些可以选择性设置
默认是在内存;但是可以在磁盘;;你可以认为有两份数据;一份在内存;一份在硬盘。。内存的是最新的;磁盘里的会隔一段时间更新
在这里插入图片描述
最基本设置项:
在这里插入图片描述

代码操作Redis

注意:如果是专业版idea;@Autowired会提示报错;但是不影响效果

RedisTemplate是Spring Framework中的一个类,用于在Java应用程序中与Redis数据库进行交互的工具。它提供了一种方便的方式来执行常见的Redis操作,如存储、检索和删除数据,以及执行一些高级操作如事务和管道。通过RedisTemplate,您可以在Java代码中操作Redis数据库,而无需直接处理底层的Redis命令。这对于在Spring应用程序中使用Redis作为数据存储和缓存非常有用。

先获取操作的opsFor……;获取操作的类型。字符串类型就是value。很多重载的方法;你想操作什么类型就获取什么类型

在这里插入图片描述
注意:默认是没有设置过期时间;负1
具体代码:

@RestController
public class RedisController {@Resourceprivate RedisTemplate redisTemplate;@RequestMapping("/save")public String save() {redisTemplate.opsForValue().set("userinfo", "zhangsan");return "ok";}@RequestMapping("/get")public Object get() {return redisTemplate.opsForValue().get("userinfo");}//操作哈希@RequestMapping("/save2")public String save2() {redisTemplate.opsForHash().put("myhash", "username", "lisi");return "ok";}@RequestMapping("/get2")public Object get2() {return redisTemplate.opsForHash().get("myhash", "username"); // lish}}

执行:我们现在去浏览器输入这个url;触发这些执行
在这里插入图片描述
效果:发现Redis确实有点东西
在这里插入图片描述

实现一个session储存到redis

需要添加多这个依赖:
在这里插入图片描述
配置信息;这些都建议设置一下;namespace相当于新建文件夹储存。
在这里插入图片描述
spring.session.store-type=redis:指定将会话(Session)数据存储在Redis数据库中
spring.session.redis.flush-mode=on_save :意味着您选择了默认的刷新模式,即在会话数据发生变化时将其刷新到Redis中。
server.servlet.session.timeout :设置会话(Session)的超时时间的
spring.session.redis.namespace: 用来指定会话存储在Redis数据库中的命名空间(namespace);相当于新建文件夹储存。
存Session:还是之前的方式;不需要去改;httpSession还是白送的;只需要添加依赖和配置就行了。这就存进去了。存的时候会自动调用这个框架;把你的session存到redis里。

存字符串:
在这里插入图片描述

取字符串:
session.getAttribute(SESSION_KEY_USERINFO);

存对象:
存字符串不是关键;我们要存对象比较关键;比较对象的作用范围广很多;但是有坑

现在这是一个对象:使用上述的方法去存
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
序列化的时候报错;当然是没有匹配的对象啊。实现了这个接口才能序列化(将对象转换为字节流)和反序列化(将字节流转换回对象)。这样子的话;他储存会使用哈希map储存。

在这里插入图片描述
为什么要这样子呢?
1:数据持久化;内存数据库的数据是易失性的,意味着如果服务器重启或断电,所有数据将丢失。为了保证数据的持久性,可以将数据存储在硬盘上的持久化文件中。在这种情况下,需要将数据序列化为字节流,以便将其写入持久化文件,然后在重新加载时将其反序列化为对象。
2:网络传输;Redis是一个多语言支持的数据库,它可以被多种编程语言访问和操作。不同的编程语言使用不同的对象表示方法,通过将对象序列化为通用的字节流,可以跨语言地存储和检索数据。
3:存储优化;当对象需要在不同的机器或不同的进程之间进行传输时,需要将对象转换为字节流以进行网络传输。字节流可以在网络上进行传输,并在目标机器或进程上反序列化为对象。这在分布式系统中非常常见,以便不同部分之间共享数据。
4:支持多种编程语言;Redis是一个键值存储数据库,存储的是键和值对。值可以是字符串、哈希、列表等数据结构,但它们都需要被转换为字节流来存储在Redis中。序列化使得存储更加紧凑,节省了内存和存储空间。

如果不想序列化;加这个东西把它排除掉;就没法存进去的。现在你再设置这个age;他也不会读到这个;序列化把这个忽略了。
在这里插入图片描述

持久化

持久化:将数据保存在硬盘;而不是一直在内存;防止数据的丢失
Redis持久化方式:
RDB:快照方式;将某⼀个时刻的内存数据,以⼆进制的⽅式写⼊磁盘;
AOF:文件追加方式;记录所有的操作命令,并以⽂本的形式追加到⽂件中;
RDB、AOF结合:混合持久化方式;Redis 4.0 之后新增的⽅式,混合持久化是结合了 RDB 和 AOF 的优点,在写⼊
的时候,先把当前的数据以 RDB 的形式写⼊⽂件的开头,再将后续的操作命令以 AOF 的格式存⼊⽂件,这样既能保证 Redis 重启时的速度,⼜能减低数据丢失的⻛险。
如何切换呢?
redis-cli 命令⾏中执⾏ config set aof-use-rdb-preamble yes 来开启混合持久化,当开启混合持久化时 Redis 就以混合持久化⽅式来作为持久化策略;当没有开启混合持久化的情况下,使⽤ config set appendonly yes 来开启 AOF 持久化的策略,当 AOF 和混合持久化都没开启的情况下默认会是 RDB 持久化的⽅式。

优缺点:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

缓存雪崩

缓存雪崩是指在短时间内,有⼤量缓存同时过期,导致⼤量的请求直接查询数据库,从⽽对数据库造成了巨⼤的压⼒,严重情况下可能会导致数据库宕机的情况叫做缓存雪崩。
如果都不设置过期时间行不行;永久的;不会过期。这样子持久化的时候压力就会很大;刚开始RGB;刚开始有用信息可能存个10mb;全部都不过期;那么存个100mb。
解决方案:所以加锁排队执行(增加系统响应时间会牺牲一些用户体验);或者随机过期时间;再或者设置二级缓存;Redis失效就先去查二级缓存而不是直接查数据库

设置随机过期时间

// 缓存原本的失效时间
int exTime = 10 * 60;
// 随机数⽣成类
Random random = new Random();
// 缓存设置
jedis.setex(cacheKey, exTime+random.nextInt(1000) , value);

缓存穿透

缓存穿透是指查询数据库和缓存都⽆数据,因为数据库查询⽆数据,出于容错考虑,不会将结果保存到缓存中,因此每次请求都会去查询数据库,这种情况就叫做缓存穿透。也会给数据库造成很大压力。
就是你叫给我托管;但是你啥都没有。用户向我拿东西;发现什么都没有;就一直找数据库拿。数据库也是什么都没有。
在这里插入图片描述
解决方案:
空值缓存:当一个请求查询的结果在数据库中不存在时,可以将这个空结果也缓存起来,设置一个较短的过期时间。我们在缓存中存储一个表示空结果的占位值,并为这个占位值设置一个较短的过期时间,当请求到达时,即使缓存中没有有效的数据,也会返回这个空结果。由于过期时间较短,这个占位值会很快从缓存中移除。

缓存击穿

缓存击穿指的是某个热点缓存,在某⼀时刻恰好失效了,然后此时刚好有⼤量的并发请求,此时这些请求将会给数据库造成巨⼤的压⼒,这种情况就叫做缓存击穿。

解决方案:
加锁排队:
此处理⽅式和缓存雪崩加锁排队的⽅法类似,都是在查询数据库时加锁排队,缓冲操作请求以此来减少服务器的运⾏压⼒。
设置永不过期:
把热点的设置不过期;这样子就不会去请求数据库,但需要注意在数据更改之后,要及时更新此热点缓存,不然就会造成查询结果的误差。

缓存预热

系统启动的时候,先把查询结果预存到缓存中,以便⽤户后⾯查询时可以直接从缓存中读取,以节约⽤户的等待时间。
应用程序启动就先查询数据库然后同步到缓存中:
在这里插入图片描述
实现的三种思路:
1: 把需要缓存的⽅法写在系统初始化的⽅法中,这样系统在启动的时候就会⾃动的加载数据并缓存数据
2:把需要缓存的⽅法挂载到某个⻚⾯或后端接⼝上,⼿动触发缓存预热;
3:设置定时任务,定时⾃动进⾏缓存预热。

项目升级之Redis储存Session

在这里插入图片描述

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

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

相关文章

open cv学习 (四)图像的几何变换

图像的几何变换 demo1 # dsize实现缩放 import cv2 img cv2.imread("./cat.jpg") dst1 cv2.resize(img, (100, 100)) dst2 cv2.resize(img, (400, 400)) # cv2.imshow("img", img) # cv2.imshow("dst1", dst1) # cv2.imshow("dst2&quo…

华人画家戴渭作品 3000 万拍出,牛津艺术学院发出任教邀请

爱丁堡,2023年7月 - 画家戴渭以他独特的画风、深邃的意境和慈悲智慧的属性,将艺术与宗教融合于作品之中。初看他的作品,可能会被其高超的艺术水准所震撼,然而仔细品味,方能领略到他深邃的艺术造诣与宗教智慧的深度融合。 作为国内最年轻的华人80后画家之一,戴渭近期被英国牛津…

数据库知识

怎么做 常见的数据库 Oracle Mysql SOLSever Navicat &#xff08;新版可以链接mysql oracle&#xff09; http://sqlfiddle.com/ 数据库操作在线练习 mysql自带四个数据库 数据库语言的使用 显示数据库&#xff1a;show databases&#xff1b; 创建数据库&#xff1a;…

linux笔试题

1&#xff0c;nginx中设定js,css,文件的过期时间为5分钟 location ~.*\.(js|css)?$ { expires 5m; } 2, 请解读以下Nginx配置文件的执行内容 http {map $http_x_forwarded_for $blocked_ip {~*^(31\.41\.244\.|141\.98\.11\.) 1;default 0;}upstream backend {ip_hash;…

【高级IO】- 多路转接之 poll | epoll

目录 I/O多路转接 - poll poll 函数 poll 服务器 poll 服务器 poll 的优点 poll 的缺点 I/O 多路转接 - epoll epoll 的相关系统调用 epoll_create 函数 epoll_ctl 函数 epoll_wait 函数 epoll 工作原理 epoll 服务器 ​编辑 epoll 的优点&#xff08;与 sele…

Go语言基础:Interface接口、Goroutines线程、Channels通道详细案例教程

目录标题 一、Interface1. Declaring and implementing an interface2. Practical use of an interface3. Nterface internal representation4. Empty interface5. Type assertion6. Type switch7. Implementing interfaces using pointer receivers VS value receivers8. Impl…

使用Ftp服务器+快解析软件,让你的文件随时随地可访问

你是否曾经遇到过这样的情况&#xff1f;你在办公室工作到很晚&#xff0c;突然想起家里的电脑里有重要文件&#xff0c;但却无法立即访问&#xff1f;或者你想要和朋友分享一些照片&#xff0c;却发现你的电脑和他们之间的距离太远&#xff0c;无法直接传输文件&#xff1f;如…

Win系统下安装Linux双系统教程

软件下载 软件&#xff1a;Linux版本&#xff1a;18.0.4语言&#xff1a;简体中文大小&#xff1a;1.82G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①丨百度网盘&#xff1a;1.ubuntu18.0.4下载链接&#xf…

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本…

C语言,Linux,静态库编写方法,makefile与shell脚本的关系。

静态库编写&#xff1a; 编写.o文件gcc -c(小写) seqlist.c(需要和头文件、main.c文件在同一文件目录下) libs.a->去掉lib与.a剩下的为库的名称‘s’。 -ls是指库名为s。 -L库的路径。 makefile文件编写&#xff1a; CFLAGS-Wall -O2 -g -I ./inc/ LDFLAGS-L./lib/ -l…

c# 实现sql查询DataTable数据集 对接SqlSugar ORM

有时候对于已经查询到的数据集&#xff0c;想要进行二次筛选或者查询&#xff0c;还得再查一遍数据库 或者其他的一些逻辑处理不太方便&#xff0c;就想着为什么不能直接使用sql来查询DataTable呢&#xff1f; 搜索全网没找到可用方案&#xff0c;所以自己实现了一个。 主要…

HTTP连接管理

基础知识&#xff1a;非持久连接 HTTP初始时1.0版本在浏览器每一次向服务器请求完资源都会立即断开TCP连接&#xff0c;如果想要请求多个资源&#xff0c;就必须建立多个连接&#xff0c;这就导致了服务端和客户端维护连接的开销。 例如&#xff1a;一个网页中包含文字资源也包…

Stable Diffusion的使用以及各种资源

Stable Diffsuion资源目录 SD简述sd安装模型下载关键词&#xff0c;描述语句插件管理controlNet自己训练模型 SD简述 Stable Diffusion是2022年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像&#xff0c;尽管它也可以应用于其他任务&#xff0c;如…

MySQL之索引和事务

索引什么是索引索引怎么用索引的原理 事务使用事务事务特性MySQL隔离级别 索引 什么是索引 索引包含数据表所有记录的引用指针&#xff1b;你可以对某一列或者多列创建索引和指定不同的类型&#xff08;唯一索引、主键索引、普通索引等不同类型&#xff1b;他们底层实现也是不…

Vue 2 组件注册

组件名的命名规则 定义组件名的两种方式&#xff1a; 短横线分隔命名&#xff0c;Kebab Case&#xff0c;例如my-component-name。单词首字母大写命名&#xff0c;Pascal Case&#xff0c;例如MyComponentName。 第一种方式在模板中使用<my-component-name>引用该元素…

FastDFS与Nginx结合搭建文件服务器,并实现公网访问【内网穿透】

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

Asyncio support

Python 3.4及更高版本中内置的asyncio模块可用于在单个线程中编写异步代码。此库支持使用can.Notifier类在事件循环中异步接收消息。 每个CAN总线仍将有一个线程,但用户应用程序将完全在事件循环中执行,从而实现更简单的并发性,而无需担心线程问题。但是,具有有效文件描述…

常用的图像校正方法

在数字图像处理中&#xff0c;常用的校正方法包括明场均匀性校正、查找表&#xff08;LUT&#xff09;校正和伽玛&#xff08;Gamma&#xff09;校正。这些校正方法分别针对不同的图像问题&#xff0c;可以改善图像质量&#xff0c;提升图像的可读性和可分析性。下面是这三种校…

openpnp - 板子上最小物料封装尺寸的选择

文章目录 openpnp - 板子上最小物料封装尺寸的选择概述END openpnp - 板子上最小物料封装尺寸的选择 概述 现在设备调试完了, 用散料飞达载入物料试了一下. 0402以上贴的贴别准, 贴片流程也稳, 基本不需要手工干预. 0201可以贴, 但是由于底部相机元件视觉识别成功率不是很高…

uni-app打包后安卓不显示地图及相关操作详解

新公司最近用uni-app写app&#xff0c;之前的代码有很多问题&#xff0c;正好趁着改bug的时间学习下uni-app。 问题现象&#xff1a; 使用uni-app在浏览器调试的时候&#xff0c;地图是展示的&#xff0c;但是打包完成后&#xff0c;在app端是空白的。咱第一次写app&#xff…