redis学习-redis介绍

目录

1.redis介绍

2.redis常用命令(可以在官网的命令中查看redis的所有命令)

        2.1终端命令       

        2.2 redis通用命令

        2.3五大基本类型的命令以及特殊情况分析 (导航)

3.事务

4. redis实现消息订阅

5. redis的两种持久化策略

        5.1 rdb策略

        5.2 aof策略


1.redis介绍

        redis即远程字典服务,是当下最热门的NoSQL(非关系型数据库)技术之一,采用KV键值对的数据结构存储数据,也被称之为结构化数据库。Redis会周期性地将更新的数据写入磁盘并将更新操作写入追加的记录文件,并在此基础上实现了主从同步。Redis是基于内存存储的,能够实现持久化,并且效率高,支持多种语言和多种数据类型,同时也支持集群、事务等。

        redis支持五种基本数据类型String、Set、Zset、Hash、List以及三种特殊类型Bitmaps、HyperLogLog、Geospatial。

        redis之所以速度快是因为采用C语言编写的,基于内存操作且是单线程的,相较于多线程而言省去了上下文切换的过程,这个过程是非常耗时的。由于redis基于内存操作,所以CPU不是redis的瓶颈,机器的内存和网络带宽才是。

2.redis常用命令(可以在官网的命令中查看redis的所有命令)

        2.1终端命令       

  • redis-server redis.conf  

        使用redis.conf配置文件打开服务器,需要在redis.conf目录下执行,在其他目录下开启服务器需要使用相对路径或绝对路径。也可以使用自己配置的redis的配置文件。

  • redis-cli -p 6379

        与服务器建立连接,6379为redis的默认端口号。

  • ps -ef|grep redis

        查看redis的进程是否开启,如果开启了redis就能够看到redis的进程。

  • redis-benchmark

        用于redis的压力测试,以下是压力测试可能用到的一些参数:

        例:使用本机进行压力测试,采用2个并发连接,每个连接进行2次请求: 

        2.2 redis通用命令

        先加入数据方便演示:

  •  keys *

        获取所有的key。

  • keys key

        获取指定的key,可用来查看是否存在指定键值对;或者使用exists key查看是否存在。

  • shutdown

        关闭服务器。

  • exit

        退出到终端。

  • select 编号

        切换数据库,可以在不同数据库存储不同的信息进行分类;默认有16个数据库,编号从0开始。

  • dbsize

        查看当前数据库存储的信息数量。

  • flushdb

        清空当前数据库中的所有信息。

  • flushall

        清空所有数据库中的所有信息。

  • move key 序号

        将指定键值对信息移到指定序号的数据库中。

  • del key

        删除指定键值对,当删除多个键值对时可以在del后面加上多个key,每个key之间用空格分开。

  • expire key time

        设置指定键值对的过期时间,单位为秒,过期后该键值对就会消失。

  • ttl key

        查看指定键值对还有多长时间过期,单位为秒,当返回-1时代表没有设置过期时间,当返回-2时代表已经过期。

  • type key

        查看key对应的value的类型。

  • watch key1 key2 ...

        用于事务中,监视某些对象是否在入队后进行了修改,如果在exec命令执行前未进行修改说明监视成功,如果有其他客户端进行了修改,那么表示监视失败,并且在执行exec命令后事务中的所有命令不会被执行;无论是否监视成功,事务在执行exec或者discard命令后监视器自动失效。(比如对name进行监视,在客户端1有一个事务,包含了get命令,但是在执行exec之前另一客户端修改了name的值并成功执行,此时就会监测到name的值被修改,那么在执行exec命令后事务不会去执行)可以使用unwatch命令手动解除所有的监视器。(会在事务章节演示) 

        2.3五大基本类型的命令以及特殊情况分析 (导航)

  • String类型

        redis学习-String类型的命令介绍以及特殊情况分析-CSDN博客

  • List类型

        redis学习-List类型相关命令以及特殊情况分析-CSDN博客

  • Set类型

        redis学习-Set集合类型相关命令及特殊情况分析-CSDN博客

  • Zset类型

        redis学习-Zset集合类型相关命令及特殊情况分析-CSDN博客

  • Hash类型

        redis学习-Hash类型相关命令及特殊情况分析-CSDN博客

3.事务

  • redis的事务是不保证原子性的,但单条命令的执行是保证原子性的,当一个事务中的一个命令执行失败时其他命令依旧能够执行;redis事务的本质是一组命令的集合,会将一个事务中所有命令序列化,按照顺序依次执行,这也保证了执行命令时不受干扰,所以redis的事务在执行命令时具有依次性、顺序性、排他性。
  • redis的事务没有隔离级别的概念,命令一开始只是放在事务中,并没有被执行,只有当发起EXEC执行命令时才会执行。因为一开始就没有执行,不执行就不存在“事务内的查询要看到事务的更新但事务外的查询不能看到”这种问题。
  • redis命令包含三部分:开启事务(multi)、命令入队(要执行的命令,比如set、get等)、执行事务(exec)。除此之外,还有一个取消事务的命令discard,可以在开启事务但未执行事务时使用,执行取消事务时会立即退出事务,且所有的命令均不会被执行。
  • redis事务在执行时有两种异常,一种是命令使用错误,一种是逻辑错误,当事务发现有的命令不符合规范时(比如使用set时多加了一个字母或者多加了一个参数)会直接报错,所有的命令也就都跟着不会执行;当事务只发现命令在使用时出现了逻辑错误(比如zrange的区间不规范时),则仅在执行该条命令时报错,其他命令则会正常执行。

        注意区别报错和执行失败,执行失败不一定会报错,比如有的指令执行失败会返回0,或者返回 (empty array) ," ",nil 等,报错则是会出现提示信息 “(error) ERR 错误信息” 。

  • 悲观锁和乐观锁

        悲观锁:认为任何时候都会出现问题,无论做什么都要加锁,syncronized就是典型的悲观锁。

        乐观锁:认为不会出现问题,不用加锁,只需要每次更新时先检查这期间是否有其他人也更新了,比如CAS机制;在redis中会通过watch监视器来监控更新情况。

        watch工作演示:

        与此同时,客户端2也开启了事务,包含了一个set,要对k1进行修改,并且事务成功执行:

        此时客户端再执行事务,会发现get的结果为nil,表示事务执行失败: 

        这就是watch监视器起到了作用,在客户端1开启事务后对某些信息进行操作时,如果在此期间有其他客户端对这些信息成功做了修改并且这些信息都被watch监视器监视,那么此次对这些信息的操作就会无效,需要重新执行事务。由于watch监视器只能监视一次,所以再次开启事务时需要重新添加watch监视器。

4. Jedis

        Jedis是使用java操作redis的中间件。导入Jedis工具包之后,通过代码

Jedis jedis=new jedis("服务器ip","6379") 创建Jedis对象,随后调用api即可,所有的api和linux的命令相同。

        要注意的是,默认情况下redis只允许本地访问,从其他集成开发工具中远程访问redis需要修改配置文件redis.conf,并重新启动服务器。

        通过vim redis.conf命令打开配置文件,然后做如下修改:

 

        如果使用的xshell还需要设置防火墙:

firewall-cmd --zone=public --add-port=6379/tcp --permanent

        然后重新启动防火墙:

systemctl restarta firewalld.service

        这就可以使用Jedis远程操作redis了: 

public class TestPing {public static void main(String[] args) {//连接redisJedis jedis=new Jedis("59.110.8.199",6379);//测试是否成功连接System.out.println(jedis.ping());//使用JSON存储键值对JSONObject jsonObject=new JSONObject();JSONObject jsonObject1=new JSONObject();jsonObject.put("name","abc");jsonObject1.put("age","11");//事务的正确用法:更新操作使用multi,并使用try-catch当事务执行出现异常时取消事务的执行;查询操作使用jedis//使用watch监视器jedis.watch("name","age");//开启事务Transaction multi = jedis.multi();try{//事务中的操作使用multi对象的apimulti.set("name",jsonObject.toString());multi.set("age",jsonObject1.toString());multi.exec();}catch (Exception e){multi.discard();e.printStackTrace();}finally {System.out.println(jedis.get("name"));System.out.println(jedis.get("age"));}}
}

         运行结果:

4. redis实现消息订阅

  • subscribe 频道名1 频道名2 ...

        用来订阅指定的频道,当发布者在这些频道发布消息时订阅者会自动收到。

  • unsubscribe 频道名1 频道名2 ...

        退订指定的频道,退订后就不会接收到这些频道的消息了。   

  • publish 频道名 消息

        发布者在指定频道中发布消息。

        演示:

        订阅c1频道,准备接收消息:

        发布者在c1频道发送消息:

        此时接收方便会收到消息: 

         当接收方退订c1频道时,将不会收到c1频道的消息:

5. redis的两种持久化策略

        5.1 rdb策略

        当触发持久化时,redis会fork一个子进程来进行持久化,这个子进程会先将数据写入一个临时的rdb文件中,也就是一个快照,写完后再将这个快照文件直接替换掉之前的rdb文件,并且在这个过程中父进程完全不用参与,可以处理其他请求,从而在更新保存的数据的同时又拥有极高的性能;当进行数据恢复时redis会将快照文件直接读到内存中。当更新频率达到配置文件中save设置的频率,或者执行flushall命令,或者退出redis时会自动触发rdb持久化操作。rdb的优点是适用于大量数据的恢复或者对数据完整性要求不高的恢复;缺点是需要一定的时间间隔触发持久化,这会导致宕机前的最后一次修改会丢失,并且fork子进程会占用一定的内存空间。        

        以上是配置文件中默认的rdb的save标准,当发生这三种情况时自动更新快照文件:

  • 当一小时内发生了至少1次修改操作时
  • 当五分钟内发生了至少100次修改操作时
  • 当60秒内发生了至少10000次修改操作时

        配置文件中还可以配置rdb快照的文件名以及快照放置的文件夹:

 

        在实际应用中,可能需要对rdb文件进行备份,以防丢失;rdb使用默认配置即可。

        5.2 aof策略

        这个策略会将所有的更新操作记录到日志文件中,当然也是父进程fork的子进程去进行持久化操作,由于读操作不会影响数据,所以不会记录。在记录更新操作时只允许追加文件,不允许修改文件;当需要进行数据恢复时,redis会将日志文件中记录的所有更新操作依次重新执行一次。优点是可以在配置文件中修改aof的执行频率来保持数据的完整性或者提高效率,缺点就是aof文件要比rdb文件大很多,占用较多的空间,并且aof的效率也要比rdb慢,所以默认使用rdb策略的持久化。

 

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

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

相关文章

KubeSphere集群安装-nfs分布式文件共享-对接Harbor-对接阿里云镜像仓库-遇到踩坑记录

KubeSphere安装和使用集群版 官网:https://www.kubesphere.io/zh/ 使用 KubeKey 内置 HAproxy 创建高可用集群:https://www.kubesphere.io/zh/docs/v3.3/installing-on-linux/high-availability-configurations/internal-ha-configuration/ 特别注意 安装前注意必须把当前使…

AG32 MCU以太网应用实例demo

一. 前言 AGM32系列32位微控制器旨在为MCU用户提供新的自由度和丰富的兼容外设,以及兼容的引脚和功能。AG32F407系列产品具有卓越的品质,稳定性和卓越的价格价值。 AG32产品线支持其所有接口外设尽可能接近主流兼容性,并提供丰富的参考设计…

排序算法:快速排序(非递归)

文章目录 一、先建立一个栈二、代码编写 !](https://img-blog.csdnimg.cn/direct/870dd101173d4522862e4459b32237a3.png) 先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;^ _ ^<3 ❤️ ❤️ ❤️ 码字不易&#xff0c;大家的支持就是我坚持下去的动力…

旧华硕电脑开机非常慢 电脑开机黑屏很久才显示品牌logo导致整体开机速度非常的慢怎么办

前提条件 电池需要20&#xff05;&#xff08;就是电池没有报废&#xff09;且电脑接好电源&#xff0c;千万别断电&#xff0c;电脑会变成砖头的 解决办法 更新bios即可解决&#xff0c;去对应品牌官网下载最新的bios版本就行了 网上都是一些更新驱动啊

传统机器学习 基于TF_IDF的文本聚类实现

简介 使用sklearn基于TF_IDF算法&#xff0c;实现把文本变成向量。再使用sklearn的kmeans聚类算法进行文本聚类。 个人观点&#xff1a;这是比较古老的技术了&#xff0c;文本转向量的效果不如如今的 text2vec 文本转向量好。 而且sklearn 不支持GPU加速&#xff0c;处理大量…

小狐狸ChatGPT智能聊天系统源码v2.7.6全开源Vue前后端+后端PHP

测试环境包括Linux系统的CentOS 7.6&#xff0c;宝塔面板&#xff0c;PHP 7.4和MySQL 5.6。网站的根目录是public&#xff0c; 使用thinkPHP进行伪静态处理&#xff0c;并已开启SSL证书。 该系统具有多种功能&#xff0c;包括文章改写、广告营销文案创作、编程助手、办公达人…

备战蓝桥杯Day26 - 二叉搜索树查询和删除操作

一、查询 递归查询 寻找的值比根节点大&#xff0c;遍历右子树&#xff1b; 寻找的值比根节点小&#xff0c;遍历左子树。 def qurey(self, node, val):if not node: # 没有节点&#xff0c;返回空return Noneif node.data < val:return self.qurey(node.rchild, val)el…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS多路视频融合叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD多路视频融合叠加应用本方案的S…

C++第六弹---类与对象(三)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、类的6个默认成员函数 2、构造函数 2.1、概念 2.2、特性 3、析构函数 3.1、概念 3.2、特性 3.3、调用顺序 总结 1、类的6个默认成员函数…

QT UI窗口常见操作

MainWidget::MainWidget(QWidget *parent): QWidget(parent), ui(new Ui::MainWidget) {ui->setupUi(this);// 设置主窗口背景颜色QPalette plt;plt.setColor(QPalette::Window,QColor(180,220,130));this->setPalette(plt);// 禁止窗口最大化按钮setWindowFlags(windowF…

Spring Boot Starter: 快速简明地创建Spring应用

Spring Boot Starter是Spring Boot的核心功能之一&#xff0c;它帮助开发人员快速简明地创建、配置和运行Spring应用。在本文中&#xff0c;我们将详细介绍Spring Boot Starter以及如何使用它创建一个Spring Boot应用。 文章目录 什么是Spring Boot Starter?为何使用Spring B…

DevOps 环境预测测试中的机器学习

在当今快节奏的技术世界中&#xff0c;DevOps 已成为软件开发不可或缺的一部分。它强调协作、自动化、持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;&#xff0c;以提高软件部署的速度和质量。预测测试是这一领域的关键组成部分&#xff0c;其中机器…

Transformer的前世今生 day02(神经网络语言模型

神经网络语言模型 使用神经网络的方法&#xff0c;去完成语言模型的两个问题&#xff0c;下图为两层感知机的神经网络语言模型&#xff1a; 以下为预备概念 感知机 线性模型可以用下图来表示&#xff1a;输入经过线性层得到输出 线性层 / 全连接层 / 稠密层&#xff1a;假…

爬虫的去重

去重基本原理 爬虫中什么业务需要使用去重 防止发出重复的请求防止存储重复的数据 在爬取网页数据时&#xff0c;避免对同一URL发起重复的请求&#xff0c;这样可以减少不必要的网络流量和服务器压力&#xff0c;提高爬虫的效率&#xff0c;在将爬取到的数据存储到数据库或其…

HTML设置语言

一、代码示例 相关代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>HTML设置语言</title> </head> <body><marquee>我爱你</marquee> <!-- …

离线LaTex公式识别V1.0开发

离线LaTex公式识别V1.0开发 前期的工作 请看博文-离线LaTex公式识别V0.9开发 已完成的内容 LaTex公式识别的GUI。 支持将LaTex复制为MathML。 支持读取剪切板的图片。 部分UI换成iconfont下载的一些元素。 读懂pyqt的一些代码。基本实现了万能君的软件库的所有功能。 开发…

从底层结构开始学习FPGA(0)----FPGA的硬件架构层次(BEL Site Tile FSR SLR Device)

系列目录与传送门 《从底层结构开始学习FPGA》目录与传送门 Xilinx的FPGA&#xff0c;从硬件架构的角度可以划分为6个层次&#xff0c;从底层到顶层依次是&#xff1a; BEL&#xff08;最底层单元&#xff09;SiteTileFSRSLRDevice&#xff08;FPGA芯片&#xff09; 接下来我…

UG NX二次开发(C#)-单选对话框UF_UI_select_with_single_dialog的使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、UF_UI_select_with_single_dialog函数3、实现代码3.1 利用委托创建一个方法3.2 直接调用1、前言 对于单选对话框,采用C++/C写的时候比较容易,也在帮助文档中有示例,但是对于C#开发采…

WEB三大组件之Filter

在很多项目中通常需要用到filter来实现用户身份识别&#xff0c;并将识别出来的用户信息&#xff0c;保存到ThreadLocal对应的上下文&#xff0c;这样在后续的请求链路中&#xff0c;在任何地方都可以直接获取当前的登录用户了。 来看一下Java WEB三大组件之一的过滤器Filter&…

L2-042 老板的作息表(PTA)

文章目录 L2-042 老板的作息表题目描述sort排序函数 L2-042 老板的作息表 题目描述 新浪微博上有人发了某老板的作息时间表&#xff0c;表示其每天 4:30 就起床了。但立刻有眼尖的网友问&#xff1a;这时间表不完整啊&#xff0c;早上九点到下午一点干啥了&#xff1f; 本题就…