SpringBootWeb 篇-深入了解 Redis 五种类型命令与如何在 Java 中操作 Redis

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍

文章目录

        1.0 Redis 概述

        1.1 Redis 下载与安装

        2.0 Redis 数据类型

        3.0 Redis 常见五种类型的命令

        3.1 字符串操作命令

        3.2 哈希操作命令

        3.3 列表操作命令

        3.4 集合操作命令

        3.5 有序集合操作命名

        3.6 通用命令

        4.0 在 Java 中操作 Redis

        4.1 Spring Data Redis 环境搭建

        4.2 操作字符串类型的数据

        4.3 操作哈希类型的数据

        4.4 操作列表类型的数据

        4.5 操作集合类型的数据

        4.6 操作有序集合类型的数据


        1.0 Redis 概述

        Redis 是一个基于内存的 key-value 结构数据库。基于内存存储,读写性能高。适合存储热点数据,以便大量用户访问时可以快速得到响应。

        1.1 Redis 下载与安装

        Redis 官网:Redis - The Real-time Data Platform

        Redis 的 Windows 版属于绿色软件。直接解压即可使用,解压目录结构如下:

        1)redis.windows.conf:配置文件,用来配置 Redis 服务器的各种参数和选项。

比如:

        port:指定 Redis 服务器监听的端口号,默认为 6379。

        bind:指定Redis服务器监听的IP地址。

        requirepass:设置访问Redis数据库需要的认证密码。

        maxmemory:设置Redis数据库使用的最大内存限制。

        maxclients:设置Redis允许的最大客户端连接数。

        logfile:指定Redis日志文件的位置。

        dir:指定Redis持久化数据文件的存储目录。

        pidfile:指定Redis服务器进程的PID文件位置。

        2)redis-server.exe:Redis 服务端可执行文件,用来启动 Redis 服务端。

        3)redis-cli.exe:Redis 客户端可执行文件,用来启动 Redis 客户端。

        2.0 Redis 数据类型

        Redis 存储的是 key-value 结构的数据,其中 key 是字符串类型,value 有5 种常用的数据类型:字符串 string、哈希 hash、列表 list、集合 set、有序集合 sorted set/zset 。

各种数据类型的特点:

        1)字符串 string:普通字符串,Redis 中最简单的数据类型。

        2)哈希 hash:也叫散列,类似于 Java 中的 HashMap 结构。

        3)列表 list:按照插入顺序,可以有重复元素,类似于 Java 中的 LinkedList 。

        4)集合 set:无序集合,没有重复元素,类似于 Java 中的 HashSet 。

        5)有序集合 zset:集合中每一个元素关联一个分数 score,根据分数升序排序,没有重复元素。

        3.0 Redis 常见五种类型的命令

        字符串操作命令、哈希操作命令、列表操作命令、集合操作命令、有序集合操作命令。

        3.1 字符串操作命令

Redis 字符串类型的常用命令:

        1)SET key value:设置指定 key 的值。

        2)GET key:获取指定 key 的值。

        3)SETEX key seconds value:设置指定 key 的值,并将 key 的过期时间设为 seconds 秒。

        4)SETNX key value:只有在 key 不存在时设置 key 的值。

代码演示:

> set id 1
OK
> get id
1
> setex code 30 123456
OK
> setnx id 2
0

        3.2 哈希操作命令

        Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

Redis 哈希类型的常用命令:

        1)HSET key field value:将哈希表 key 中的字段 field 的值设为 value 。

        2)HGET key field:获取存储在哈希表中指定字段的值。

        3)HDEL key field:删除存储在哈希表中的指定字段。

        4)HKEYS key:获取哈希表中所有字段。

        5)HVALS key:获取哈希表中所有值。

代码演示:

        存储一个 student 对象信息。

设置字段值:

> HSET student name 小板
1
> HSET student age 22
1
> hset student gender 男
1

运行结果:

获取相应字段的值: 

> hget student name
小板
> hget student age
22
> hget student gender
男

        获取字段相对应的值。

获取 student 所有的 field 与 所有的 value:

> hkeys student
name
age
gender
> hvals student
小板
22
男

删除指定的字段:

> hdel student gender
1

运行结果:

        3.3 列表操作命令

        Redis 列表是简单的字符串列表,按照插入顺序排序。

Redis 列表类型的常用命令:

        1)LPUSH key value1 [value2]:将一个或多个值插入到列表头部。

        2)LRANGE key start stop:获取列表指定范围内的元素。

        3)RPOP key:移除并获取列表最后一个元素。

        4)LLEN key:获取列表长度。

代码演示:

在列表中插入多个值:

> lpush mylist a b c d
4

运行结果:

        该插入的方式为:头插数据。

获取指定全部数据:

> lrange mylist 0 -1
d
c
b
a

删除最后一个元素:

> rpop mylist
a

获取列表中的个数:

> llen mylist
3

        3.4 集合操作命令

        Redis set 是 string 类型的无序集合。集合成员是唯一的,集合中不能出现重复的数据。

Redis 集合类型的常用命令:

        1)SADD key member1 [member2]:向集合添加一个或多个成员。

        2)SMEMBERS key:返回集合中的所有成员。

        3)SCARD key:获取集合的成员数。

        4)SINTER key1 [key2]:返回给定所有集合的交集。

        5)SUNION key1 [key2]:返回所有给定所有集合的并集。

        6)SREM key member1 [member2]:删除集合中一个或多个成员。

代码演示:

向集合中添加元素:

> sadd set1 a b c d
4
> sadd set2 a b x y
4

        需要注意的是,添加顺序不等于存储之后的顺序。这里就可以体现出了无序性。

获取所有的成员:

> smembers set1
a
d
c
b
> smembers set2
a
x
y
b

获取集合中成员的个数:

> scard set1
4
> scard set2
4

获取两个集合的交集:

> sinter set1 set2
a
b

获取两个集合的并集:

> sunion set1 set2
a
x
y
d
c
b

        3.5 有序集合操作命名

        Redis 有序集合是 string 类型元素的集合,且不允许有重复成员。每一个元素都会关联一个 double 类型的分数。

Redis 有序集合类型的常用命令:

        1)ZADD key score1 member1 [score2 member2]:向有序集合添加一个或多个成员。

        2)ZRANGE key start stop[WITHSCORE]:通过索引区间返回有序集合中指定区间的成员。

        3)ZINCRBY key increment member:有序集合中对指定成员的分数加上增量 increment 。

        4)ZREM key member1 [member2]:移除有序集合中的一个或多个成员。

代码演示:

向有序集合中添加成员:

> zadd zset 10 a 11 b 12 c
3

运行结果:

获取全部成员:

> zrange zset 0 -1
a
b
c

也可以带上分数:

> zrange zset 0 -1 WITHSCORES
a
10
b
11
c
12

对 zet 集合中的指定成员的 score 增加:

> zincrby zset 5 a
15

运行结果:

移除集合中指定的成员:

> zrem zset c
1

运行结果:

        3.6 通用命令

        Redis 的通用命令是不分数据类型的,都可以使用命令。

Redis 通用的常用命令:

        1)KEYS pattern:查找所有符合给定模式(pattern)的 key 。

        2)EXISTS key:检查给定 key 是否存在。

        3)TYPE key:返回 key 所存储的值的类型。

        4)DEL key:该命令用于在 key 存在则删除 key 。

代码演示:

KEYS *,匹配所有的 key:

> keys *
id
STUDENT
set2
zset
set1
student
mylist
list

检查是否存在 set1:

> exists set1
1
> exists set3
0

        存在则返回 1;不存在则返回 0 。

判断类型:

> type set1
set
> type list
list
> type student
hash
> type id
string
> type zset
zset

删除 list:

> del list
1
> keys *
id
STUDENT
set2
zset
set1
student
mylist

        4.0 在 Java 中操作 Redis

        Redis 的 Java 客户端很多,常用的几种:Jedis、Lettuce、Spring Data Redis 。在 Spring Data Redis 是 Spring 的一部分,对 Redis 底层开发进行了高度封装,在 Spring 项目中,可以使用 Spring Data Redis 来简化操作。

        4.1 Spring Data Redis 环境搭建

        1)导入 Spring Data Redis 的 maven 坐标。

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

        2)配置 Redis 数据源。

  redis:host: localhostport: 6379password: 123456database: 0

        host:主机号、port:端口号、password:密码、database:数据库。

        这里的数据库指定是 Redis 中的数据库,一共有 16 个数据库,默认会自动选择 0 号的数据库。

        3)编写配置类,创建 RedisTemplate 对象。

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.StringRedisSerializer;@Configuration
public class RedisConfiguration {@Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){//创建 redis 模板对象RedisTemplate redisTemplate = new RedisTemplate();//设置 redis 的连接工厂redisTemplate.setConnectionFactory(redisConnectionFactory);//设置 redis key 的序列化器redisTemplate.setKeySerializer(new StringRedisSerializer());return redisTemplate;}
}

        4)通过 RedisTemplate 对象操作 Redis 。

        完成以上的步骤,就可以通过 RedisTemplate 对象来获取五种类型的操作对象了。

代码演示:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;@SpringBootTest
public class test {@AutowiredRedisTemplate redisTemplate;@Testpublic void test(){System.out.println(redisTemplate);//获取到 string 类型的操作对象ValueOperations valueOperations = redisTemplate.opsForValue();//获取到 hash 类型的操作对象HashOperations hashOperations = redisTemplate.opsForHash();//获取到 list 类型的操作对象ListOperations listOperations = redisTemplate.opsForList();//获取到 set 类型的操作对象SetOperations setOperations = redisTemplate.opsForSet();//获取到有序集合 zset 类型的操作对象ZSetOperations zSetOperations = redisTemplate.opsForZSet();}
}

        4.2 操作字符串类型的数据

常见的方法:

        1)set(key,value):设置键值对 k v 。

        2)set(key,value,timeout,unit):设置有效时间的键值对。

        3)get(key):根据键来获取值。

        4)setIfAbsent(key,value):设置一个键值对,只有在 key 不存在时设置 key 的值。

代码演示:

    @Testpublic void test1(){//先获取到操作字符串类型的对象ValueOperations valueOperations = redisTemplate.opsForValue();//设置键值对 k vvalueOperations.set("cls","1");//根据键来获取值String cls = (String) valueOperations.get("cls");//设置有效时间的键值对,设置一个有效时间为 3 分钟的键值对valueOperations.set("code","123456",3, TimeUnit.MINUTES);//设置一个键值对,只有在 key 不存在时设置 key 的值valueOperations.setIfAbsent("bee","2");//因为已经存在bee键,所以值依然是3valueOperations.setIfAbsent("bee","3");}

运行结果:

        4.3 操作哈希类型的数据

常见的方法:

        1)put(key,field,value):新增数据。

        2)get(key,field):获取数据。

        3)keys(key):获取 key 中的全部字段。

        4)values(key):获取 key 中的全部值。

        5)delete(key,field):删除 key 中 field 的字段。

代码演示:

    @Testpublic void test2(){//先获取到操作哈希的对象HashOperations hashOperations = redisTemplate.opsForHash();//新增数据hashOperations.put("student","id","1");hashOperations.put("student","name","小扳手");hashOperations.put("student","age","22");//根据字段来获取值String id = (String) hashOperations.get("student", "id");String name = (String) hashOperations.get("student", "name");System.out.println(id + " " + name);//获取student中的全部键Set student = hashOperations.keys("student");System.out.println(student);//获取student中的全部值List student1 = hashOperations.values("student");System.out.println(student1);//删除指定的字段hashOperations.delete("student","age");}

运行结果:

        4.4 操作列表类型的数据

常见的方法:

        1)leftPushAll(key,values):批量增加数据。

        2)leftPush(key,value):新增数据。

        3)range(key,start,end):获取指定范围的数据。

        4)rightPop(key):删除最后一个数据。

        5)size(key):获取列表中的数据个数。

代码演示:

    @Testpublic void test3(){ListOperations listOperations = redisTemplate.opsForList();//批量增加数据listOperations.leftPushAll("mylist","1","2","3");//新增单个数据listOperations.leftPush("mylist","4");//获取范围内的数据List mylist = listOperations.range("mylist", 0, -1);System.out.println(mylist);//删除最后一个数据String date = (String) listOperations.rightPop("mylist");System.out.println(date);//获取列表中的数据个数Long len = listOperations.size("mylist");System.out.println(len);}

运行结果:

        4.5 操作集合类型的数据

常见的方法:

        1)add(key,values):新增单个数据或者批量新增数据。

        2)members(key):获取 Key 中的全部成员。

        3)size(key):获取 key 中的成员个数。

        4)intersect(key1,key2):获取两个集合中的交集。

        5)union(key1,key2):获取两个集合中的并集。

        6)remove(key,values):删除 key 中指定的 value ,可以是一个 value 也可以是多个 value 。

代码如下:

    @Testpublic void test4(){SetOperations setOperations = redisTemplate.opsForSet();//批量新增数据setOperations.add("set1","a","b","c");setOperations.add("set2","a","x","y");//获取key中的成员Set member = setOperations.members("set1");System.out.println(member);//获取key中的成员个数Long len = setOperations.size("set2");System.out.println(len);//两个集合的交集Set intersect = setOperations.intersect("set1", "set2");System.out.println(intersect);//获取两个集合的并集Set union = setOperations.union("set1", "set2");System.out.println(union);//删除成员setOperations.remove("set1","c");}

运行结果:

        4.6 操作有序集合类型的数据

常见的方法:

        1)add(key,value,score):新增数据。

        2)range(key,start,end):获取指定范围的数据。

        3)incrementScore(key,value,delta):给指定的数据的分数增加 dalta 。

        4)remove(key,values):删除数据。可以删除单个数据,也可以批量删除数据。

代码演示:

    @Testpublic void test5(){ZSetOperations zSetOperations = redisTemplate.opsForZSet();//新增数据zSetOperations.add("z","a",10);zSetOperations.add("z","b",15);zSetOperations.add("z","c",20);//获取指定范围的数据Set z = zSetOperations.range("z", 0, -1);System.out.println(z);//给指定的数据增加分数zSetOperations.incrementScore("z","a",10);//删除数据zSetOperations.remove("z","c");}

运行结果:

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

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

相关文章

Webpack 从入门到精通-基础篇

一、webpack 简介 1.1 webpack 是什么 webpack 是一种前端资源构建工具&#xff0c;一个静态模块打包器(module bundler)。 在 webpack 看来, 前端的所有资源文件(js/json/css/img/less/...)都会作为模块处理。 它将根据模块的依赖关系进行静态分析&#xff0c;打包生成对应的…

【深度学习】【机器学习】支持向量机,网络入侵检测,KDD数据集

文章目录 环境加载数据归一化数据训练模型用测试数据集给出评估指标准确率召回率预测某个输入数据随便取一行数据加载训练好的SVM支持向量机模型并预测 全部数据和代码下载 环境 之前介绍过用深度学习做入侵检测&#xff0c;这篇用向量机。 环境Python3.10 requirements.txt…

Vuex3学习笔记

文章目录 1&#xff0c;入门案例辅助函数 2&#xff0c;mutations传参辅助函数 3&#xff0c;actions辅助函数 4&#xff0c;getters辅助函数 5&#xff0c;模块拆分6&#xff0c;访问子模块的state辅助函数 7&#xff0c;访问子模块的getters辅助函数 8&#xff0c;访问子模块…

虚拟机调用摄像头设备一直 select timeout问题的解决

在VMware里面调用v4l2-ctl捕获图像&#xff0c;或者opencv的VideoCapture(0)捕获图像&#xff0c;或者直接调用v4l2的函数&#xff0c;在streamon后&#xff0c;调用select读取数据&#xff0c;均会一直提示select timeout的问题&#xff0c;大概率是由于USB版本的兼容性造成的…

每日5题Day21 - LeetCode 101 - 105

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; class Solution {public boolean isSymmetric(TreeNode root) {if(root null){return true;}Stack<…

类和对象(下+)_const成员、初始化列表、友元、匿名对象

类和对象&#xff08;下&#xff09; 文章目录 类和对象&#xff08;下&#xff09;前言一、const成员二、友元1.友元函数2.友元类 三、初始化列表四、explicit关键字五、匿名对象总结 前言 static成员、内部类、const成员、初始化列表、友元、匿名对象 一、const成员 将cons…

网络安全难学吗?2024该怎么系统学习网络安全?

学习网络安全需要循序渐进&#xff0c;由浅入深。很多人对网络安全进行了解以后&#xff0c;就打算开始学习网络安全&#xff0c;但是又不知道怎么去系统的学习。 网络安全本身的知识不难&#xff0c;但需要学习的内容有很多&#xff0c;其中包括Linux、数据库、渗透测试、等保…

excel拖拽怎么使单元格序号不递增

拖拽下来不仅不递增&#xff0c;而且右下角没有倒三角可以设置改变&#xff0c;&#xff08;即没有下图这个&#xff09; 则&#xff0c;可以采用以下方法 excel数值拖拽不递增还有一个更快更快捷的方法&#xff0c;这就运用到了excel快捷键&#xff0c;我们把鼠标放到单元格的…

康谋技术 | 自动驾驶:揭秘高精度时间同步技术(二)

在自动驾驶中&#xff0c;对车辆外界环境进行感知需要用到很多传感器的数据&#xff08;Lidar&#xff0c;Camera&#xff0c;GPS/IMU&#xff09;&#xff0c;如果计算中心接收到的各传感器消息时间不统一&#xff0c;则会造成例如障碍物识别不准等问题。 为了对各类传感器进…

consul做配置中心

1. 分布式配置中心 consul不仅可做注册中心&#xff0c;还可做配置中心 applicaiton.yml与bootstrap.yml: applicaiton.yml是用户级的资源配置项bootstrap.yml是系统级的&#xff0c;优先级更加高 Spring Cloud会创建一个“Bootstrap Context”&#xff0c;作为Spring应用…

ReactRouter——路由配置、路由跳转、带参跳转、新route配置项

目录 写在前面 (一)初步使用router 1.安装react-router-dom 2.创建router结构 3.嵌套路由 4.配置not found页面 (1)确切路由报错页面 (2)未配置路由报错页面 5.重定向 (二)路由跳转 1.组件跳转 2.NavLink 3.js跳转 (三)传递参数 1.searchParams(query)参数 2…

kafka集成SpringBoot api编写教程

1.新建项目 用的idea是20222.1.3版本&#xff0c;没有Spring Initializr 插件&#xff0c;不能直接创建springboot项目 可以在以下网址创建项目&#xff0c;下载后解压&#xff0c;然后用idea打开项目即可 1.1 在 https://start.spring.io/ 上创建项目 1.2上传到linux&#x…

10.2 Go Channel

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Letcode-Top 100二叉树专题

94. 二叉树的中序遍历 方法一&#xff1a;递归法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeN…

【python】在【机器学习】与【数据挖掘】中的应用:从基础到【AI大模型】

目录 &#x1f497;一、Python在数据挖掘中的应用&#x1f495; &#x1f496;1.1 数据预处理&#x1f49e; &#x1f496;1.2 特征工程&#x1f495; &#x1f497;二、Python在机器学习中的应用&#x1f495; &#x1f496;2.1 监督学习&#x1f49e; &#x1f496;2.2…

第1章Hello world 3/5:Cargo.lock:确保构建稳定可靠:运行第一个程序

讲动人的故事,写懂人的代码 1.6 Cargo.lock:确保构建稳定可靠 “看!”席双嘉一边指着屏幕一边说,“终端窗口提示符的颜色,从绿变黄了。这就意味着代码在上次提交后有点变化。” 赵可菲:“但是我们只是运行了程序,代码应该没动呀。” 席双嘉敲了下git status -uall,这…

计网总结☞网络层

.................................................. 思维导图 ........................................................... 【Wan口和Lan口】 WAN口&#xff08;Wide Area Network port&#xff09;&#xff1a; 1)用于连接外部网络&#xff0c;如互联…

SpringBoot学习笔记

总体思路&#xff1a;先写dao,再写service 1.https://start.spring.io 生成对应的模板 2.写TestCotroller类&#xff0c;类上写RestCotroller注解 3.TestCotroller类里写方法&#xff0c;方法上写GetMapping("/方法名")注解 4.不一定要写GetMapping,具体看做什么操…

MySQL从入门到高级 --- 15.优化 16.pymysql

文章目录 第十五章 && 第十六章&#xff1a;15.优化15.1 查询SQL执行效率15.2 定位低效率执行SQL15.3 explain分析执行计划 - 基本使用15.4 explain分析执行计划 - id15.5 explain分析执行计划 - select_type15.6 explain分析执行计划 - type15.7 explain分析执行计划 …

MySQL高性能(MySQL锁)

MySQL性能系列 MySQL锁 前言1. 死锁机制2. 思维导图与锁划分介绍3. 粒度划分锁3.1. 全局锁3.2. 页级锁&#xff08;Page-level locking&#xff09;3.3. 表级锁&#xff08;Tables-level lock&#xff09;○ 共享锁&#xff08;表级&#xff09;○ 排他锁&#xff08;表级&…