Window版Redis(Key:Value)笔记


window版安装教程

  • 由于首页数据变化不是很频繁,而且首页访问量相对较大,所以我们有必要把首页接口数据缓存到redis缓存中,减少数据库压力和提高访问速度。
  • 因为前台的用户量大,你可能需要加缓存,或者前台的用户进行身份校验,操作很多
  • 前端要加缓存比如Redis,量大,直接让你查数据库,容易把数据库搞崩。
  • sprinboot自带缓存(mybatis)不是独立的,redis可以独立部署在另一台机器可以当分布式缓存,为多个微服务和服务器提供缓存服务(正如虚拟机linux部署Redis但是window的项目却可以通过绑定Redis的IP地址和端口号进行访问使用。)

Redis简介

Redis的前世今生
Redis是一款开源的、网络化的、基于内存的、可进行数据持久化的Key-Value存储系统。

Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI
c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储。)。和Memcache类似,但很大程度补偿了Memcache的不足。和Memcache一样,Redis数据都是缓存在计算机内存中,不同的是,Memcache只能将数据缓存到内存中,无法自动定期写入硬盘,这就表示,一断电或重启,内存清空,数据丢失。所以Memcache的应用场景适用于缓存无需持久化的数据。而Redis不同的是它会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,实现数据的持久化。
在这里插入图片描述
频繁访问,基本不修改的数据才会放到Redis缓存中

Redis的特点

  1. Redis读取的速度是110000次/s,写的速度是81000次/s;
  2. 原子 。Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  3. 支持多种数据结构:string(字符串);list(列表);hash(哈希)set(集合);zset(有序集合)
  4. 持久化,集群部署
  5. 支持过期时间,支持事务,消息订阅

缓存概念(空间换时间)

缓存概念
网站缓存按照存放的地点不同,可以分为客户端缓存、服务端缓存(Redis)。
缓存存在的最终目的是为了降低访问次数和资源加载时间。

  • 浏览器缓存是最靠近用户的缓存,如果启用缓存,用户在访问同一个页面时,将不再从服务器下载页面,而是从本机的缓存目录中读取页面,然后再浏览器中展现这个页面。
  • 客户端缓存就是将网络资源存到本地电脑内存或者系统磁盘中,再次调用时直接调用缓存中资源。
  • 平时使用的加速小火箭清除的是内存中的缓存垃圾(已经关闭访问的资源但仍然残留内存占用)和系统文件清理清除的是C盘中的缓存垃圾(用过的网络资源残留文件)。

Redis属于服务端缓存中的数据缓存,存储到计算机内存中
若想用计算机处理数据都要先将数据加载到内存中再进行CPU数据处理,
因此远程网络资源必然要先加载到本地内存(或者内存-下载->磁盘-读取->内存)中再进行CPU处理。
而本地访问网络资源的方式关闭后,内存中的远程网络资源是否清除则是缓存的问题了。

例如:本地上网冲浪时,所有的可视化的娱乐页面等等信息都是远程运行商先将数据发送到本地内存中(此操作也是经过CPU处理运行的)然后CPU处理后才会显示,运行。
并且本地http请求也都是需要加载到内存后经过CPU处理后才会网络发送等等。
因为大多数情况下CPU只能和内存中程序进行数据计算交互,实现程序功能。
浏览器的浏览记录就是保存到本地。
在这里插入图片描述

Redis实战(注解)

配置Key:Value的@Cacheable注解需要添加在Impl层方法上(此层方法才是进行数据库操作的地方)
在这里插入图片描述
Redis功能封装插件


@EnableCaching//开启缓存
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setConnectionFactory(factory);
        //key序列化方式
        template.setKeySerializer(redisSerializer);
        //value序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //value hashmap序列化
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // 配置序列化(解决乱码的问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}

在接口中添加redis缓存

由于首页数据变化不是很频繁,而且首页访问量相对较大,所以我们有必要把首页接口数据缓存到redis缓存中,减少数据库压力和提高访问速度。

Spring Boot缓存注解

缓存的作用体现在查询上,若查询时缓存存在对应结果则直接返回缓存数据。
缓存需要跟随操作不断更新,保证缓存数据和数据库中数据一致,因此更新操作时需要同时更新缓存。
(1)缓存@Cacheable(查询数据库信息时同时更新缓存信息)

根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。

(2)缓存@CachePut(添加数据库信息时同时更新缓存信息)

使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。

(3)缓存@CacheEvict(更新,删除数据库信息时同时更新,删除缓存信息)

使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上。

Window版的Redis全局文件配置

localhost 、 127.0.0.1 、0.0.0.0 、本地IP的区别
因为配置的是Window版本地的Redis所以只需要127.0.0.1回访自身指定Redis运行端口就行,反之若是使用linux虚拟机运行的Redis就需要写虚拟机的IP地址和Redis运行端口号。
IP:定位服务器位置
端口号:定位Redis程序在服务器中的运行位置
127.0.0.1:6379为Redis的运行IP地址和端口号。(可通过安装教程理解)

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.database= 0
spring.redis.timeout=1800000
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0

在这里插入图片描述

Redis绑定(IP:端口号)访问方式决定了Redis可以独立部署在另一台机器可以当分布式缓存,为多台服务器提供缓存服务(正如虚拟机linux部署Redis但是window的项目却可以通过Redis绑定的IP地址和端口号进行访问使用。)
不同微服务绑定同一个(IP:端口号)Redis,则对应微服务可以访问同一个Redis缓存空间,实现跨服务键值对存取值。

Redis实战(redisTemplate)

SpringBoot封装的RedisTemplate工具类实现Redis缓存中键值对的存取以及生存周期设置。

import org.springframework.data.redis.core.RedisTemplate;
    @Autowired
    private RedisTemplate<String,String> redisTemplate;

突破点:不同微服务可以通过Redis实现跨服务的键值对信息存取。
原理:不同微服务都配置了同一IP:端口下的Redis,因此微服务使用的是同一个Redis缓存空间可以跨服务提取缓存中的值。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

例如:验证码的发送与验证以及有效生命周期控制
验证码发送的微服务(redisTemplate将验证码set到redis中)

//发送成功,把发送成功验证码放到redis里面:phone:code键值对key:value
            //设置有效时间
            redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);

注册的微服务(redisTemplate将验证码从redis中get(phone)得到code)

//判断验证码
        //获取redis验证码
        String redisCode = redisTemplate.opsForValue().get(mobile);
        if(!code.equals(redisCode)) {
            throw new GCLException(20001,"注册失败");
        }

总结(内存数据库针对大量select查询操作):

固定:导入Redis依赖,添加Redis插件,下载Redis,全局文件配置Redis运行位置和连接执行参数。
在对应的方法上添加对应的缓存注解,执行后前端页面多次刷新查询可以观察到查询方法只执行一次SQL查询。(也可以下载Win版的Redis可视化工具)
用户读请求发出,先查快速内存redis,若没有再查慢速外存mysql
redis主要是缓解用户对于MySQL的读请求
在这里插入图片描述

Redis是一款开源的、网络化的、基于内存的、可进行数据持久化的Key-Value存储系统。
内存数据库一旦断电,就会丢失全部数据。
内存数据库的持久化操作实际上就是将数据备份到外存中。

在这里插入图片描述

Redis可视化管理工具(Redis Desktop Manager)


版权声明:本文为qq_43813373原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。