缓存一词最初主要指 CPU 与内存之间的高速静态随机存取存储器(SRAM)。我们知道,CPU 需要频繁从内存中读取指令、数据,但各个硬件的发展是不均衡的,我们当前使用的主流的动态随机存储存取器(DRAM)内存技术无法满足 CPU 高速读取的需求,成为制约计算机运行效率的重要因素之一。而 SRAM 速度快,但体积大,成本高,就目前来讲,一块 16G 的 SRAM 可能比主板还大,且价格极高,因此短期之内不可能替代 DRAM 成为内存的主流技术选择。
怎么办呢,妥协一下,用块小的 SRAM 放到 DRAM 的内存和 CPU 之间,不占什么地方,也不贵。那放上去有什么用?数据岂不是还要多经过一层 SRAM 才能到 CPU?这样会变快吗?当然不会更快,但计算机的运行效率确实提升了,这是为什么?因为实际上在一段时间里,一小部分指令或数据会被 CPU 频繁读取,机智的人类通过算法,把这些指令、数据提取出来放到缓存里,这样就能够四两拨千斤,取得明显的效果。
你看,使用缓存不是必须的,如果我们能造出高速、便宜的存储,就没有这么多麻烦了。但在现实中,总会有各种各样的不完美,机会总是稍纵即逝,如果去等待完美的条件,就难以向前迈进。工程思想的核心,就是权衡与妥协,接受不完美、不确定,通过各种手段把缺陷控制在可以容忍的范围内,在有限的条件下尽可能地完成设定的目标、事业。缓存是一种工程思想下自然而然的优秀实践,这一实践逐渐被抽象成一种设计思路,在各种受到资源获取开销制约的场景下得到广泛应用。
1.1web中的缓存原文链接:Vue + Spring Boot 项目实战(二十一):缓存的应用_Evan-Nightly的博客-CSDN博客
在做项目的过程中,不知道你们有没有感叹过,一个平平无奇的应用,涉及的点实在是太多了。各个点之间需要衔接,要衔接就会有两个层次的不均衡:一是性能的不均衡,包括速率、吞吐量等,造成这种不均衡的原因包括软件、硬件、网络、协议、策略等、位置多个维度。二是数据本身活跃性的不均衡,有些数据会被频繁传递,有些很久才被访问一次。基于这两个不平衡,诞生了各种缓存方案。比较常见的有以下几种:
浏览器缓存,包括本地的页面资源文件和 DNS 映射 DNS 服务器上的缓存(IP - 域名映射) CDN,利用边缘 Cache 服务器提高访问速度 ORM 框架提供的缓存,比如 Spring Data JPA 的持久化上下文 利用高性能非关系型数据库(如 Redis)提供缓存服务,作为对关系型数据库的补充 数据库提供的缓存,比如 MySQL 自带的查询缓存,会把执行语句与查询结果以 K-V 形式缓存在内存中(由于该缓存命中率较低,不建议使用,且 8.0 版本已删除此功能)
1.2缓存的工作方式Cache-Aside:
最常见的模式,可以翻译为旁路缓存或边缘缓存。缓存作为数据库(或存储)的补充,数据的获取策略是,如果缓存中存在,则从缓存获取,如果不存在,则从数据库获取,并写入缓存。
CA 模式
Read-Through:
把数据库藏在缓存背后,一切请求交由缓存响应。也就是说,如果命中缓存,则直接从缓存获取,如果没有命中,则从数据库中查询,写入缓存后再由缓存返回。
首先我们要记住,Redis 和 MySQL 一样,是一个数据库管理系统,人家不是就为了做缓存的。Redis ≠ 缓存 ,只是由于这玩意儿现在访问速度快,但又不能完全替代关系型数据库,所以确实适合用来做关系型数据库的缓存,都是形势所迫,说不定哪一天就翻身了。我们要在应用中操纵这个数据库,自然也需要与关系型数据库相似的访问方法。MySQL 我们用 Spring Data JPA,Redis 我们就用 Spring Data Redis。其实在此之前,Java 访问 Redis 主要是通过 Jedis 和 Lettuce 两种由不同团队开发的客户端(提供访问、操作所需的 API),Jedis 比较原生,Lettuce 提供的能力更加全面。Spring Data Redis 是在 Lettuce 的基础上做了一些封装,与 Spring 生态更加贴合,使用起来也更简便。
二、VMware安装虚拟机通过虚拟机搭建一个服务器,运行redis。为了方便window和虚拟机文件传输,需要安装xftp软件;进一步,使用xshell软件方便虚拟机中命令行的操作。
2.1安装VMware虚拟机官网下载:
Windows VM | Workstation Pro | VMware
运行安装包
1双击VMware-workstation-
2点击next进行安装
许可证密钥
2.2VMware16上安装配置CentOS7vmwareworkstation16许可证密钥
ZF3R0-FHED2-M80TY-8QYGC-NPKYF
YF390-0HF8P-M81RQ-2DXQE-M2UT6
ZF71R-DMX85-08DQY-8YMNC-PPHV8
下载镜像
CentOS Mirrors List
Index of /centos/7.9.2009/isos/x86_64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
点击链接下载
https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
开启虚拟机
进入界面:当光标在虚拟机中,想跳出来可以快捷键:Ctrl+Alt
就可以跳出界面
2.3安装xftp和xshell官网下载:Xmanager中文官网_Xshell,Xmanager,Xftp 7下载
2.4下载redis.tar.gz下载redis
CRUG网站
三、虚拟机安装redis 3.1通过Xftp将redis安装包导入到虚拟机中 3.2虚拟机设置静态IP设置静态ip的好处,每次连接虚拟机不需要重新获取ip地址
我们在使用虚拟机的时候发现linux虚拟机的ip地址总是变这是为什么,这是因为linux默认是自动获取ip,所以在每次我们重启虚拟机的时候IP地址都会换,那么我们该怎么解决这个问题呢?
1.将自动获取ip设置为静态获取ip
在虚拟机中输入vim/etc/sysconfig/network-scripts/ifcfg-ens33,进入下面的页面
2.修改BOOTPROTO为static
加入属性IPADDR,设置你想要设置的ip
3.重新启动网络服务使修改生效
service network restart
3.3安装redis1)在redis安装包目录下,解压命令:tar zxvf redis-5.0.3.tar.gz
在Redis目录下输入:make
如果报错的话,是因为redis是用C语言写的,安装的话需要C语言的环境。
yum -y install gcc-c++ automake autocon
如何测试自己是否安装了gcc呢?
2)创建一个目录:user/local/redis,安装在新创建的目录下
mkdir -p user/local/redis
make PREFIX=/user/local/redis/ install
出现下面的错误说明gcc版本太低
解决办法:
[root@localhost redis-6.0.1]# gcc -v # 查看gcc版本 [root@localhost redis-6.0.1]# yum -y install centos-release-scl # 升级到9.1版本 [root@localhost redis-6.0.1]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils [root@localhost redis-6.0.1]# scl enable devtoolset-9 bash 以上为临时启用,如果要长期使用gcc 9.1的话: [root@localhost redis-6.0.1]# echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
再次执行:make install PREFIX=/usr/local/redis
安装成功会出现:Hint: It's a good idea to run 'make test'
3)将redis.config复制到新建目录的bin下用于启动
cp redis.conf /user/local/redis/bin
四、修改redis配置文件redis.conf为了允许物理机访问虚拟机上的redis。需要配置如下内容:允许所有主机访问、允许后台启动、取消保护模式、设置连接密码、指定启动配置类文件。
bin目录下输入grep -rn "查询字段" *进行定位
4.1允许所有主机访问如果本地连接redis报如下错误:
- Just disable protected mode sending the command ‘CONFIG SET protected-mode no’ from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent.
- Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to ‘no’, and then restarting the server.
- If you started the server manually just for testing, restart it with the --portected-mode no option.
- Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.
是说处于保护模式,只能本地链接,我们需要修改配置文件…/redis.conf
安装好redis后:需要修改配置文件redis.conf 将127.0.0.1 修改为0.0.0.0或将其注释掉
此处127.0.0.1为只可以本机访问,0.0.0.0所有主机都可以访问
4.2允许后台启动 4.3 关闭保护模式protected-mode 设为no
Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程,设置为no,关闭保护模式
4.4设置连接密码bin目录下输入grep -rn "requirepass" *定位
4.5 指定配置文件启动redis命令:./redis-server redis.conf
注意,如果不这样启动redis,修改的配置类将不能生效。重启后若物理机连接不上redis,报保护模式错误,查看redis.conf配置内容是否已设置如上内容,若已设置则使用该命令进行重启。
五、安装redis-desktop-managerredis-desktop-manager类似于windows可视化界面。类似mysql的navicat工具。
官网下载:RESP.app - GUI for Redis ® on the Mac App Store
不同的数据、数据类型放在不同的数据库的区分。 默认数据库有16个。也可以进行调整。
在redis-desktop-manager中配置连接
六、启动失败排查——telnet连接6379端口失败redis通过6379端口无法连接服务器。看了网上很多解决方案,都是端口问题,将127.0.0.1改为0.0.0.0,就ok了,但是本人的问题不是端口问题,端口本来就是0.0.0.0。其实redis无法连接数据库就只有这几种可能,防火墙,安全组,密码,绑定IP。这次的问题感觉还是比较让人费解的,当更换端口号的时候就可以,默认端口6379就是不行。
按照顺序依次检查了防火墙,安全组,密码,配置文件,都确认没有问题之后,再次启动redis,依然是服务器可以访问,本地telnet都无法连接。这个问题很像是防火墙和绑定IP的原因。所以我再次检查firewall防火墙(firewall-cmd --state)和iptables(service iptables status)防火墙,首先看到的是firewall防火墙是没有运行的
,再去检查iptables防火墙的状态
这句话的意思是,找不到iptables,那就是因为系统版本的原因,已经由firewall防火墙接管了。那自然也就不再考虑是因为防火墙的原因,导致无法连接服务器。但是当使用iptables -L -n查看已设置的iptables规则,它竟然存在安全组规则。
上边结果显示范围内的端口号都只能本地访问,6379自然也就不能被访问到了。知道原因就好办了,直接使用
iptables -F
将这些规则都清楚掉,再次使用
iptables -L -n
查看,规则都不存在了,使用telnet测试服务器端口号,也可以正常连接了。
完成了redis的软件安装和部署就可以继续进行后面的学习啦,不得不说,在安装和启动redis这块浪费了很多时间,尤其是redis.conf的配置,在重启后老是失效。所以每次启动redis还是用./redis-server redis.conf



