当前位置: 首页 > news >正文

Redis-基本了解

一、Redis 初识

        Redis 是⼀种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis 中的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、 Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此Redis 可以满⾜很多的应⽤场景,⽽且因为Redis会将所有数据都存放再内存中,所以它的读写性能⾮常惊 ⼈。不仅如此,Redis还可以将内存的数据利⽤快照和⽇志的形式保存到硬盘上,这样在发⽣类似断电 或者机器故障的时候,内存中的数据不会“丢失”。除了上述功能以外,Redis还提供了键过期、发布 订阅、事务、流⽔线、Lua脚本等附加功能。

二、Redis 特性

1. 速度快

        正常情况下,Redis执⾏命令的速度⾮常快,官⽅给出的数字是读写性能可以达到10万/秒,当 然这也取决于机器的性能,但这⾥先不讨论机器性能上的差异,只分析⼀下是什么造就了Redis如此 之快,可以⼤概归纳为以下四点:

  • Redis的所有数据都是存放在内存中的,表1-1是⾕歌公司2009年给出的各层级硬件执⾏速度,所以把数据放在内存中是Redis速度快的最主要原因。
  • Redis使⽤了单线程,预防了多线程可能产⽣的竞争问题。
  • 作者对于Redis源代码可以说是精打细磨。

表1-1⾕歌公司给出的各层级硬件执⾏速度

层级速度
L1 cache reference0.5 ns
Branch mispredict5 ns
L2 cache reference7 ns
Mutex lock/unlock 25 ns
Main memory reference100 ns
Compress 1K bytes with Zippy3000 ns
Send 2 K bytes over 1 Gbps network20000 ns
Read 1 MB sequentially from Memory250000 ns
Round trip within same datacenter500000 ns
Disk seek10000000 ns
Read 1 MB sequentially from disk20000000 ns
Send packet CA -> Netherlands -> CA150000000 ns

2. 基于键值对的数据结构服务器

        ⼏乎所有的编程语⾔都提供了类似字典的功能,例如C++⾥的map、Java⾥的map、Python⾥ 的dict等,类似于这种组织数据的⽅式叫做基于键值对的⽅式,与很多键值对数据库不同的是, Redis 中的值不仅可以是字符串,⽽且还可以是具体的数据结构,这样不仅能便于在许多应⽤场景的开 发,同时也能提⾼开发效率。Redis的全程是REmoteDictionaryServer,它主要提供了5种数据结 构:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(orderedset/ zet),同时在字符串的基础之上演变出了位图(Bitmaps)和HyperLogLog两种神奇的”数据结 构“,并且随着LBS(LocationBasedService,基于位置服务)的不断发展,Redis3.2.版本种加⼊ 有关GEO(地理信息定位)的功能,总之在这些数据结构的帮助下,开发者可以开发出各种应⽤。

3. 丰富的功能

除了5种数据结构,Redis还提供了许多额外的功能:

  • 提供了键过期功能,可以⽤来实现缓存
  • 提供了发布订阅功能,可以⽤来实现消息系统。
  • ⽀持Lua脚本功能,可以利⽤Lua创造出新的Redis命令。
  • 提供了简单的事务功能,能在⼀定程度上保证事务特性。
  • 提供了流⽔线(Pipeline)功能,这样客⼾端能将⼀批命令⼀次性传到Redis,减少了⽹络的开 销。

4. 简单稳定

        Redis 的简单主要表现在三个⽅⾯。⾸先,Redis的源码很少,早期版本的代码只有2万⾏左右, 3.0 版本以后由于添加了集群特性,代码增⾄5万⾏左右,相对于很多NoSQL数据库来说代码量相对 要少很多,也就意味着普通的开发和运维⼈员完全可以“吃透”它。其次,Redis使⽤单线程模型, 这样不仅使得Redis服务端处理模型变得简单,⽽且也使得客⼾端开发变得简单。最后,Redis不需要 依赖于操作系统中的类库,Redis⾃⼰实现了 事件处理的相关功能。

        但与简单相对的是Redis具备相当的稳定性,在⼤量使⽤过程中,很少出现因为Redis⾃⾝BUG ⽽导致宕掉的情况。

5. 客⼾端语⾔多

        Redis 提供了简单的TCP通信协议,很多编程语⾔可以很⽅便地接⼊到Redis,并且由于Redis受 到社区和各⼤公司的⼴泛认可,所以⽀持Redis的客⼾端语⾔也⾮常多,⼏乎涵盖了主流的编程语⾔,例如C、C++、Java、PHP、Python、NodeJS等。

6. 持久化(Persistence)

        通常看,将数据放在内存中是不安全的,⼀旦发⽣断电或者机器故障,重要的数据可能就会丢 失,因此Redis提供了两种持久化⽅式:RDB和AOF,即可以⽤两种策略将内存的数据保存到硬盘中 ,这样就保证了数据的可持久性。

7. 主从复制(Replication)

        Redis 提供了复制功能,实现了多个相同数据的Redis副本(Replica)(如图1-2所⽰),复制 功能是分布式Redis的基础。

        

8. ⾼可⽤(HighAvailability)和分布式(Distributed)

        Redis 提供了⾼可⽤实现的Redis哨兵(RedisSentinel),能够保证Redis结点的故障发现和故 障⾃动转移。也提供了Redis集群(RedisCluster),是真正的分布式实现,提供了⾼可⽤、读写和 容量的扩展性。

三、Redis 使⽤场景

3.1、Redis 可以做什么

1. 缓存(Cache)

        缓存机制⼏乎在所有⼤型⽹站都有使⽤,合理地使⽤缓存不仅可以加速数据的访问速度,⽽且能 够有效地降低后端数据源的压⼒。Redis提供了键值过期时间设置,并且也提供了灵活控制最⼤内存和 内存溢出后的淘汰策略。可以这么说,⼀个合理的缓存设计能够为⼀个⽹站的稳定保驾护航。

2. 排⾏榜系统

        排⾏榜系统⼏乎存在于所有的⽹站,例如按照热度排名的排⾏榜,按照发布时间的排⾏榜,按照 各种复杂维度计算出的排⾏榜,Redis提供了列表和有序集合的结构,合理地使⽤这些数据结构可以很 ⽅便地构建各种排⾏榜系统。

3. 计数器应⽤

        计数器在⽹站中的作⽤⾄关重要,例如视频⽹站有播放数、电商⽹站有浏览数,为了保证数据的 实时性,每⼀次播放和浏览都要做加1的操作,如果并发量很⼤对于传统关系型数据的性能是⼀种挑 战。Redis天然⽀持计数功能⽽且计数的性能也⾮常好,可以说是计数器系统的重要选择。

4. 社交⽹络

        赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交⽹站的必备功能,由于社交⽹站访问量 通常⽐较⼤,⽽且传统的关系型数据不太合适保存这种类型的数据,Redis提供的数据结构可以相对⽐ 较容易地实现这些功能。

5. 消息队列系统

        消息队列系统可以说是⼀个⼤型⽹站的必备基础组件,因为其具有业务解耦、⾮实时业务削峰等 特性。Redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列⽐还不够⾜够强⼤,但是 对于⼀般的消息队列功能基本可以满⾜。

3.2、Redis 不可以做什么

        实际上和任何⼀⻔技术⼀样,每个技术都有⾃⼰的应⽤场景和边界,也就是说Redis并不是万⾦ 油,有很多合适它解决的问题,但是也有很多不合适它解决的问题。可以站在数据规模和数据冷热的⻆度来进⾏分析。

        站在数据规模的⻆度看,数据可以分为⼤规模数据和⼩规模数据,我们知道Redis的数据是存放 在内存中的,虽然现在内存已经⾜够便宜,但是如果数据量⾮常⼤,例如每天有⼏亿的⽤⼾⾏为数 据,使⽤Redis来存储的话,基本上是个⽆底洞,经济成本相当⾼。

        站在数据冷热的⻆度,数据分为热数据和冷数据,热数据通常是指需要频繁操作的数据,反之为 冷数据,例如对于视频⽹站来说,视频基本信息基本上在各个业务线都是经常要操作的数据,⽽⽤⼾ 的观看记录不⼀定是经常需要访问的数据,这⾥暂且不讨论两者数据规模的差异,单纯站在数据冷热 的⻆度上看,视频信息属于热数据,⽤⼾观看记录属于冷数据。如果将这些冷数据放在Redis上,基 本上是对于内存的⼀种浪费,但是对于⼀些热数据可以放在Redis中加速读写,也可以减轻后端存储 的负载,可以说是事半功倍。

3.3、安装并启动Redis

        Redis的官⽅并不⽀持微软的Windows操作系统,因为Redis的许多特性都是和操作系统相 关的,所以⽀持Windows会增加维护成本,⽽且更重要的是⼤部分公司都在使⽤Linux操作 系统,⽽Redis在Linux操作系统上的表现已经得到实践的证明。当然Redis作为⼀款优秀 的开源技术,还是吸引到微软公司的注意,微软公司的开源技术组在Github上维护了⼀个 Redis 分⽀:https://github.com/MSOpenTech/redis。不过我们还是强烈建议⼤家在Linux 上使⽤Redis。

接下来,选择在Linux上安装Redis.

Centos 安装 Redis

Ubuntu 安装 redis

3.4、Redis 重要⽂件及作⽤

启动/停⽌命令或脚本

 /usr/bin/redis-benchmark/usr/bin/redis-check-aof -> /usr/bin/redis-server/usr/bin/redis-check-rdb -> /usr/bin/redis-server/usr/bin/redis-cli/usr/bin/redis-sentinel -> /usr/bin/redis-server/usr/bin/redis-server/usr/libexec/redis-shutdown

redis-server 是 Redis 服务器程序,其余的⼏个例如:redis-check-aof、redis-check-rdb、redis sentinel 也都是redis-server 的软链接。redis-check-aof是修复AOF⽂件⽤的⼯具,同理redis check-rdb 是修复RDB⽂件的⼯具,redis-sentinel是Redis哨兵程序。

redis-benchmark ⽤于对Redis做性能基准测试的⼯具。

redis-shutdown 是⽤于停⽌Redis的专⽤脚本。

配置⽂件

 /etc/redis-sentinel.conf/etc/redis.conf

/etc/redis.conf 是 Redis 服务器的配置⽂件。/etc/redis-sentinel.conf是RedisSentinel的配置⽂件。

持久化⽂件存储⽬录

/var/lib/redis/

        Redis 持久化⽣产的RDB和AOF⽂件都默认⽣成于该⽬录下。

⽇志⽂件⽬录

 /var/log/redis/

        /var/log/redis/ ⽬录下会保存Redis运⾏期间⽣产的⽇志⽂件,默认按照天进⾏分割,并且会将 ⼀定⽇期的⽇⼦⽂件使⽤gzip格式压缩保存。可以使⽤任意⽂本编辑器打开。

3.5、Redis 命令⾏客⼾端

redis-cli 可以使⽤两种⽅式连接Redis服务器。

  • 第⼀种是交互式⽅式:通过redis-cli-h{host}-p{port}的⽅式连接到Redis服务,后续所有 的操作都是通过交互式的⽅式实现,不需要再执⾏redis-cli了,例如:
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379127.0.0.1:6379> pingPONG127.0.0.1:6379> set key helloOK127.0.0.1:6379> get key"hello"
  • 第⼆种是命令⽅式:⽤redis-cli-h{host}-p{port}{command}就可以直接得到命令的返回 结果,例如:
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379 pingPONG[root@host ~]# redis-cli -h 127.0.0.1 -p 6379 set key helloOK[root@host ~]# redis-cli -h 127.0.0.1 -p 6379 get key"hello"

        由于连接的Redis服务位于127.0.0.1,端⼝也使⽤的是默认的6379 端⼝,所以可以省略-h{host}-p{port}。

图1-3Redis客⼾端与服务端的交互过程

相关文章:

Redis-基本了解

一、Redis 初识 Redis 是⼀种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis 中的值可以是由string(字符串)、hash(哈希)、list(列表&#xff09…...

HarmonyOS第一课 06 构建更加丰富的页面-习题解析

判断题 1. Tabs组件可以通过接口传入一个TabsController,该TabsController可以控制Tabs组件进行页签切换。T 正确(True) 错误(False) 使用 this.tabsController.changeIndex(this.currentIndex); 可以切换页签 WebviewController提供了变更Web组件显示内容的接口…...

计算机的错误计算(一百四十三)

摘要 探讨 MATLAB 中 附近数的余弦函数的计算精度问题。 例1. 已知 计算 与 直接贴图吧: 另外,16位的正确值分别为 -0.3012758451921695e-7 与 -0.3765996542384011e-10(ISRealsoft 提供)。 容易看出,MATLAB的输…...

大数据之——Window电脑本地配置hadoop系统(100%包避坑!!方便日常测试,不用再去虚拟机那么麻烦)

之前我们的hadoop不管是伪分布式还是分布式,都是配置在虚拟机上,我们有的时候想要运行一些mapreduce、hdfs的操作,又要把文件移到虚拟机,又要上传hdfs,麻烦得要死,那么有的时候我们写的一些java、python的h…...

汽车固态电池深度报告

固态电池符合未来大容量二次电池发展方向,半固态电池已装车,高端长续航车型、e-VTOL 等方向对固态电池需求明确。固态电池理论上具备更高的能量密度、更好的热稳定性、更长的循环寿命等优点,是未来大容量二次电池发展方向。根据中国汽车动力…...

HTB-Cicada 靶机笔记

Cicada 靶机笔记 概述 HTB 的靶机 Cicada 靶机 靶机地址:https://app.hackthebox.com/machines/Cicada 很有意思且简单的 windows 靶机,这台靶机多次利用了信息枚举,利用不同的信息一步一步获得 root 权限 一、nmap 扫描 1)…...

使用DJL和PaddlePaddle的口罩检测详细指南

使用DJL和PaddlePaddle的口罩检测详细指南 完整代码 该项目利用DJL和PaddlePaddle的预训练模型,构建了一个口罩检测应用程序。该应用能够在图片中检测人脸,并将每张人脸分类为“戴口罩”或“未戴口罩”。我们将深入分析代码的每个部分,以便…...

基于stm32的多旋翼无人机(Multi-rotor UAV based on stm32)

在现代无人机技术中,多旋翼无人机因其稳定性和操控性而受到广泛应用。STM32微控制器因其强大的处理能力和丰富的外设接口,成为实现多旋翼无人机控制的理想选择。本文将详细介绍如何基于STM32实现多旋翼无人机的控制,包括硬件设计、软件设计和…...

第二十四章 v-model原理及v-model简化表单类组件封装

目录 一、v-model 原理 二、表单类组件封装 三、v-model简化组件封装代码 一、v-model 原理 原理:v-model本质上是一个语法糖。例如应用在输入框上,就是 value属性 和 input事件 的合写。 作用:提供数据的双向绑定 ① 数据变&#x…...

Java基于SpringBoot 的校园外卖点餐平台微信小程序(附源码,文档)

大家好,我是Java徐师兄,今天为大家带来的是Java基于SpringBoot 的校园外卖点餐平台微信小程序。该系统采用 Java 语言 开发,MySql 作为数据库,系统功能完善 ,实用性强 ,可供大学生实战项目参考使用。 博主介…...

细说STM32单片机USART中断收发RTC实时时间并改善其鲁棒性的方法

目录 一、工程目的 1、 目标 2、通讯协议及应对错误指令的处理目标 二、工程设置 三、程序改进 四、下载与调试 1、合规的指令 2、 proBuffer[0]不是# 3、proBuffer[4]不是; 4、指令长度小于5 5、指令长度大于5 6、proBuffer[2]或proBuffer[3]不是数字 7、;位于p…...

无人机场景 - 目标检测数据集 - 夜间车辆检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍:无人机场景夜间车辆检测数据集,真实场景高质量图片数据,涉及场景丰富,比如夜间无人机场景城市道路行驶车辆图片、夜间无人机场景城市道边停车车辆图片、夜间无人机场景停车场车辆图片、夜间无人机场景小区车辆图片、夜…...

Dubbo 构建高效分布式服务架构

一、引言 随着软件系统的复杂性不断增加,传统的单体架构已经难以满足大规模业务的需求。分布式系统架构通过将系统拆分成多个独立的服务,实现了更好的可扩展性、可维护性和高可用性。在分布式系统中,服务之间的通信和协调是一个关键问题&…...

Unity XR Interaction Toolkit 开发教程(1):OpenXR 与 XRI 概述【3.0 以上版本】

文章目录 📕Unity XR 开发架构🔍底层插件(对接硬件)🔍高层 SDK(面向应用交互层) 📕OpenXR📕XR Interaction Toolkit🔍特点🔍XRI 能够实现的交互类…...

自扶正救生艇,保障水上救援的安全卫士_鼎跃安全

在应急事件中,自扶正救生艇能够发挥关键的救援和保障作用,确保救援人员和被困人员的生命安全,尤其在极端天气或突发水上事故中展现出明显优势。 在救援过程中如果遭遇翻船,救生艇能够迅速恢复正常姿态,确保救援人员不会…...

《Qwen2-VL》论文精读【下】:发表于2024年10月 Qwen2-VL 迅速崛起 | 性能与GPT-4o和Claude3.5相当

1 前言 《Qwen2-VL》论文精读【上】:发表于2024年10月 Qwen2-VL 迅速崛起 | 性能与GPT-4o和Claude3.5相当 上回详细分析了Qwen2-VL的论文摘要、引言、实验,下面继续精读Qwen2-VL的方法部分。 文章目录 1 前言2 方法2.1 Model Architecture2.2 改进措施2…...

WebSocket消息帧的组成结构

WebSocket消息帧是WebSocket协议中的一个基本单位,它定义了数据在客户端和服务器之间传递的格式。每个数据帧包含了不同类型的数据和各种控制信息。以下是WebSocket消息帧的组成结构: WebSocket 帧结构 FIN、RSV1、RSV2、RSV3 和 opcode(第一…...

如何利用低代码开源框架实现高效开发?

随着数字化转型步伐的加快,越来越多的企业开始关注提高软件开发效率的方法。低代码平台因其能够大幅减少编码量而受到欢迎,而开源框架则因其灵活性和社区支持成为开发者的首选。如何利用低代码开源框架实现高效开发,成为许多企业和开发者面临…...

使用 RabbitMQ 有什么好处?

大家好,我是锋哥。今天分享关于【使用 RabbitMQ 有什么好处?】面试题。希望对大家有帮助; 使用 RabbitMQ 有什么好处? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RabbitMQ 是一种流行的开源消息代理,广…...

机器学习周报(RNN的梯度消失和LSTM缓解梯度消失公式推导)

文章目录 摘要Abstract 1 RNN的梯度消失问题2 LSTM缓解梯度消失总结 摘要 在深度学习领域,循环神经网络(Recurrent Neural Network, RNN)被广泛应用于处理序列数据,特别是在自然语言处理、时间序列预测等任务中。然而&#xff0c…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

React Native 导航系统实战(React Navigation)

导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【JVM】- 内存结构

引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...