Windows打开redis以及Springboot整合redis

目录

    • 前言
    • Windows系统打开redis
    • Springboot整合redis
      • 依赖
      • 实体类
      • yml配置文件
      • config配置
      • 各个数据存储类型分别说明记录
        • string
          • 数据写入redis,并查询
          • 通过命令行查询
        • list
          • 插入数据到redis中
          • 从redis中读取
          • 命令读取数据
        • hash
          • 向redis中逐个添加map键值对
          • 获取key对应的map中所有的键
          • 获取key对应的所有map键值对
          • 获取key对应的map中,key为username的map的对应的值
          • 获取key对应的map中所有的值
          • 判断key对应的map中是否有指定的键
          • 如果key对应的map不存在,则新增到map中,存在则不新增也不覆盖
          • 将一个完成的键值对直接放入redis
          • 命令读取数据
        • set
          • 向key中批量添加值
          • 获取key中的所有值
          • 获取key对应集合的长度
          • 随机获取key对应的集合中的元素
          • 随机获取key对应集合中指定个数的元素
          • 随机获取key对应集合中指定个数的元素,并且去重
        • zset
        • 注意

前言

       在springboot框架中,通过RedisTemplate中封装好的方法去操作redis中的各种数据类型,完成增删改查操作。
       本项目将数据序列化为json格式,分别以set、zset、hash的结构存入数据库中,完成查询所有数据、通过id查询单个数据,新增数据的操作。

redis有五种常用的数据结构:string hash list set zset
key-string:一个key对应一个值。
key-hash:一个key对应一个Map。
key-list:一个key对应一个列表。
key-set:一个key对应一个集合。
key-zset:一个key对应一个有序的集合。

在这里插入图片描述

Windows系统打开redis

我从网上下载来的redis包,里面有这些内容。
在这里插入图片描述
但是启动redis的服务端时,不会去直接双击“redis-server.exe”文件,因为这样启动不会去读取配置文件,需要通过命令行启动。如果需要远程访问redis,则需要在配置文件中配置ip等信息。

bind 0.0.0.0 
监听地址,默认是127.0.0.1,会导致只能在本地访问,修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0protected-mode no
将保护模式改为no

使用cmd命令行启动服务端

redis-server redis.conf

在这里插入图片描述
双击启动客户端
在这里插入图片描述
redis的存储查询数据命令,会在演示springboot使用redis中说明。

Springboot整合redis

依赖

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.0.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.70</version></dependency></dependencies>

实体类

public class User {private Integer id = 0;private String username = "";private String remark = "";
}

yml配置文件

用于配置redis的ip、端口、数据库、连接池等

spring:redis:port: 6379host: 127.0.0.1database: 1password: 123456jedis:pool:max-active: 8max-idle: 8max-wait: 1mstimeout: 5000ms

config配置

将实体类数据序列化为json格式

import java.text.SimpleDateFormat;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.StringRedisSerializer;import com.fasterxml.jackson.databind.ObjectMapper;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){RedisTemplate<Object, Object> template = new RedisTemplate<>();//ObjectMapper 指定在转成json的时候的一些转换规则ObjectMapper objectMapper = new ObjectMapper();objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));template.setConnectionFactory(redisConnectionFactory);Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);// 把自定义的objectMapper设置到jackson2JsonRedisSerializerjackson2JsonRedisSerializer.setObjectMapper(objectMapper);// RedisTemplate默认的序列化方式使用的是jdk的序列化// 设置了key的序列化方式template.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(jackson2JsonRedisSerializer); // 配置hash格式// 设置了value序列化方式template.setValueSerializer(jackson2JsonRedisSerializer);template.setHashValueSerializer(jackson2JsonRedisSerializer); // 配置hash格式return template;}
}

在启动类中需要使用@ComponentScan()注解扫描配置文件

各个数据存储类型分别说明记录

专门编写一个测试类

import com.alibaba.fastjson.JSON;
import com.redis.StartApplication;
import com.redis.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.ArrayList;
import java.util.List;@SpringBootTest(classes = StartApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class TestRedis {@Autowiredprivate RedisTemplate redisTemplate;
}
string

初始化数据

    private String initUserJson() {return JSON.toJSON(new User(1,"hzx1","This is a test user")).toString();}
数据写入redis,并查询
    @Testpublic void saveDataInRedisString() {redisTemplate.opsForValue().set("user", initUserJson());// 输出存入redis的数据System.out.println(redisTemplate.opsForValue().get("user"));}

在这里插入图片描述

通过命令行查询
#1.  添加值
set key value#2. 取值
get key

在这里插入图片描述

list

初始化数据

    private List initUserList(int num) {List<User> resUserList = new ArrayList<>();for (int i = 1; i <= num; i++) {resUserList.add(new User(i, "hzx" + i, "This is the " + i + "th user"));}return resUserList;}
插入数据到redis中

list通过链表实现,插入数据时需要区分左插入和右插入。可以逐条数据插入也可以批量数据插入

    @Testpublic void saveDataInRedisList() {List list = initUserList(10);// 逐条插入for (Object user : list) {redisTemplate.opsForList().leftPush("userListLeft", user);redisTemplate.opsForList().rightPush("userListRight",user);}// 批量插入redisTemplate.opsForList().leftPushAll("userListLeft",list);redisTemplate.opsForList().rightPushAll("userListRight",list);}
从redis中读取
    @Testpublic void queryDataFromRedisList(){List userList;System.out.println("左插入List");userList = redisTemplate.opsForList().range("userListLeft", 0, 10);for (Object o : userList) {System.out.println(o.toString());}System.out.println("右插入List");userList = redisTemplate.opsForList().range("userListRight", 0, 10);for (Object o : userList) {System.out.println(o.toString());}}

两种插入方式,最终顺序也不同
在这里插入图片描述

命令读取数据
#1. 存储数据(从左侧插入数据,从右侧插入数据)
lpush key value [value ...]
rpush key value [value ...]#2. 存储数据(如果key不存在,什么事都不做,如果key存在,但是不是list结构,什么都不做)
lpushx key value
rpushx key value#3. 修改数据(在存储数据时,指定好你的索引位置,覆盖之前索引位置的数据,index超出整个列表的长度,也会失败)
lset key index value#4. 弹栈方式获取数据(左侧弹出数据,从右侧弹出数据)
lpop key
rpop key#5. 获取指定索引范围的数据(start从0开始,stop输入-1,代表最后一个,-2代表倒数第二个)
lrange key start stop#6. 获取指定索引位置的数据
lindex key index#7. 获取整个列表的长度
llen key#8. 删除列表中的数据(他是删除当前列表中的count个value值,count > 0从左侧向右侧删除,count < 0从右侧向左侧删除,count == 0删除列表中全部的value)
lrem key count value#9. 保留列表中的数据(保留你指定索引范围内的数据,超过整个索引范围被移除掉)
ltrim key start stop#10. 将一个列表中最后的一个数据,插入到另外一个列表的头部位置
rpoplpush list1 list2
hash
向redis中逐个添加map键值对
redisTemplate.opsForHash().put("map1","id",1);
redisTemplate.opsForHash().put("map1","username","hzx1");
redisTemplate.opsForHash().put("map1","remark","This is the No.1 user");
获取key对应的map中所有的键
redisTemplate.opsForHash().keys("map1")

在这里插入图片描述

获取key对应的所有map键值对
redisTemplate.opsForHash().entries("map1")

在这里插入图片描述

获取key对应的map中,key为username的map的对应的值
redisTemplate.opsForHash().get("map1", "username")

在这里插入图片描述

获取key对应的map中所有的值
redisTemplate.opsForHash().values("map1")

在这里插入图片描述

判断key对应的map中是否有指定的键
redisTemplate.opsForHash().hasKey("map1","username")
如果key对应的map不存在,则新增到map中,存在则不新增也不覆盖
 redisTemplate.opsForHash().putIfAbsent("map2","username","hzx2");redisTemplate.opsForHash().putIfAbsent("map2","username","hzx02abcd");

在这里插入图片描述

将一个完成的键值对直接放入redis
 Map<Object,Object> map3 = new HashMap<>();
map3.put("id",3);
map3.put("username","hzx03");
redisTemplate.opsForHash().putAll("map3",map3);

在这里插入图片描述

命令读取数据
#1. 存储数据
hset key field value#2. 获取数据
hget key field#3. 批量操作
hmset key field value [field value ...]
hmget key field [field ...]#4. 自增(指定自增的值)
hincrby key field increment#5. 设置值(如果key-field不存在,那么就正常添加,如果存在,什么事都不做)
hsetnx key field value#6. 检查field是否存在
hexists key field #7. 删除key对应的field,可以删除多个
hdel key field [field ...]#8. 获取当前hash结构中的全部field和value
hgetall key#9. 获取当前hash结构中的全部field
hkeys key#10. 获取当前hash结构中的全部value
hvals key#11. 获取当前hash结构中field的数量
hlen key
set
向key中批量添加值
redisTemplate.opsForSet().add("set1","hzx1","hzx2");
redisTemplate.opsForSet().add("set1","hzx3");
获取key中的所有值
redisTemplate.opsForSet().members("set1")

在这里插入图片描述

获取key对应集合的长度
redisTemplate.opsForSet().size("set1")

在这里插入图片描述

随机获取key对应的集合中的元素
redisTemplate.opsForSet().randomMember("set1")

在这里插入图片描述

随机获取key对应集合中指定个数的元素

set本身是不会有重复的值
随机获取可能获取到一样的,所以返回的list集合中可能会有重复的值

redisTemplate.opsForSet().randomMembers("set1",2)

在这里插入图片描述

随机获取key对应集合中指定个数的元素,并且去重
redisTemplate.opsForSet().distinctRandomMembers("set1",2)

在这里插入图片描述

zset
注意

执行添加操作时要注意,当sqlserver数据库添加成功而redis添加失败的情况。

在hash、set、zset中,zset既要排序又要查重,对内存的消耗是最大的,所以一般不使用。

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

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

相关文章

BMA456 运动传感器

型号简介 BMA456是博世&#xff08;bosch-sensortec&#xff09;的一款超小型、三轴、低重力高性能加速度传感器&#xff0c;配备数字接口。该传感器适用于低功耗且要求严格的消费电子应用。它可以检测手腕倾斜、按压/双击&#xff0c;并支持即插即用计步功能&#xff0c;尤其适…

cefsharp 126+ 默认系统右键菜单变化及移除方法

菜单名称变化 关键字:IContextMenuHandler、OnBeforeContextMenu、OnContextMenuCommand 内容比之前老版本多了,样式好看了。 CefSharpSettings.RuntimeStyle = CefRuntimeStyle.Chrome;//127+以后将默认 //CefSettings.ChromeRuntime = false;//可禁用 namespace CefSha…

一位谷歌量子计算工程师繁忙的一天

早晨&#xff1a;准备与计划 7:00 AM - 起床 谷歌量子计算工程师Lisa早早起床&#xff0c;开始新的一天。快速洗漱后&#xff0c;吃一顿健康的早餐&#xff0c;确保有足够的能量应对繁忙的工作。 7:30 AM - 通勤 乘坐公司班车前往谷歌量子AI实验室。在车上浏览一些科技新闻和…

基于matlab的控制系统串联校正—相位超前校正问题实例

1.问题 为了改进闭环系统性能&#xff0c;可以采用串联校正&#xff0c;这里用相位超前校正&#xff0c;即 α 常取 0.07~0.2 &#xff0c;选择适当的 α 与 τ &#xff0c; 要使 针对新的开环传递函数 G ’ K (S)Gc(S) G(S) H(S) &#xff0c;画出开环 Bode 图&#xff…

大创项目推荐 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…

探索Vim的网络边界:如何在Vim中畅游互联网

&#x1f310; 探索Vim的网络边界&#xff1a;如何在Vim中畅游互联网 Vim&#xff0c;被誉为编辑器之神&#xff0c;不仅在本地文本编辑上表现出色&#xff0c;还拥有一些鲜为人知的网络功能。这些功能让Vim能够在网络环境中更加灵活地处理文件和数据。本文将详细介绍如何在Vi…

数据结构-排序算法篇

前言 在我们的生活中有很多东西都是有大小的&#xff0c;那么该如何去排序&#xff1f;假设有10个数字要你去排序&#xff0c;眼睛一扫就看出来了&#xff0c;那100、1000、10000要怎么去排&#xff1f;下面就为大家介绍各种排序的算法。 内容 1.冒泡排序 2.选择排序 3.插入…

postman使用笔记

Postman 是一个广泛使用的 API 开发工具&#xff0c;它提供了一个用户友好的图形界面来发送 HTTP 请求、查看响应、组织测试用例和创建自动化测试。以下是一些基本的 Postman 使用教程&#xff0c;结合了搜索结果中的信息&#xff1a; 安装 Postman 访问 Postman 官方网站下载…

vue2 中如何使用 vuedraggable 库实现拖拽功能

1.通过 npm 或 yarn 安装 vuedraggable 库 npm install vuedraggableyarn add vuedraggable 2. 引入组件内部使用&#xff0c;以下代码是一个Demo&#xff0c;可直接复制粘贴演示 注意&#xff1a;因项目使用了 vant&#xff0c;需要安装 vant 才能正常运行 <template&g…

windows USB设备驱动开发-开发USB 设备端驱动

USB 设备是通过单个端口连接到计算机的外设&#xff0c;例如鼠标设备和键盘。 USB 客户端驱动程序是计算机上安装的软件&#xff0c;该软件与硬件通信以使设备正常运行。 如果设备属于 Microsoft 支持的设备类&#xff0c;Windows 会为该设备加载 Microsoft 提供的 USB 驱动程序…

简单分享下python封装

目录&#xff1a; 一、简介&#xff0c;什么是封装 二、封装的优点与好处 三、封装的示例 四、可封装的场景 一、简介&#xff0c;什么是封装 通俗理解&#xff1a;封装&#xff0c;简而言之&#xff0c;就是把数据&#xff08;变量&#xff09;和操作这些数据的方法&#xff0…

什么是低代码(Low Code)?全面解析国内十大低代码平台

什么是低代码&#xff08;Low Code&#xff09;&#xff1f;为什么低代码这么火&#xff1f;国内排名前十的低代码平台分别是哪些&#xff1f;低代码平台的操作方法&#xff1f;低代码的优缺点&#xff1f;以及低代码有哪些典型案例&#xff1f;本文集合本人5年来的低代码实践经…

Spring Boot与Kafka的集成应用

Spring Boot与Kafka的集成应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 引言 Kafka作为一款高性能、分布式的消息队列系统&#xff0c;与Spring Bo…

TongRDS2214手动部署版指引(by lqw+sy)

文章目录 前言准备工作单机版集群版哨兵版多个中心节点配置 前言 由于一些特殊原因&#xff08;例如服务器没有联网&#xff0c;没有办法直接更新和下载unzip指令&#xff0c;从而导致控制台版本安装节点之后&#xff0c;会报file not found的错误&#xff0c;或者使用不了rds…

1.什么是js?特点是什么?组成部分?

Js是一种直译式脚本语言&#xff0c;一种动态类型&#xff0c;弱类型&#xff0c;基于原型的高级语言。 直译式&#xff1a;js程序运行过程中直接编译成机器语言。 脚本语言&#xff1a;在程序运行过程中逐行进行解释说明&#xff0c;不需要预编译。 动态类型&#xff1a;js…

C++:静态函数的作用

在C中&#xff0c;静态函数&#xff08;static 函数&#xff09;的作用主要是限定该函数的可见性和链接性&#xff0c;而不是直接关联于函数的返回类型或参数列表&#xff08;尽管你提到了static int()这样的形式&#xff0c;这里的static是修饰函数本身的&#xff0c;而不是in…

(PC+WAP)高端大气的装修装潢公司网站模板

(PCWAP)高端大气的装修装潢公司网站模板PbootCMS内核开发的网站模板&#xff0c;该模板适用于装修公司网站、装潢公司网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b;(PCWAP)&#xff0c;同一个后台&#xff0c;数据即…

javascript Reflect.has作用

JavaScript中的Reflect.has()方法用于检查一个属性是否存在于对象中。它的作用类似于 in 运算符&#xff0c;但是作为函数形式提供&#xff0c;更适合在某些需要函数调用的上下文中使用&#xff0c;尤其是在函数式编程风格中。Reflect.has()方法接收两个参数&#xff1a; targ…

采集网关iGR-1700产品组成与集成

采集网关iGR-1700作为国瑞iGR-IMS数据综合管理系统的一个重要组成部分&#xff0c;其产品组成与集成主要体现在以下几个方面&#xff1a; 一、产品组成 iGR-1700数据采集网关主要用于生产数据的采集。具体而言&#xff0c;它能够&#xff1a; 1. 自动化提取数据&#xff1a;…

Pandas实战秘籍:轻松驾驭重复值与异常值的处理艺术,让数据清洗更高效!

1.导包 import numpy as np import pandas as pd2.删除重复行 def make_df(indexs,columns):data [[str(j)str(i) for j in columns] for i in indexs]df pd.DataFrame(datadata,indexindexs,columnscolumns)return df使用 duplicated() 函数检测重复的行 返回元素为布尔类…