快乐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)

相关推荐
我真的是大笨蛋9 小时前
Redis的String详解
java·数据库·spring boot·redis·spring·缓存
zhengzizhe12 小时前
Redssion出现attempt to unlock lock, not locked by current thread by node id
redis
兜兜风d'16 小时前
redis字符串命令
数据库·redis·缓存
西瓜er17 小时前
Docker 一键部署指南:GitLab、Nacos、Redis、MySQL 与 MinIO 全解析
redis·docker·gitlab
道可到17 小时前
别再瞎拼技术栈!Postgres 已经能干 Redis 的活了
redis·后端·postgresql
野犬寒鸦18 小时前
从零起步学习Redis || 第十二章:Redis Cluster集群如何解决Redis单机模式的性能瓶颈及高可用分布式部署方案详解
java·数据库·redis·后端·缓存
悟能不能悟1 天前
redis的红锁
数据库·redis·缓存
qq_5470261791 天前
SpringBoot+Redis实现电商秒杀方案
spring boot·redis·后端
野犬寒鸦2 天前
从零起步学习Redis || 第十一章:主从切换时的哨兵机制如何实现及项目实战
java·服务器·数据库·redis·后端·缓存
problc2 天前
PostgreSQL + Redis + Elasticsearch 实时同步方案实践:从触发器到高性能搜索
redis·elasticsearch·postgresql