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.0

protected-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: 6379
    host: 127.0.0.1
    database: 1
    password: 123456
    jedis:
      pool:
        max-active: 8
        max-idle: 8
        max-wait: 1ms
    timeout: 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 {
	
	@Bean
	public 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设置到jackson2JsonRedisSerializer
		jackson2JsonRedisSerializer.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 {
    @Autowired
    private RedisTemplate redisTemplate;
}
string

初始化数据

    private String initUserJson() {
        return JSON.toJSON(new User(1,"hzx1","This is a test user")).toString();
    }
数据写入redis,并查询
    @Test
    public 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通过链表实现,插入数据时需要区分左插入和右插入。可以逐条数据插入也可以批量数据插入

    @Test
    public 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中读取
    @Test
    public 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既要排序又要查重,对内存的消耗是最大的,所以一般不使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ubuntu18.04】 局域网唤醒 wakeonlan

ai服务器经常因为断电,无法重启,当然可以设置bios 来电启动。 这里使用局域网唤醒配置。 自动开关机设置 工具:ethtool 端口 : enp4s0 Wake-on: d 表示禁用Wake-on: g 激活 ,例如:ethtool -s eth0 wol g 配置/etc/rc.local ,这个文件不存在,自己创建工具下载 tengxun W…

mysql 命令 —— 查看表信息(show table status)

查询表信息&#xff0c;如整个表的数据量大小、表的索引占用空间大小等 1、查询某个库下面的所有表信息&#xff1a; SHOW TABLE STATUS FROM your_database_name;2、查询指定的表信息&#xff1a; SHOW TABLE STATUS LIKE your_table_name;如&#xff1a;Data_length 显示表…

开放式耳机哪个品牌最好?2024高热度机型推荐,选购不迷茫

选购开放式耳机时&#xff0c;面对琳琅满目的品牌与型号是否感到不知道怎么选择&#xff1f;别担心&#xff0c;作为耳机爱好者与资深评测人&#xff0c;我精心整理了几款热门开放式耳机的全面对比。这次对比不仅涵盖如何挑选&#xff0c;有哪些不要菜类的额点&#xff0c;还推…

第十四届蓝桥杯省赛C++B组E题【接龙数列】题解(AC)

需求分析 题目要求最少删掉多少个数后&#xff0c;使得数列变为接龙数列。 相当于题目要求求出数组中的最长接龙子序列。 题目分析 对于一个数能不能放到接龙数列中&#xff0c;只关系到这个数的第一位和最后一位&#xff0c;所以我们可以先对数组进行预处理&#xff0c;将…

数字化供应链:背景特点

​背景 1、外部环境 近年来&#xff0c;供应链脆弱性凸显&#xff0c;企业供应链压力难以缓解。 美国媒体针对美国零售联合会、美国服装和鞋类协会、美国供应链管理专业委员会等主体进行的一项供应链调查显示&#xff1a; 61%的供应链经理预计&#xff0c;供应链紊乱问题至少…

老师怎样将期末成绩怎样私发家长?

作为老师&#xff0c;期末成绩的发布不仅是对学生一学期学习成果的评价&#xff0c;更是家校沟通的重要环节。然而&#xff0c;这一过程往往比我们想象的更为复杂和繁琐。 我们需要确保每个学生的成绩准确无误。这意味着在成绩录入之后&#xff0c;必须进行多次核对&#xff0c…

Java将list数组中重复的对象进行去重

/*** 数组去重*/ public class ArrayDistinct {public static void main(String[] args) {ArrayList<Object> list new ArrayList<>();JSONObject jsonObject1 new JSONObject();jsonObject1.put("name","张三");jsonObject1.put("age&…

序号不足两位前面补0

预期目标 原始效果 代码实现 {${(index 1).toString().padStart(2, 0)}. ${item.sentence}}要实现自动编号并确保显示为两位数的格式&#xff0c;可以在 {index 1} 的地方进行格式化。在 JavaScript 中&#xff0c;可以使用 String.prototype.padStart() 方法来补足数字到指定…

终极指南:RNNS、Transformers 和 Diffusion 模型

一、说明 作为广泛使用这些工具和模型的人&#xff0c;我的目标是解开 RNN、Transformer 和 Diffusion 模型的复杂性和细微差别&#xff0c;为您提供详细的比较&#xff0c;为您的特定需求提供正确的选择。 无论您是在构建语言翻译系统、生成高保真图像&#xff0c;还是处理时间…

kettle从入门到精通 第七十四课 ETL之kettle kettle调用https接口教程,忽略SSL校验

场景&#xff1a;kettle调用https接口&#xff0c;跳过校验SSL。&#xff08;有些公司内部系统之间的https的接口是没有SSL校验这一说&#xff0c;无需使用用证书的&#xff09; 解决方案&#xff1a;自定义插件或者自定义jar包通过javascript调用https接口。 1、http post 步…

为什么是视频传输用YUV格式,而放弃RGB格式?

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《音视频》系列专栏&…

Linux系统之 — 线程

Linux系统之 — 线程 线程介绍线程使用死锁&#xff08;Deadlock&#xff09;竞态条件&#xff08;Race Condition&#xff09; 线程使用示例服务器端代码示例服务器端示例拆解1. 引入头文件和宏定义2. 定义全局变量3. 定义线程函数4. 主函数5. 错误处理和资源释放 客户端代码示…

Keil5 ST-LINK setting闪退问题解决

1. 官网下载新版驱动文件 MDK uVision crashes when using ST-Link debugger 2. 解压替换 STLinkUSBDriver6.1.2.0Signed 我的库文件目录&#xff1a; D:\Tool\Keil5\ARM\STLink

一文搞懂 java 线程池:ThreadPoolExecutor 和 FixedThreadPool 原理

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

Linux——shell原理和文件权限

1.shell原理 在我们使用云服务器时&#xff0c;需要通过shell进行使用&#xff0c;而shell则是一种外壳程序。 我们提到过&#xff0c;大部分的指令实际上就是文件&#xff0c;当用户需要执行某种功能时&#xff0c;由于用户不擅长和操作系统直接交互&#xff08;操作复杂&…

k8s部署单机版mysql8

一、创建命名空间 # cat mysql8-namespace.yaml apiVersion: v1 kind: Namespace metadata:name: mysql8labels:name: mysql8# kubectl apply -f mysql8-namespace.yaml namespace/mysql8 created# kubectl get ns|grep mysql8 mysql8 Active 8s二、创建mysql配…

论文学习——使用基于多项式拟合的预测算法求解动态多目标问题

论文题目&#xff1a;Solving dynamic multi-objective problems using polynomial fitting-based prediction algorithm 使用基于多项式拟合的预测算法求解动态多目标问题&#xff08;Qingyang Zhang , Xiangyu He,Shengxiang Yang , Yongquan Dong , Hui Song , Shouyong Ji…

配置WLAN 示例

规格 仅AR129CVW、AR129CGVW-L、AR109W、AR109GW-L、AR161W、AR161EW、AR161FGW-L、AR161FW、AR169FVW、AR169JFVW-4B4S、AR169JFVW-2S、AR169EGW-L、AR169EW、AR169FGW-L、AR169W-P-M9、AR1220EVW和AR301W支持WLAN-FAT AP功能。 组网需求 如图1所示&#xff0c;企业使用WLAN…

JDeveloper 12C 官网下载教程

首先、我们要登录Oracle官网 Oracle 甲骨文中国 | 云应用和云平台 登录进去如果不是中文可以点击右上角带有国旗的图标就行更改&#xff0c;选择一个你能看懂的文字。 然后&#xff0c;点击“资源”—点击“开发人员下载” 然后&#xff0c;点击“开发工具” 这里有很多工具可…

【设计模式】【行为型模式】【责任链模式】

系列文章目录 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录…