【Redis 开发】(长篇学习)掌握Redis的用法,各种客户端下的操作

news2024/11/14 11:24:15

Redis

  • 前言
  • Redis
  • Redis的安装
    • Redis启动
    • Redis客户端
  • Redis常见命令
  • Redis的java客户端
    • jedis学习
      • 简单的jedis 入门流程
      • Jedis连接池
    • SpringDataRedis
      • SpringDataRedis快速入门

前言

我们在作者之前的文章: 快速掌握Redis安装与基本语法的基础上进行系统的学习,学习自黑马程序员的Redis实战课堂,进行学习总结,希望对大家有所帮助

Redis

SQL语句与NoSQL语句的特点:
在这里插入图片描述

数据关联:在关系型数据库中,表与表之间存在数据库的关联信息,而NoSQL数据之间没有关联信息,需要自定义逻辑进行信息关联
事务特性: NoSQL只能维持基本的事务操作,所以一般对事务性要求高的需要用关系型数据库
数据结构:不是说完全自由,有一个宽泛的整体结构,比如Redis键值类型,MongDB文档类型,列类型(HBse)Graph(Neo4j)
扩展性: 垂直就是数据库需要部署在一个机器上,只能够通过添加存储空间的方式进行优化,而水平就是Redis存储数据时根据id值通过hash进行运算分布式的存储在多个机器上
单线程:每个命令具有原子性,现在常说的版本是多线程是指在网络请求方面是多线程处理,其本质还是单线程
低延迟,速度快:基于内存,IO多路复用
数据持久化:定时将内存数据写入到磁盘当中
支持主从集群,分片集群:提高上述所讲的水平扩展

Redis的安装

前边所讲的Redis的安装,安装的版本是windows版本的,我们现在安装Linux版本
安装地址:https://redis.io/
步骤:

  1. 执行yum install -y gcc ctl:安装Redis依赖,Rrdis是基于C语言开发的,需要gcc依赖
  2. 将下载的Redis压缩包上传到/usr/local/src目录下
  3. 进行解压
  4. 进入到解压后的Redis目录下执行make && make install:先编译后安装
  5. 默认的安装目录在/usr/local/bin目录下
  6. 该目录已经默认配置到环境变量,因此可以在任意目录下运行这些命令

redis-cli:是redis提供的命令行客户端
redis-server:是redis的服务端启动脚本
redis-sentinel:是redis的哨兵启动脚本

Redis启动

  • 启动方式

默认启动:执行redis-server这种属于前台启动,会阻碍整个会话窗口,如果ctrl+c退出,redis停止

后台启动:

  1. 修改redis的配置文件在/usr/local/src/redis-7目录下的redis.conf
  2. cp redis.conf redis.conf.bck:先备份一份文件
  3. 修改监听的地址bind 监听地址,学习可以设置为 0.0.0.0允许任意网络访问
  4. 修改守护进程为daemonize yes:可以进行后台运行
  5. 设置密码 requirepass 密码
  6. 回到解压目录下再次启动redis执行redis-server redis.conf

Redis开机自启动

  1. 执行vi /etc/systemd/system/redis.service:创建一个系统服务文件
  2. 在文件中输入:
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-7.0.15/redis.conf
[Install]
WantedBy=multi-user.target
  1. 重载系统服务systemctl daemon-reload
  2. 启动服务systemctl start redis
  3. 设置开机自启动systemctl enable redis

Redis其他常用配置
7. port 端口号:设置监听的端口号
8. dir .:工作目录(默认当前目录),保存运行的日志文件,持久化等文件
9. database 数量:设置数据库的数量,表示能使用几个库默认16个
10. maxmemory 512mb:设置redis能够使用的最大内存
11. logfile "redis.log":指定日志文件名称

Redis客户端

命令行客户端

Redis安装之后就自带命令行客户端redis-cli
redis-cli [选项] [命令]
选项:
-h 127.0.0.1:指定要连接的redis节点的ip地址,默认为127.0.0.1
-p 6379:指定要连接的redis节点的端口,默认为6379
-a 123456:指定访问redis的访问密码
命令:
指连接上redis之后要进行的操作,例如:
ping:从客户端向服务器段进行连接测试,正常返回pong
不指定命令连接redis客户端会进入redis-cli的交互控制台

图形化客户端:

安装地址:https://github.com/lework/RedisDesktopManager-Windows/releases
解压后双击进行安装:
安装之后双击resp.exe文件启动
在这里插入图片描述
进入连接设置:
在这里插入图片描述
创建连接,成功后:
在这里插入图片描述

Redis常见命令

在学习Redis的常用命令少不了帮助文档:https://redis.io/commands
我们也可以在客户端命令行中通过help进行相关查看
Redis数据库中Key一般是String类型,value类型:
在这里插入图片描述
list:一个有序的集合,本质是一个链表
Set:无序集合
SortedSet:可排序的集合
GEO:一个地理坐标
BitMap和HyperLog:特殊的按照位进行存储,本质是字符串

在进行命令的学习中建议配合help命令进行学习

  • Redis通用命令

KEYS [模板]:查询符合模板所有的key,例如keys *name*:匹配所有中间由name的key
DEL:删除一个指定的key,也可以删除多个key,多个key用空格隔开
EXISTS:判断key是否存在例如exists age
EXPIRE:给一个key设置有效期,有效期到期会自动删除key例如repire age 20设置有效期为20秒
TTL: 查看一个key的剩余有效期

  • String类型的数据

存储的数据可能是字符串类型,也可能字符串是数字或浮点数,不管是哪种格式,底层都是字节数组存储,数字类型的字符串编译成二进制文件存储在字节数组中,而字符串是以字母的形式存入字节数组的

String常见的命令
在这里插入图片描述
incrby age -1:控制key进行自减
setex age 20:添加一个key并设置有效期

注意:在开发过程中我们都通过id作为key进行存储,如果我们的用户id为1,商品信息的id也为1,那么这个时候我们应该如何进行区分呢:
Redis的key允许有多个单词形成层级结构,多个单词之间用:隔开
项目名:业务名:类型名:id
如果value是一个java对象:将对象序列化为JSON字符串后存储

  • Hash类型数据

Hash类型,也叫散列,其value是一个无序字典,类似于java中的HashMap结构

在Spring类型中java对象是序列化为JSON格式的字符串进行存储,但是这样能进行修改

Hash结构可以将对象中的每个字段进行独立存储,方便修改:
在这里插入图片描述
Hash类型常见命令
在这里插入图片描述

  • List类型

Redis中的list类型与java中的LinkedList类似,可以看作一个双向链表结构,可以进行正向检索,也可以进行反向检索

特征:有序,元素可以重复,插入和删除快,查询速度一般

List的常见命令
在这里插入图片描述

  • Set类型

Redis的Set结构与java中的HashSet类型,可以看作是一个value为null的HashMap
特征:无序,元素不可重复,查找块,支持交集并集差集

Set常用命令
在这里插入图片描述

  • SortedSet类型

Redis的SortedSet是一个可排序的set集合,与java中的treeSet有些相似,但底层数据结构差距很大,SortSet中的每一个元素都带有一个score属性,可以基于score属性对元素进行排序,底层实现一个跳表(SkipList) {实现排序,加快查询速度}加Hash表

特征:可排序,元素不重复,查询速度块
实际应用:用来实现排行榜这样的功能

SortedSet常用指令
在这里插入图片描述
注意:所有的排序默认都是升序的,如果要降序则在命令的Z之后添加REV即可

场景应用:将班级的学生和成绩存入redis并进行排名

Redis的java客户端

在Redis官网中提供了各种语言的客户端
地址:https://redis.io/clients

客户端简介
jedis以Redis命令作为方法名称,简单实用易学习,但是jedis实例是线程不安全的,多线程环境下需要基于连接池使用
lettuce是基于Netty实现的,支持同步,异步和响应式编程方式,线程安全,支持Redis哨兵模式,集群模式和管道模式
RedissonRedisson是一个基于Redis实现的分布式,可伸缩的java数据结构集合,包含了Map,Queue,Lock等强大功能
Spring Data RedisSpring框架给出的整合jedis和lettuce的技术

jedis学习

jedis官方地址:http://github.com/redis/jedis

简单的jedis 入门流程

第一步:导入依赖

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>5.0.2</version>
        </dependency>

第二步: 建立连接

private Jedis jedis
//给出jedis的初始化方案
@BeforeEach
void setUp(){
    jedis =new Jedis("虚拟机的ip",redis端口号);
    jedis.auth("密码");
    //选择库
    jedis.select(0);
}

第三步:通过jedis进行操作,例如
String result=jedis.set("name","wode")
String name=jedis.get("name")
第四步:释放资源
jedis.close()

Jedis连接池

创建jedis连接池:

public class JedisConnectionFactory {
    private static final JedisPool jedispool;
    static {
        //通过连接池配置对象配置连接池
        JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
        //设置最大连接数
        jedisPoolConfig.setMaxTotal(8);
        //设置最大空闲连接
        jedisPoolConfig.setMaxIdle(8);
        //设置最小空闲连接,当很长一段时间没有使用连接,连接就会被销毁
        jedisPoolConfig.setMinIdle(0);
        //设置当连接池中没有连接的时候等待的最大时间
        jedisPoolConfig.setMaxWaitMillis(1000);
        jedispool=new JedisPool(jedisPoolConfig,"虚拟机ip",6379,1000,"密码");
    }
    public static Jedis getJedis(){
        return jedispool.getResource();
    }
}

创建Jedis连接池后再进行创建jedis的时候就从连接池获取连接
Jedis jedis=JedisConnectionFactory.getJedis();
同时释放资源的时候就成为还回连接

SpringDataRedis

SpringData是Spring中数据操作的整合,其中对Redis的集成模块就叫做SpringDataRedis
官网地址:https://spring.io/projects/spring-data-redis

SpringDataRedis简述

  1. 提供了Redis客户端整合(lettuce和Jedis)
  2. 提供了RedisTemplate来统一API来操作Redis
  3. 支持Redis的发布订阅模型
  4. 支持Redis哨兵和Redis集群
  5. 支持基于Lettuce的响应式编程
  6. 支持基于JDK,JSON,字符串,SPring对象的数据序列化及反序列化
  7. 支持基于Redis的JDKCollection实现

SpringDataRedis中提供了RedisTemplate工具类,封装了各种对Redis的操作,并且将不同的数据类型的操作API封装:
在这里插入图片描述

SpringDataRedis快速入门

第一步:引入依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		连接池的依赖
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
		</dependency>

第二步:配置文件信息

spring:
  data:
    redis:
      host: 192.168.75.134
      port: 6379
      password: 520521
      lettuce:
        pool:
          max-active: 8 #最大连接
          max-idle: 8 #最大空闲数
          min-idle: 0  # 最小空闲连接
          max-wait: 100  #连接等待时间

注意:在配置文件中默认使用的是lettuce的pool连接池,这是Spring默认的,如果使用jedis的pool还需引入jedis的依赖

第三步:注入RedisTemplate

@Autowired
private RedisTemplate redistemplate;

第四步:进行操作
redistemplate.opsForValue().set("name","wode"):插入一条String类型的数据
Object name=redistemplate.opsForValue().get("name"):读取一条String类型数据

注意:在执行第四步的插入操作之后,在redis中出现一条长文

这是由于在redistemplate中都是以对象的形式进行输入的,在输入之后,通过SpringDataRedis中的JDK序列化将java对象转化为字节的方式传输到redis中

这样肯定是不方便的,那么怎么办,需要写出自己的序列化方式

  • 自定义序列化方式
 @Configuration
public class Redisconfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
        //创建RedisTemplate对象
        RedisTemplate<String, Object> stringObjectRedisTemplate = new RedisTemplate<>();
        //设置连接工厂
        stringObjectRedisTemplate.setConnectionFactory(connectionFactory);
        //创建JSON序列化工具
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //设置key的序列化
        stringObjectRedisTemplate.setKeySerializer(RedisSerializer.string());
        stringObjectRedisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
        stringObjectRedisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
        //设置value的序列化
        //返回
        return stringObjectRedisTemplate;
    }
}

这样就会解决了序列化的问题,但是你会发现使用JSON的序列化器后,在redis的数据中会出现反序列化所需要的类名,一旦数据多了,每条数据有一条类信息,这就会非常的臃肿,耗费内存

为了节省空间,我们不采用JSON的序列化器来处理value,而是统一使用String序列化器,要求只能存储string类型的key和value,所以,当需要存储java对象的时候,手动完成对象的序列化和反序列化

这时Spring提供了一个StringRedisTemplate类,它的key和value的序列化方式就是String方式,大大方便我们

private StringRedisTemplate stringredistemplate;
//通过这个类再执行相应的redis操作的时候默认的序列化方式就是string
只不过需要将对象进行手动的序列化
private static final ObjectMapper mapper=new ObjectMapper();
//创建对象
User user=new User("nihao",2);
//手动的序列化
String json=mapper.writeValueAsString(user);
StringRedisTemplate.opsForValue().set("User:1",user);

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

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

相关文章

Pytorch 之torch.nn初探 池化--Pooling Layers

任务描述 本关任务&#xff1a;本关提供了一个Variable 类型的变量x&#xff0c;要求按照条件创建一个Conv2d变量conv&#xff0c;一个MaxPool2d变量pool&#xff0c;对x应用卷积和最大池化操作并赋值给变量outpout_pool&#xff0c;并输出outpout_pool 的大小。 相关知识 P…

k8s日常动手实践 ~~ pod访问 pod请求 k8s api ~ 含新版带curl的busybox镜像

前言&#xff1a; 可以使用 Kubernetes API 获取集群信息。使用 Service Account&#xff08;SA&#xff09;进行身份验证&#xff0c;可以以安全的方式访问 Kubernetes API&#xff0c;而无需在 Pod 中使用明文凭据。 以下是一个使用 Service Account 访问 Kubernetes API 获…

XV6源码阅读——进程地址空间

文章目录 前言页表实际情况 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。打算尝试6.S081&#xff0c;将它的Lab逐一实现&#xff0c;并记录期间心酸历程。 代码下载 官方网站&#xff1a;6.S081官方网站 页表 每个进程都有一个单独的页表&#xff0c;当xv6在进程之…

数据库变更时,OceanBase如何自动生成回滚 SQL

背景 在开发中&#xff0c;数据的变更与维护工作一般较频繁。当我们执行数据库的DML操作时&#xff0c;必须谨慎考虑变更对数据可能产生的后果&#xff0c;以及变更是否能够顺利执行。若出现意外数据丢失、操作失误或语法错误等情况&#xff0c;我们必须迅速将数据库恢复到变更…

2024王鹍申论重难点:材料的概括与处理

2024王鹍申论重难点&#xff1a;材料的概括与处理&#xff0c;是备考公务员申论考试的关键一环。王鹍老师以其深厚的理论功底和丰富的实践经验&#xff0c;深入剖析了申论材料的特点和概括方法&#xff0c;同时传授了有效的材料处理技巧。通过王鹍老师的讲解&#xff0c;考生们…

Winseeing汇信外贸软件行业版,助力面辅料外贸公司实现降本增效

面辅料外贸出口&#xff0c;一直是国民经济发展中的重要组成部分。在当前全球贸易环境动荡不安的背景下&#xff0c;面辅料外贸出口面临着诸多挑战和机遇。亚洲是我面料出口的主要市场&#xff0c;据海关数据统计显示&#xff0c;2024年1-2月我对亚洲国家累计出口面料69.3亿美元…

leetcode多个测试用例之间相互影响导致提交失败

背景 在做一道easy题&#xff0c;二叉树的中序遍历&#xff0c;我提交的代码如下 from typing import (Optional,List )# Definition for a binary tree node. class TreeNode:def __init__(self, val0, leftNone, rightNone):self.val valself.left leftself.right right…

利用FCL实现更加精准的碰撞检测

一&#xff0c;需求 利用OSG结合FCL实现实现精准的碰撞检测。 二&#xff0c;效果 看这里 利用FCL实现更加精准的碰撞检测 – Qt hello 三&#xff0c;分析 我们看如下这张图&#xff0c;碰撞的逻辑就是&#xff0c;在一个三维场景中&#xff0c;构造一个实体&#xff0c;…

机器学习笔记(二)回归

一、线性回归 线性回归是一种用于预测的统计方法&#xff0c;特别适用于连续值预测。&#x1f4c8;线性回归通过最小化误差的平方和来寻找一个线性关系&#xff0c;用于预测一个变量&#xff08;因变量&#xff09;基于一个或多个其他变量&#xff08;自变量&#xff09;的值。…

远程控制安卓手机:便捷、高效与安全的方法

在移动设备的领域里&#xff0c;远程控制安卓手机的能力也变得越来越重要。这种技术可以让我们在远程地点方便地操作手机&#xff0c;无论是处理紧急事务、帮助他人解决问题&#xff0c;还是仅仅为了享受科技带来的便利。本文将为你介绍2种便捷、高效且安全的方法&#xff0c;让…

笔试狂刷--Day6(岛屿数量+模拟)

大家好,我是LvZi,今天带来笔试狂刷--Day6 一.在字符串中找出连续最⻓的数字串 1.题目链接 在字符串中找出连续最⻓的数字串 2.题目分析 使用双指针模拟 3.代码实现 import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {p…

Linux的学习之路:20、进程信号(2)

摘要 本章讲一下进程信号的阻塞信号和捕捉信号和可重入函数 目录 摘要 一、阻塞信号 1、阻塞信号 2、信号集操作函数 二、捕捉信号 1、内核如何实现信号的捕捉 2、代码实演 三、可重入函数 一、阻塞信号 1、阻塞信号 实际执行信号的处理动作称为信号递达(Delivery) …

文末送资料 | AI大模型接入指南:免费畅聊公众号新时代!附搭建教程

目录 今天内容有点意思&#xff01; 福利&#xff1a;拉到最后&#xff0c;免费送资料&#xff0c;你想要的全都有 我把公号接入了&#xff0c;字节跳动的云雀AI大模型&#xff01; 先给大家看几个案例 重点来了 如何将公号接入AI大模型呢&#xff1f; 1、创建AI聊天机器…

海南封关怎么看?win战略会任志雄解析

今年海南自由贸易港建设也进入了新阶段:将在2025年年底前适时启动全岛封关运作,封关后的海南将以全新姿态迎接更广泛的发展机遇。 封关在即,企业有何感受?还有哪些准备工作?封关后的海南将呈现怎样的状态?近日,红星资本局记者深入实地了解海南自贸港如何成型起势。 利好当…

快手不发作品ip地址会变吗

在数字时代&#xff0c;我们每个人的在线行为都留下了独特的痕迹。这些痕迹不仅仅是我们的言论或行为&#xff0c;还包括我们的IP地址——一个在网络世界中标识我们位置的数字标签。近年来&#xff0c;随着短视频平台的兴起&#xff0c;如快手这样的应用已经深入人们的日常生活…

sentinel-1.8.7与nacos-2.3.0实现动态规则配置、双向同步

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; sentinel-1.8.7与nacos-2.3.0实现动态规则配置、双向同步 ⏱️ 创作时…

2024年大数据应用、智能控制与软件工程国际会议(BDAICSE2024)

2024年大数据应用、智能控制与软件工程国际会议(BDAICSE2024) 会议简介 我们诚挚邀请您参加2024年大数据应用、智能控制和软件工程国际会议&#xff08;BDAICSE2024&#xff09;。这次会议将在美丽的长沙市举行。 本次大会旨在汇聚全球大数据应用、智能控制、软件工程等领…

常见大厂面试题(SQL)02

小鹏面试题: 小鹏汽车充电每辆车连续快充最大次数 原表charging_data idcharge_timecharge_typeXP10012023/11/20 8:45快充XP10012023/11/21 20:45快充XP10012023/11/22 8:45快充XP10012023/11/23 8:45慢充XP10012023/11/25 8:45快充XP10022023/11/25 8:45快充XP10022023/11/…

kubernetes中Pod资源的使用限制

一、概述 当kubernetes调度创建Pod后&#xff0c;Pod是否有足够的资源来运行容器&#xff0c;是非常重要的。资源分为两种类型——容器请求的资源和容器被限制的资源。 请求和限制是kubernetes控制集群cpu和内存等资源的重要方式&#xff0c;他们是两种不同的机制 容器请求的资…

C语言之回调函数+可变参数__VA_ARGS__:用法实例(四十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…