Redis(Jedis和SpringBoot整合Redis)

文章目录

    • 1.Jedis
        • 1.介绍
        • 2.环境配置
          • 1.创建maven项目
          • 2.pom.xml引入依赖
          • 3.新建一个包并创建一个文件
        • 3.Jedis远程连接到Redis
          • 1.Redis放到服务器可以连接的前提条件
          • 2.为Redis设置密码
            • 1.编辑配置文件
            • 2.找到 requirepass
            • 3.设置密码为root
            • 4.重启Redis,在shutdown的时候报错,原因是之前连接到了redis的客户端没有关闭,执行下面的指令关闭
            • 5.然后再重启Redis,此时再次操作Redis就需要密码了
          • 3.编写代码连接Redis
        • 4.key操作
          • 1.代码
          • 2.结果
        • 5.string操作
          • 1.代码
          • 2.结果
        • 6.list操作
          • 1.代码
          • 2.结果
        • 7.set操作
          • 1.代码
          • 2.结果
        • 8.hash操作
          • 1.代码
          • 2.结果
        • 9.zset操作
          • 1.代码
          • 2.结果
    • 2.由于Redis被攻击了,所以重新配置
        • 1.修改端口为7489
        • 2.设置redis密码
        • 3.使redis支持远程访问
        • 4.重启redis
          • 1.指定配置文件启动redis
          • 2.查看是否启动
          • 3.指定端口连接redis
          • 4.测试密码
          • 5.如果要关闭redis,在命令行关闭redis,输入shutdown
        • 5.开放7489端口
          • 1.宝塔开启端口
          • 2.腾讯云开启端口
          • 3.为了安全只允许本机ip访问
    • 2.SpringBoot2整合Redis
        • 1.环境配置
          • 1.创建maven项目
          • 2.pom.xml引入依赖
          • 3.application.yml 配置redis
          • 4.添加Redis的配置类(使用SpringBoot默认的会出些问题关于序列化的)RedisConfig.java
        • 2.测试
          • 1.编写测试的Controller
          • 2.编写主启动类
          • 3.启动测试 [localhost:8080/redisTest/set](http://localhost:8080/redisTest/set)
        • 3.对list进行操作
          • 1.代码
          • 2.结果
        • 4.注意事项
          • 1.先看报错是无法识别的token
          • 2.如果使用redisTemplate进行set会先序列化,然后读取的时候也会反序列化,但是直接在客户端set不会进行序列化,所以在使用redisTemplate进行反序列化的时候就会出现问题
          • 3.解决方式:都使用程序进行操作即可

1.Jedis

1.介绍

image-20240429154127142

2.环境配置
1.创建maven项目

image-20240429154831864

2.pom.xml引入依赖
    <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.2.0</version></dependency>
3.新建一个包并创建一个文件

image-20240429155409891

3.Jedis远程连接到Redis
1.Redis放到服务器可以连接的前提条件
  • 确认端口开启
  • protected-mode(设置no支持远程访问)
  • 注销bind = 127.0.0.1
  • 最好设置一个密码在requirepass
2.为Redis设置密码
1.编辑配置文件
vim /etc/redis.conf
2.找到 requirepass

image-20240429160256016

3.设置密码为root

image-20240429160319448

4.重启Redis,在shutdown的时候报错,原因是之前连接到了redis的客户端没有关闭,执行下面的指令关闭
redis-cli shutdown nosave
5.然后再重启Redis,此时再次操作Redis就需要密码了

image-20240429163024650

3.编写代码连接Redis
package com.sun.jedis;import org.junit.Test;
import redis.clients.jedis.Jedis;/*** Description:** @Author sun* @Create 2024/4/29 15:53* @Version 1.0*/
public class Jedis_ {// 连接redis@Testpublic void con() {// 连接服务器的redis命令行Jedis jedis = new Jedis("xxxx", xxx);// 如果redis设置了密码要先进行验证jedis.auth("root");String ping = jedis.ping();System.out.println("ping = " + ping);// 关闭命令行连接jedis.close();}
}

image-20240429163739569

4.key操作
1.代码
    @Testpublic void key() {// 连接服务器的redis命令行Jedis jedis = new Jedis("xxxxxx", xxxx);// 如果redis设置了密码要先进行验证jedis.auth("root");// 设置keyjedis.set("k1", "v1");jedis.set("k2", "v2");jedis.set("k3", "v3");// 获取所有的keySet<String> keys = jedis.keys("*");// 遍历输出for (String key : keys) {System.out.println("key=" + key);}// 判断key是否存在Boolean k1 = jedis.exists("k1");System.out.println("k1是否存在?" + k1);// 查看key的ttlSystem.out.println("k2的ttl=" + jedis.ttl("k2"));// 获取值String k3 = jedis.get("k3");System.out.println("k3=" + k3);jedis.close();}
2.结果

image-20240429165247069

5.string操作
1.代码
    @Testpublic void string() {// 连接服务器的redis命令行Jedis jedis = new Jedis("xxxxxx", xxxx);// 如果redis设置了密码要先进行验证jedis.auth("root");// 先清除一下库jedis.flushDB();// 批量设置stringjedis.mset("k1", "v1", "k2", "v2", "k3", "v3");// 批量获取stringList<String> mget = jedis.mget("k1", "k2", "k3");for (String s : mget) {System.out.println(s);}jedis.close();}
2.结果

image-20240429165825709

6.list操作
1.代码
    @Testpublic void list() {// 连接服务器的redis命令行Jedis jedis = new Jedis("xxxxxx", xxxx);// 如果redis设置了密码要先进行验证jedis.auth("root");// 先清除一下库jedis.flushDB();// 向list的左边添加三条记录jedis.lpush("key", "v1", "v2", "v3");// 显示数据,应该是v3,v2,v1List<String> key = jedis.lrange("key", 0, -1);for (String s : key) {System.out.println(s);}jedis.close();}
}
2.结果

image-20240429170559212

7.set操作
1.代码
    @Testpublic void set() {// 连接服务器的redis命令行Jedis jedis = new Jedis("xxxxxx", xxxx);// 如果redis设置了密码要先进行验证jedis.auth("root");// 先清除一下库jedis.flushDB();// 向set中添加元素jedis.sadd("key", "val1", "val2", "val3");// 取出set中的所有值Set<String> key = jedis.smembers("key");// 遍历输出for (String s : key) {System.out.println(s);}jedis.close();}
2.结果

image-20240429170951539

8.hash操作
1.代码
    @Testpublic void hash() {// 连接服务器的redis命令行Jedis jedis = new Jedis("xxxxxx", xxxx);// 如果redis设置了密码要先进行验证jedis.auth("xxxxxxx");// 先清除一下库jedis.flushDB();// 向hash中设置值Map<String, String> map = new HashMap<String, String>();map.put("field1", "value1");map.put("field2", "value2");map.put("field3", "value3");jedis.hset("key", map);List<String> hmget = jedis.hmget("key", "field1", "field2", "field3");for (String s : hmget) {System.out.println(s);}jedis.close();}
2.结果

image-20240429205900768

9.zset操作
1.代码
    @Testpublic void zset() {// 连接服务器的redis命令行Jedis jedis = new Jedis("xxxx", xxxx);// 如果redis设置了密码要先进行验证jedis.auth("xxxx");// 先清除一下库jedis.flushDB();// 向zset中添加数据jedis.zadd("key", 1, "zhangsan");jedis.zadd("key", 2, "lisi");jedis.zadd("key", 3, "wangwu");// 取出数据Set<String> key = jedis.zrange("key", 0, -1);for (String s : key) {System.out.println(s);}jedis.close();}
2.结果

image-20240429210607348

2.由于Redis被攻击了,所以重新配置

1.修改端口为7489

image-20240429200416739

2.设置redis密码

image-20240429195814069

3.使redis支持远程访问

image-20240429200002355

image-20240429200046964

4.重启redis
1.指定配置文件启动redis
/usr/local/bin/redis-server /etc/redis.conf
2.查看是否启动
ps -aux | grep redis

image-20240429200524755

3.指定端口连接redis
/usr/local/bin/redis-cli -p 7489

image-20240429200655032

4.测试密码

image-20240429200728881

5.如果要关闭redis,在命令行关闭redis,输入shutdown
5.开放7489端口
1.宝塔开启端口
systemctl start firewalld && firewall-cmd --permanent --add-port=7489/tcp && firewall-cmd --reload && firewall-cmd --query-port=7489/tcp

image-20240429201337740

2.腾讯云开启端口

image-20240429201549924

3.为了安全只允许本机ip访问

image-20240429205215949

2.SpringBoot2整合Redis

1.环境配置
1.创建maven项目

image-20240429211111679

2.pom.xml引入依赖
    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.6</version><relativePath/> <!-- lookup parent from repository --></parent><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><!-- 说 明 : 如 果 这 里 是 spring-boot-start 就 改 成 如 下spring-boot-start-web--><artifactId>spring-boot-starter-web</artifactId></dependency><!-- redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- spring2.X 集成 redis 所需 common-pool--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><!--不要带版本号,防止冲突--></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.2.2</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
3.application.yml 配置redis
spring:redis:host: xxxxxx # Redis服务器地址port: xxxx# Redis服务器端口password: ****** # Redis服务器密码database: 0 # 默认数据库为0号timeout: 1800000 # 连接超时时间是1800秒lettuce:pool:max-active: 20 # 最大活跃连接数,使用负值表示没有限制max-wait: -1 # 最大等待时间,单位为毫秒,使用负值表示没有限制max-idle: 10 # 最大空闲连接数min-idle: 0 # 最小空闲连接数        
4.添加Redis的配置类(使用SpringBoot默认的会出些问题关于序列化的)RedisConfig.java
package com.sun.redis.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;import java.time.Duration;/*** Description:** @Author sun* @Create 2024/4/29 21:29* @Version 1.0*/
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template =new RedisTemplate<>();System.out.println("template=>" + template);RedisSerializer<String> redisSerializer =new StringRedisSerializer();Jackson2JsonRedisSerializer jackson2JsonRedisSerializer =new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY);jackson2JsonRedisSerializer.setObjectMapper(om);template.setConnectionFactory(factory);// key 序列化方式template.setKeySerializer(redisSerializer);// value 序列化template.setValueSerializer(jackson2JsonRedisSerializer);// value hashmap 序列化template.setHashValueSerializer(jackson2JsonRedisSerializer);return template;}@Beanpublic CacheManager cacheManager(RedisConnectionFactory factory) {RedisSerializer<String> redisSerializer =new StringRedisSerializer();Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = newJackson2JsonRedisSerializer(Object.class);// 解决查询缓存转换异常的问题ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY);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;}
}

image-20240429213253810

2.测试
1.编写测试的Controller
package com.sun.redis.controller;import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/*** Description:** @Author sun* @Create 2024/4/29 21:36* @Version 1.0*/
@RestController
@RequestMapping("/redisTest")
public class TestController {@Resourceprivate RedisTemplate<String, Object> redisTemplate;@RequestMapping("/set")public String set() {redisTemplate.opsForValue().set("name", "孙显圣");return redisTemplate.opsForValue().get("name").toString();}
}
2.编写主启动类
package com.sun.redis;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** Description:** @Author sun* @Create 2024/4/29 21:39* @Version 1.0*/
@SpringBootApplication
public class RedisApplication {public static void main(String[] args) {SpringApplication.run(RedisApplication.class, args);}
}
3.启动测试 localhost:8080/redisTest/set

image-20240429214257425

image-20240429214242423

3.对list进行操作
1.代码
    @RequestMapping("/list")public String list() {// 清除一下库redisTemplate.delete("key");// 批量添加redisTemplate.opsForList().leftPushAll("key", "v1", "v2", "v3");// 遍历输出List<Object> range = redisTemplate.opsForList().range("key", 0, -1);return range.toString();}
2.结果

image-20240430084953906

4.注意事项
1.先看报错是无法识别的token

image-20240430085702856

2.如果使用redisTemplate进行set会先序列化,然后读取的时候也会反序列化,但是直接在客户端set不会进行序列化,所以在使用redisTemplate进行反序列化的时候就会出现问题
3.解决方式:都使用程序进行操作即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/322645.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络——Dijkstra路由算法

实验目的 实现基于 Dijkstra 算法的路由软件 实验内容 网络拓扑如图所示 实验过程 先编写开辟应该图的空间&#xff0c;然后给点映射数字&#xff0c;构建图。程序获取用户输入的学号&#xff0c;构建图中边的权值。接下来程序从用户输入获取最短路径的搜索起点&#xff0…

基于C++基础的函数模块

在C中&#xff0c;函数是一段封装了某种功能的代码块&#xff0c;可以在程序的不同地方重复使用。函数定义包含如下组成部分&#xff1a; 函数头&#xff1a;函数头包括函数返回类型、函数名和参数列表。函数返回类型规定了函数返回的数据类型&#xff0c;函数名是函数的唯一标…

Java_从入门到JavaEE_11

一、抽象类及抽象方法 1.认识抽象类及抽象方法 应用场景&#xff1a;当一个方法必须在父类中出现&#xff0c;但是这个方法又不好实现&#xff0c;就把该方法变成抽象方法&#xff0c;交给非抽象的子类去实现 实例&#xff1a; //抽象类 public abstract class 类名{//抽象方…

5月将有17款游戏发布,腾讯的《地下城与勇士:起源》备受关注

易采游戏网5月8日消息&#xff0c;本月将有17款新游戏预计上线&#xff0c;其中14款已正式定档&#xff0c;游戏市场即将迎来一场盛大的狂欢。在众多备受期待的游戏中&#xff0c;有两款游戏尤其引人注目&#xff0c;它们分别是来自库洛和腾讯的《地下城与勇士&#xff1a;起源…

学习方法的重要性

原贴&#xff1a;https://www.cnblogs.com/feily/p/13999204.html 原贴&#xff1a;https://36kr.com/p/1236733055209095 1、 “一万小时定律”的正确和误区 正确&#xff1a; 天才和大师的非凡&#xff0c;不是真的天资超人一等&#xff0c;而是付出了持续不断的努力&…

武汉星起航:成功挂牌上股交,优势尽显启新程,共绘创业投资梦

在金秋十月的尾声&#xff0c;武汉星起航电子商务有限公司迎来了一个重要的历史时刻——于2023年10月30日在上海股权托管交易中心成功挂牌展示&#xff0c;正式登陆资本市场。这一里程碑式的跨越&#xff0c;不仅标志着武汉星起航在跨境电商领域的卓越实力&#xff0c;更彰显了…

MAC地址冲突案例

1、问题描述&#xff1a;WiFi-A网段做了策略路由&#xff0c;引流到另一台设备&#xff0c;连接WiFi-A后通过DHCP获取到了地址却无法上网&#xff0c;此时排查思路是什么&#xff1f; &#xff08;1&#xff09;、排查方法&#xff1a; 看到网关通信是否正常 第一次获取地址正…

mysql中varchar与bigint直接比较会导致精度丢失以至于匹配到多行数据

在mysql中&#xff0c;我们都知道如果一个索引字段使用了函数或者计算那么查询的时候索引会失效&#xff0c;可是我相信在联表的时候我们只会关注两个表关联字段是否都创建了索引&#xff0c;却没有关注过这两个字段的类型是否一致&#xff0c;如果不一致的话索引是会失效的&am…

Windows系统完全卸载删除 Node.js (包含控制面板找不到node.js选项情况)

1.打开cmd命令行窗口&#xff0c;输入npm cache clean --force 回车执行 2.打开控制面板&#xff0c;在控制面板中把Node.js卸载 移除之后检查环境变量是否也移除&#xff1a;点击Path&#xff0c;点击编辑。 把环境变量中和node有关的全部移除&#xff0c;然后点击确定。 3.重…

WPF之创建无外观控件

1&#xff0c;定义无外观控件。 定义默认样式&#xff0c;在其静态构造函数中调用DefaultStyleKeyProperty.OverrideMetadata()。 //设置默认样式DefaultStyleKeyProperty.OverrideMetadata(typeof(ColorPicker), new FrameworkPropertyMetadata(typeof(ColorPicker))); 在项目…

Android C++ 开发调试 LLDB 工具的使用

文章目录 调试环境准备基础命令Breakpoint CommandsWatchpoint CommandsExamining VariablesEvaluating ExpressionsExamining Thread StateExecutable and Shared Library Query Commands 参考&#xff1a; Android 中在进行 NDK 开发的时候&#xff0c;我们经常需要进行 C 代…

为什么互联网行业这两年突然就不行了?

前言&#xff1a; 本人正好最近十年基本都是在互联网行业&#xff0c;真正算是经历了行业的起伏波澜&#xff0c;火的时候被烤的滚烫&#xff0c;冷的时候被冻得冰凉&#xff0c;都算是切身感受到了。 首先&#xff0c;互联网行业的“行”与“不行”&#xff0c;还是一个相对…

短剧新纪元:引领潮流的短剧小程序开发,一触即达精彩世界

在信息爆炸的时代&#xff0c;短视频以其短小精悍、内容丰富的特点迅速崛起&#xff0c;成为人们日常生活中不可或缺的一部分。然而&#xff0c;短视频的短暂与碎片化&#xff0c;有时难以满足观众对完整故事的需求。为此&#xff0c;我们倾力打造了一款短剧小程序&#xff0c;…

如何修复连接失败出现的错误651?这里提供修复方法

错误651消息在Windows 7到Windows 11上很常见&#xff0c;通常会出现在一个小的弹出窗口中。实际文本略有不同&#xff0c;具体取决于连接问题的原因&#xff0c;但始终包括文本“错误651”。 虽然很烦人&#xff0c;但错误651是一个相对较小的问题&#xff0c;不应该导致计算…

AI图书推荐:ChatGPT在真实商业世界中的应用

《ChatGPT在真实商业世界中的应用》 (Unleashing The Power of ChatGPT: A Real World Business Applications)首先概述了ChatGPT及其在对话式人工智能领域的影响。接着&#xff0c;你将深入了解ChatGPT的技术方面&#xff0c;理解机器学习算法和自然语言处理如何在后台工作。然…

Android进阶之路 - 静态会员进度条

年后这个新版本加入了VIP模块&#xff0c;有幸正好由我来负责&#xff0c;可以再积累一下这方面的知识。 那段时间看了一本书&#xff0c;书中说到初级码农的特性之一就是完全集中于某些功能&#xff0c;忽略了了很多成长机会&#xff0c;所以重复性劳作带来的成长值有限&#…

【YOLO】目标检测 YOLO框架之train.py参数含义及配置总结手册(全)

1.一直以来想写下基于YOLO开源框架的系列文章&#xff0c;该框架也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下YOLO目标检测相关知识体系&#xff0c;之前实战配置时总是临时性检索些注释含义&#xff0c;但…

spring模块(六)spring监听器(2)@EventListener

一、介绍 监听器的简化写法 二、原理 三、使用 Slf4j Component public class MyTask {EventListenerpublic void onApplicationEvent(ApplicationEvent event) {if (event instanceof ContextRefreshedEvent) {log.info("监听到 ContextRefreshedEvent...");}if…

水电抄表方案是什么?

1.概述&#xff1a;水电抄表方案的重要性 水电抄表方案是现代城市管理中不可或缺的一部分&#xff0c;它涉及到了能源管理、费用结算和公共服务等多个领域。传统的抄表方式需要工作人员上门服务&#xff0c;费时费力且效率低下。随着科技的发展&#xff0c;智能化的水电抄表方…

融知财经:期货交易原理是怎样的?期货交易有哪些特征?

期货的原理是基于对某期货品种未来走势的判断而形成对其合约的买卖交易&#xff0c;因此期货可以解释为买涨或买跌。买涨&#xff0c;即看多交易&#xff0c;预期某期货品种未来价格上涨而进行的买入开仓交易&#xff1b;买跌&#xff0c;即看空交易&#xff0c;预期某期货品种…