百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis一篇入门,请放心食用

mhr18 2024-11-23 19:17 27 浏览 0 评论

满怀忧思不如先干再说!

前言

Redis目前已发展为是Java开发必备的技能,部分前端开发也需要掌握Redis,推出Redis的系列文章,需要用到Redis或者想学习Redis的小伙伴记得关注收藏哦!


初识Redis

什么是Redis

Redis:REmote DIctionary Server(远程字典服务器),完全开源免费,使用C语言编写,遵守BSD协议的一个高性能key-value分布式内存数据库并提供持久化的NoSQL数据库。Redis支持五种基础的数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合),和三种特殊类型:geospatial地理位置、hyperloglog、bitmaps,Redis可用作数据库缓存消息中间件。

Redis特性

速度快

Redis官方给出的数据是10W QPS(每秒可以操作数据10W次)这个数据会根据电脑性能和Redis的使用方式不同而略微不同,但是在万级数据中操作没有压力。

那么Redis为什么这么快,主要有以下几个方面

1、纯内存操作

数据存放在内存中,内存的响应时间大约是 100纳秒 ,这是Redis每秒万亿级别访问的重要基础。

2、编程语言

纯ANSI C编写,不依赖第三方类库,没有像memcached那样使用libevent,因为libevent迎合通用性而造成代码庞大,所以作者用libevent中两个文件修改实现了自己的epoll event loop。

3、线程模型

Redis使用单线程操作,避免了频繁的上下文切换,虽然是采用单线程,但是单线程避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU;虽然作者认为CPU不是瓶颈,内存与网络带宽才是,但实际测试时并非如此。

4、采用了非阻塞I/O多路复用机制

多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了事件,不在I/O上浪费过多的时间

编辑

编辑

持久化

Redis的数据存储在内存中,对数据的更新会异步存储在磁盘中,Redis提供两种持久化策略保证服务在宕机或者断电等不正常情况发生时,重启Redis服务来恢复数据到内存中。

多种数据结构

Redis提供了string、List、set、Zset、Hash五种数据结构来存储数据,而memcached只支持string数据类型。在redis的新版本中提供了 bitmaps(位图), hyperloglogs (超小内存唯一值计数)和 geospatial(地理空间)数据类型

支持多种编程语言

功能丰富

1、消息发布订阅

2、Lua脚本

3、事务

4、pipeline

简单

Redis单节点的核心代码只有23000行,我们来吃透Redis这个项目,或者有些企业通过修改Redis源代码来实现定制化功能都是非常容易的,Redis不依赖于外部的第三库,单线程模型,无论服务端还是客户端开发都会相对容易。

主从复制

在Redis中有主从复制,分为主服务器从服务器两个角色,主服务器数据可以同步到从服务器上,可以为高可用和分布式提供很好的基础。

高可用和分布式

Redis的单点或者主从复制模型,如果想要实现高可用是比较困难的,在2.8版本推出Redis-Sentinel支持高可用,Redis在3.0版本推出Redis-Cluster支持分布式

Redis典型应用场景

缓存系统

由于redis访问速度块、支持的数据类型比较丰富,所以redis很适合用来存储热点数据,另外结合expire,我们可以设置过期时间然后再进行缓存更新操作,这个功能最为常见,我们几乎所有的项目都有所运用

限时业务

redis中可以使用expire命令设置一个键的生存时间,到时间后redis会删除它。利用这一特性可以运用在限时的优惠活动信息、手机验证码等业务场景

计数器

redis由于incrby命令可以实现原子性的递增,所以可以运用于高并发的秒杀活动、分布式序列号的生成、具体业务还体现在比如限制一个手机号发多少条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等

排行榜

关系型数据库在排行榜方面查询速度普遍偏慢,所以可以借助redis的SortedSet进行热点数据的排序。在实际运用中性能体验也蛮不错

分布式锁

这个主要利用redis的setnx命令进行,setnx:"set if not exists"就是如果不存在则成功设置缓存同时返回1,否则返回0 ,如果我们服务器是集群的,定时任务可能在两台机器上都会运行,所以在定时任务中首先 通过setnx设置一个lock,如果成功设置则执行,如果没有成功设置,则表明该定时任务已执行。 当然结合具体业务,我们可以给这个lock加一个过期时间,比如说30分钟执行一次的定时任务,那么这个过期时间设置为小于30分钟的一个时间 就可以,这个与定时任务的周期以及定时任务执行消耗时间相关。我们可以将这个特性运用于其他需要分布式锁的场景中,结合过期时间主要是防止死锁的出现。zookeeper也可以来实现分布式锁

延时操作

比如在订单生产后我们占用了库存,10分钟后去检验用户是够真正购买,如果没有购买将该单据设置无效,同时还原库存。 由于redis自2.8.0之后版本提供Keyspace Notifications功能,允许客户订阅Pub/Sub频道,以便以某种方式接收影响Redis数据集的事件。 所以我们对于上面的需求就可以用以下解决方案,我们在订单生产时,设置一个key,同时设置10分钟后过期, 我们在后台实现一个监听器,监听key的失效,监听到key失效时将后续逻辑加上。 当然我们也可以利用rabbitmq、activemq等消息中间件的延迟队列服务实现该需求

点赞、好友等相互关系的存储

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。 又或者在微博应用中,每个用户关注的人存在一个集合中,就很容易实现求两个人的共同好友功能

队列

由于redis有list push和list pop这样的命令,所以能够很方便的执行队列操作,如果你要实现复杂的队列使用RabbitMQ等专业队列中间件

Redis的使用场景还有很多很多这里就不一一列举额,大家掌握Redis的特性在工作中可以灵活运用即可

Redis安装和配置

Redis安装环境

Redis可以在windows下和Unix下安装,我们这里选择使用Linux下安装,也是推荐的一种方式

下载

我们进入到/usr/local目录下下载安装包,或者到官网下载之后上传到Linux上,下方是直接在Liunx上运行wget命令下载软件

wget http://download.redis.io/releases/redis-5.0.5.tar.gz

解压安装

解压

tar -zxvf redis-5.0.5.tar.gz

安装

进入到redis解压目录运行make & make install进行编译安装

make & make install

Redis核心文件目录介绍

src目录

Redis的核心目录是src目录,在Redis的安装目录下,Redis的相关启动关闭命令就在该目录下

redis-server------------>操作Redis服务器命令

redis-cli----------------->Redis命令行客户端

redis-benchmark----->Redis性能检测工具

redis-check-aof------->AOF文件修复工具

redis-check-rdb---->RDB文件检查工具

redis-sentinel---------->Sentinel服务器(2.8以后版本)

我们目前需要关心的是redis-server和redis-cli这两个命令

redis.conf文件

redis.conf配置文件在redis的安装目录下,这个是redis的核心配置文件,如果我们要修改配置可以读取该文件,默认读取redis安装目录下的这个配置文件,我们在启动Redis时也可以指定配置文件读取。

动点手脚

我们进入到src目录下之后发现有很多文件,我们需要使用的就是那么几个可执行命令,我们可以在redis安装目录下创建bin目录将可执行文件拷贝进来,方便使用。参考图如下,大家使用cp命令即可实现

redis启动和连接

默认启动

使用默认的配置启动redis,直接使用redis-server命令即可,使用非守护进程的方式启动,会占用当前操作窗口,我们可以之间按ctrl+c退出Redis

redis-server

动态参数

我们可以使用动态参数方式连接redis,我们指定端口号为6380

redis-server --port 6380

编辑

指定配置文件(推荐使用)

1、在redis安装目录下创建conf目录存储配置文件

mkdir conf

2、将redis.conf配置文件中的内容去除注释和空格等输出到指定配置文件(redis-6379.conf)中

cat redis.conf | grep -v "#" | grep -v "^#34; >> conf/redis-6379.conf

3、修改redis-6379.conf文件,大家修改时注意注释的地方即可

#bind 127.0.0.1 
protected-mode no 
port 6379 
daemonize yes 
logfile "/var/redis-5.0.5/logs/redis.log" 
dir "/var/redis-5.0.5/data"

4、创建data和logs目录

mkdir -p /var/redis-5.0.5/data /var/redis-5.0.5/logs

5、启动,redis-server后跟上配置文件路径即可

redis-server conf/redis-6379.conf

6、查看redis进程

ps -ef | grep redis

客户端连接

我们这里使用命令行客户端连接redis,使用redis-cli命令 -h写ip,-p写端口

redis-cli -h 127.0.0.1 -p 6379

测试使用

ping命令如果返回PONG代表连接成功

set 设置String类型值,k1、为键,hello为值

get 根据键获取值,k1为键,hello为返回的值

Redis常用配置

Redis的配置有很多,这里我们是简单入门说一些常用的配置,其他的配置我们在指定的模块贴出,这些配置都是在我们上边说到的redis.conf文件中

daemonize

大概在136行,默认为no,是否将redis进程当做守护进程在后台运行,我们可以将其设置为yes

port

大概在92行,redis的默认端口为6379,如果需要单节点上启动多个redis实例,需要修改端口号

logfile

大概在171行,配置redis的日志文件,默认什么都没有,我们可以修改日志想要存储的路径等,查看redis运行的情况

dir

大概在263行,配置redis的持久化文件存储路径,默认是./也就是当前路径,也就是启动redis-server命令的路径,可以按需修改

bind

大概在69行,是绑定本机的IP地址,(准确的是:本机的网卡对应的IP地址,每一个网卡都有一个IP地址),而不是redis允许来自其他计算机的IP地址。如果指定了bind,则说明只允许来自指定网卡的Redis请求。如果没有指定,就说明可以接受来自任意一个网卡的Redis请求,我这里直接将其注释掉

protected-mode

大概在88行,redis3.2版本后新增protected-mode配置,默认是yes,即开启。设置外部网络连接redis服务,设置方式如下:

1、关闭protected-mode模式,此时外部网络可以直接访问

2、开启protected-mode保护模式,需配置bind ip或者设置访问密码

收藏等于学会,有用记得关注,点赞!
想学编程或者疑惑,私信或者留言免费解答哦!为少走弯路出一份力!

相关推荐

如何检查 Linux 服务器是物理服务器还是虚拟服务器?

在企业级运维、故障排查和性能调优过程中,准确了解服务器的运行环境至关重要。无论是物理机还是虚拟机,都存在各自的优势与限制。在很多场景下,尤其是当你继承一台服务器而不清楚底层硬件细节时,如何快速辨识它是...

第四节 Windows 系统 Docker 安装全指南

一、Docker在Windows上的运行原理(一)架构限制说明Docker本质上依赖Linux内核特性(如Namespaces、Cgroups等),因此在Windows系统上无法直...

C++ std:shared_ptr自定义allocator引入内存池

当C++项目里做了大量的动态内存分配与释放,可能会导致内存碎片,使系统性能降低。当动态内存分配的开销变得不容忽视时,一种解决办法是一次从操作系统分配一块大的静态内存作为内存池进行手动管理,堆对象内存分...

Activiti 8.0.0 发布,业务流程管理与工作流系统

Activiti8.0.0现已发布。Activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎。Activiti可以...

MyBatis动态SQL的5种高级玩法,90%的人只用过3种

MyBatis动态SQL在日常开发中频繁使用,但大多数开发者仅掌握基础标签。本文将介绍五种高阶技巧,助你解锁更灵活的SQL控制能力。一、智能修剪(Trim标签)应用场景:动态处理字段更新,替代<...

Springboot数据访问(整合Mybatis Plus)

Springboot整合MybatisPlus1、创建数据表2、引入maven依赖mybatis-plus-boot-starter主要引入这个依赖,其他相关的依赖在这里就不写了。3、项目结构目录h...

盘点金州勇士在奥克兰13年的13大球星 满满的全是...

见证了两个月前勇士与猛龙那个史诗般的系列赛后,甲骨文球馆正式成为了历史。那个大大的红色标志被一个字母一个字母地移除,在周四,一切都成为了过去式。然而这座,别名为“Roaracle”(译注:Roar怒吼...

Mybatis入门看这一篇就够了(mybatis快速入门)

什么是MyBatisMyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为M...

Springboot数据访问(整合druid数据源)

Springboot整合druid数据源基本概念SpringBoot默认的数据源是:2.0之前:org.apache.tomcat.jdbc.pool.DataSource2.0及之后:com.z...

Linux 中的 &quot;/etc/profile.d&quot; 目录有什么作用 ?

什么是/etc/profile.d/目录?/etc/profile.d/目录是Linux系统不可或缺的一部分保留配置脚本。它与/etc/profile文件相关联,这是一个启动脚本,该脚...

企业数据库安全管理规范(企业数据库安全管理规范最新版)

1.目的为规范数据库系统安全使用活动,降低因使用不当而带来的安全风险,保障数据库系统及相关应用系统的安全,特制定本数据库安全管理规范。2.适用范围本规范中所定义的数据管理内容,特指存放在信息系统数据库...

Oracle 伪列!这些隐藏用法你都知道吗?

在Oracle数据库中,有几位特殊的“成员”——伪列,它们虽然不是表中真实存在的物理列,但却能在数据查询、处理过程中发挥出意想不到的强大作用。今天给大家分享Oracle伪列的使用技巧,无论...

Oracle 高效处理数据的隐藏神器:临时表妙用

各位数据库搬砖人,在Oracle的代码世界里闯荡,处理复杂业务时,是不是总被数据“搅得头大”?今天给大家安利一个超实用的隐藏神器——临时表!当你需要临时存储中间计算结果,又不想污染正式数据表...

Oracle 数据库查询:多表查询(oracle多表关联查询)

一、多表查询基础1.JOIN操作-INNERJOIN:返回两个表中满足连接条件的匹配行,不保留未匹配数据。SELECTa.emp_id,b.dept_nameFROMempl...

一文掌握怎么利用Shell+Python实现多数据源的异地备份程序

简介:在信息化时代,数据安全和业务连续性已成为企业和个人用户关注的焦点。无论是网站数据、数据库、日志文件,还是用户上传的文档、图片等,数据一旦丢失,损失难以估量。尤其是当数据分布在多个不同的目录、服务...

取消回复欢迎 发表评论: