快乐Redis学习

我是一个小菜鸡,若我的想法有所不对,请各位大佬们随意指正,持续更新中....

Redis是什么?

redis是一个存在内存中的key-value键值队(就一个字

为什么用redis,能不能不用redis?

我可以确切的告诉你,看情况使用redis,并不是非要用,看你的业务场景

例如:你网站的数据量访问量不是特别多的情况下,可以没必要使用redis,因为在我看来他最牛的就是缓存数据,想象一下你的用户量特别多的情况下,你从mysql中查出来数据是非常满的,此时你想极大的提升性能,只能依靠缓存了,这时候使用redis你会感觉这是飞一样的感觉(还有类似的很多情况,比如计数器,分布式session等等,都可以使用redis)

准备阶段

首先我们需要映入相关依赖(本人使用的是springboot2.7)

xml 复制代码
     <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
 ​
         <!--redis连接池-->
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-pool2</artifactId>
         </dependency>

是不是和我们之前使用mysql很想,都是需要客户端和连接池,而我们redis的客户端(springboot默认使用lettuce客户端,基于netty实现 线程安全支持集群模式,哨兵模式,管道模式)我们就可以当成是spring-boot-starter-data-redis,springboot帮我集成好了的,连接池就是下面这个,当然如果你不在yml里面配置如下是不会启用

yaml 复制代码
 spring:
   redis:
     host: 127.0.0.1
 #    在redis中没有设置密码可以不填
     password: root
 #    使用的是第几个redis存储空间
     database: 0
 #    默认使用lettuce客户端
     lettuce:
       pool:
 #        最大连接数
         max-idle: 16
 #        并发量
         max-active: 32
 #        最小连接数
         min-idle: 8

可以看到我们这些配置与mysql有略微的不同,那就是多了一个database,还有可以不输入密码(如果你自己的服务器上的一定要设置密码,小心被攻击),当你拥有一个windows的redis可视化界面之后你就会发现

他其实是一共有15个的存储空间,每一个相互隔离(分别代表0-15,我没有截全)

接下来我们就可以测试一下啦

首先我们应该如何使用呢?

在mysql中我们需要写语句,然而redis完全不一样,我们可以使用springboot默认给我们的RedisTemplate(就像springboot给我们对于mysql也有一个template一样)里面有基础的操作

redis有最基本的5个类型分别是:String,List,set,sorted set,哈希,我们先从String开始

String类型

其实我们在使用String类型的时候可以把他想象成java中的hashmap都是由key和value的(可以说所有的类型基本都是这样)

如何使用String类型的api呢?

如何穿key和value呢?

如何取呢?

代码如下

kotlin 复制代码
 @SpringBootTest
 public class StringType {
     @Resource
     private RedisTemplate redisTemplate;
 ​
     @Test
     public void testInsert(){
         //存
         redisTemplate.opsForValue().set("hello","redis");
         //取
         Object hello = redisTemplate.opsForValue().get("hello");
         System.out.println(hello);
     }
 }

最后运行的结果就是"redis",但是我们取客户端里看会发现一个很明显的问题,那就是看不懂里面的东西,那可怎么办呢?这下这个客户端还不如没有呢!!!

所以我们就需要配置一下这个模板的序列化了

当然我们使用string类型的时候传入会有序列化问题,那么其他类型的肯定也会有问题所以直接一起配置了吧

typescript 复制代码
 @Configuration
 public class RedisConfig {
 ​
 ​
     @Resource
     private RedisConnectionFactory factory;
 ​
     @Bean
     public RedisTemplate<String, Object> redisTemplate() {
         RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
 //      连接工厂
         redisTemplate.setConnectionFactory(this.factory);
         //        序列化配置
         Jackson2JsonRedisSerializer<Object> objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
 //        value值的序列化采用FastJsonRedisSerializer
         redisTemplate.setValueSerializer(objectJackson2JsonRedisSerializer);
 //        hash值的序列化采用FastJsonRedisSerializer的方式
         redisTemplate.setHashValueSerializer(objectJackson2JsonRedisSerializer);
 ​
 //        key的序列化采用StringRedisSerializer
         StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
         redisTemplate.setKeySerializer(stringRedisSerializer);
 //        hash的key的序列化采用StringRedisSerializer的方式
         redisTemplate.setHashKeySerializer(objectJackson2JsonRedisSerializer);
         redisTemplate.setKeySerializer(RedisSerializer.string());
         return redisTemplate;
 ​
     }
 }

配置完毕之后运行可能会有如下的一个

css 复制代码
 Failed to instantiate [org.springframework.data.redis.core.RedisTemplate]: Factory method 'redisTemplate' threw exception; nested exception is java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/JacksonFeature

yaml 复制代码
 java: 无法访问com.fasterxml.jackson.databind.JavaType
   找不到com.fasterxml.jackson.databind.JavaType的类文件

这个时候我们只需要再映入一个相关的jar包即可

xml 复制代码
        <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-json</artifactId>
         </dependency>

就可以运行了,最后我们就可以看到我们客户端显示出来了正常的json串

其实我们直接这样存进去是永久的,他会永远存在我们的redis中,但是我们一般会用他来缓存数据(或者一些有限制时间的数据),内从占用过多不久得不偿失了吗?

答:所以他就有一个非常关键的东西,那就是这个数据在内存中的存活时间(以后往redis里面存数据的时候千万不要忘了设置存活时间,不然会有意向不到的后果,redis中数据到一定的容量后可是会随机清数据的哦)

如下操作:

csharp 复制代码
  /**
      * 设置过期时间
      */
     @Test
     public void testEXP(){
         redisTemplate.opsForValue().set("hello1","redis", 1,TimeUnit.MINUTES);
         Object hello1 = redisTemplate.opsForValue().get("hello1");
         System.out.println(hello1);
     }

还是这个api,其实它后面还是可以加时间的,这样他就会覆盖之前的key成为新的有存活时间的数据了(其实我们就可以用他的这个特性,做一些例如短信验证的东西,到达时间验证码就没用了)

相关代码:罗晨/redisDemo - 码云 - 开源中国 (gitee.com)

相关推荐
在成都搬砖的鸭鸭1 小时前
【Redis】哈希表结构
redis·哈希算法·散列表
好想有猫猫1 小时前
【Redis】List 列表
数据库·c++·redis·分布式·缓存·list
Aurora_NeAr4 小时前
Redis设计与实现——分布式Redis
数据库·redis·分布式
Bug退退退1236 小时前
分析 redis 的 exists 命令有一个参数和多个参数的区别
数据库·redis·缓存
舰长1156 小时前
ubuntu 安装 Redis新版Redis 7.x
数据库·redis·ubuntu
李昊翔的博客8 小时前
保证数据库 + redis在读写分离场景中事务的一致性
数据库·redis·oracle
Uranus^9 小时前
利用Spring Boot和Redis构建高性能缓存系统
spring boot·redis·缓存·高性能
绝迹的星10 小时前
MySQL与Redis一致性问题分析
数据库·redis·mysql
编程、小哥哥1 天前
Java面试实战:从Spring Boot到分布式缓存的深度探索
java·spring boot·redis·微服务·grpc·缓存技术·面试技巧
小赵面校招1 天前
Redis企业级开发实战:核心应用场景与最佳实践
数据库·redis·缓存