我是一个小菜鸡,若我的想法有所不对,请各位大佬们随意指正,持续更新中....
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成为新的有存活时间的数据了(其实我们就可以用他的这个特性,做一些例如短信验证的东西,到达时间验证码就没用了)