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

redis(1)

文章目录

  • 一、redis基础
    • redis简介
    • redis 特性
    • 单线程
    • redis 对比 memcached
    • redis 典型应用场景
  • 二、redis安装及连接
    • yum安装redis
      • 查看yum仓库redis版本
      • yum安装 redis
    • 编译安装 redis
      • 编译安装
      • 前台启动redis
      • 启动多实例
      • 解决启动时的三个警告提示
      • 创建 redis 用户
      • 编辑 redis 服务器启动文件
      • 验证 redis 启动
      • 使用客户端连接redis
      • 设置密码登录
      • 创建命令软连接
      • 编译安装后的命令
      • 一键编译安装Redis脚本
    • 连接到 Redis
      • 客户端连接redis
      • 程序连接 Redis
      • shell连接方式
      • python连接方式
    • redis 的多实例

一、redis基础

redis主要用来做缓存

redis简介

短短几年,Redis就有了很大的用户群体,目前国内外使用的公司众多,比如:阿里,百度,新浪微博,知乎网,Github,Twitter等。

Redis是一个开源的,遵循BSD协议的,基于内存的而且目前比较流行的键值数据库(key-value database),是一个非关系型数据库,redis提供将内存通过网络远程共享的一种服务,提供类似的功能的还有memcached,但相比memcached,redis还提供了易扩展、高性能、具备数据持久化等功能。

redis在高并发、低延迟环境要求比较高的环境使用量非常广泛,目前redis在DB-Engine月排行榜一致比较靠前,而且一直是键值型存储类的首位

官网地址:https://redis.io/

redis 特性

  • 速度快:10W QPS,基于内存,C语言实现
  • 单线程
  • 持久化
  • 支持多种数据结构
  • 支持多种编程语言
  • 功能丰富:支持Lua脚本,发布订阅,事务,pipline等功能
  • 简单:代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单
  • 主从复制
  • 支持高可用和分布式

单线程

Redis6.0版本之前一直都是单线程方式处理用户请求

单线程为何如此快?

  • 纯内存
  • 非阻塞
  • 避免线程切换和竞态消耗
    img

注意事项:

  • 一次只运行一条命令
  • 拒绝长(慢)命令:keys,flushall,flushdb,show lua script,multi/exec,operate big value(collection)
  • 其实不是单线程:早期版本是单进程单线程,3版本后实际还有其他线程,fsync file descriptor, close file descriptor

redis 对比 memcached

  • 支持数据的持久化:可以将内存中的数据保持在磁盘中,重启redis服务或者服务器之后可以从备份文件中恢复数据到内存继续使用
  • 支持更多的数据类型:支持string(字符串)、hash(哈希数据)、list(列表)、set(集合)、zset(有序集合)
  • 支持数据的备份:可以实现类似于数据的master-slave模式的数据备份,另外也支持使用快照+AOF
  • 支持更大的value数据:memcache单个key value最大支持1MB,而redis最大支持512MB(生产不建议超过2M,性能受影响)
  • 在Redis6版本前,redis是单线程,而memcached是多线程,所以单机情况下没有memcached并发高,性能更好,但redis支持分布式集群以实现更高的并发,单redis实例可以实现数万并发
  • 支持集群横向扩展:基于redis cluster的横向扩展,可以实现分布式集群,大幅提升性能和数据安全性
  • 都是基于C语言开发

redis 典型应用场景

  • session共享:常见于web集群中的Tomcat或者PHP中的多web服务器session共享
  • 缓存:数据查询、电商网站商品信息、新闻内容
  • 计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
  • 微博/微信社交场合:共同好友,粉丝数,关注,点赞评论等
  • 消息队列:ELK的日志缓存、部分业务的订阅发布系统
  • 地理位置:基于GEO(地理位置信息定位),实现摇一摇,附近的人,外卖等功能

数据更新操作流程

数据还是存在mysql中,redis用来做缓存

redis缓存与数据库的一致性一种解决方案_酒剑随马@的博客-CSDN博客_redis扣减库存,数据一致性

数据读操作流程:

redis解决了什么问题? - 知乎

二、redis安装及连接

官方下载地址:http://download.redis.io/releases/

yum安装redis

在centos系统上需要安装epel源

查看yum仓库redis版本

yum -y install epel-release
yum info redis

yum安装 redis

yum -y install redis
systemctl enable --now redis
pstree -p |grep redis
redis-cli	# 客户端连接工具
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> info

编译安装 redis

下载redis源码包

网站:http://download.redis.io/releases/

编译安装

  • 获取软件安装包,安装编译环境
yum -y install make gcc tcl
wget https://download.redis.io/releases/redis-5.0.9.tar.gz
tar xf redis-5.0.9.tar.gz
  • 编译安装
cd redis-5.0.9
cd src/
make
make PREFIX=/apps/redis install
  • 配置变量
echo "PATH=/apps/redis/bin:$PATH" > /etc/profile.d/redis.sh
. /etc/profile.d/redis.sh
  • 目录结构
tree /apps/redis/

准备相关目录和文件

mkdir /apps/redis/{etc,log,data,run}
cp ~/redis-5.0.9/redis.conf /apps/redis/etc

前台启动redis

redis-server 是redis服务器程序

redis-server --help

前台启动redis

redis-server /apps/redis/etc/redis.conf
ss -tnl
默认端口:6379

启动多实例

  • 刚刚启动的案例是6379端口,我们可以在6380端口上开启第二个redis服务
  • 为6380准备相关目录和文件
mkdir /apps/redis/6380
cp -ar /apps/redis/* /apps/redis/6380/
tree -d /apps/redis/6380
vim /apps/redis/6380/etc/redis.conf
port 6380
  • 前端启动6380
redis-server /apps/redis/6380/etc/redis.conf
ss -tnl
连接客户端指定端口,进入到某个实例
redis-cli -p 6380
redis-cli -p 6379

解决启动时的三个警告提示

默认情况,redis配置文件的参数和内核参数不匹配,因此还需要修改配置参数,否则启动时会有警告,但是并不影响使用

  • tcp-backlog
    • backlog参数控制的是三次握手的时候server端收到client.ack确认后之后的队列值,即全连接队列
echo "net.core.somaxconn = 1024" >> /etc/systecl.conf
sysctl -p
net.core.somaxconn = 1024
  • vm.overcommit_memory
    • 查看警告信息有提示,建议将其值改为1
    • 0表示内核将检查是否有足够的可用内存供应应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用程序
    • 1 表示内核允许分配所有的物理内存,而不管当前的内存状态如何
    • 2 表示内核允许分配超过所有物理内存和交换空间总和的内存
echo "vm.overcommit_memory=1" >> /etc/systcl.conf
systcl -p
net.core.somaxconn = 1024
vm.overcommit_memory=1
  • transparent huge pages
    • 警告:您在内核中启用了透明大页面(THP,不同于一般内存页的4k为2M)支持。这将在Redis中造成延迟和内存使用问题。要解决此问题,请以root用户身份允许命令echo never> /sys/kernel/mm/transparent_hugepage/enabled,并将其添加到/etc/rc.local中,以便在重启后保留设置。禁用THP后,必须重新启动redis
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo "/sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
  • 再次启动redis可以看到警告消除,建议在其他redis服务器上做以上配置

创建 redis 用户

useradd -r -s /sbin/nologin redis
chown -R redis.redis /apps/redis/

编辑 redis 服务器启动文件

  • 复制其他主机yum安装生产的redis.server文件进行修改
vim /lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectory=0755
[Install]
WantedBy=multi-user.target

验证 redis 启动

systemctl daemon-reload
systemctl start redis
systemctl enable --now redis
ss -tnl

使用客户端连接redis

  • 格式
redis-cli -h IP/HOSTNAME -p PORT -a PASSWORD
  • 连接示例
redis-cli
127.0.0.1:6739> info

设置密码登录

vim /apps/redis/etc/redis.conf
解除下面一行的注释
# requirepass foobared
后面写自己的密码
requirepass centossystemctl restart redis
redis-cli
127.0.0.1:6739> info
127.0.0.1:6739> auth centos

创建命令软连接

ln -s /apps/redis/bin/ /usr/bin/

编译安装后的命令

ll /apps/redis/bin/
  • 工具作用
工具作用
redis-benchmarkredis性能检测工具
redis-check-aofAOF文件检查工具
redis-check-rdbRDB文件检查工具
redic-cli客户端工具
redis-sentinel->redis-server哨兵,软连接到server
redis-serverredis服务启动命令

一键编译安装Redis脚本

vim redis_install.sh
#!/bin/bash
. /etc/init.d/functions
VERSION=redis-5.0.9
DIR1=/apps/redis
PASSWORD=centos
install(){
yum -y install make gcc tcl &> /dev/null || {action "安装所需包失败,请检查包或网络设置" false;exit;}
wget http://download.redis.io/releases/${VERSION}.tar.gz &> /dev/null || { action "Redis 源码下载失败" false; exit;}
tar xf $VERSION.tar.gz
cd $VERSION/src
make -j 2 &> /dev/null && make PREFIX=${DIR1} install &> /dev/null && action "Redis 编译安装成功" || { action "Redis 安装编译失败" false;exit;}
ln -s ${DIR1}/bin/* /usr/bin
mkdir -p ${DIR1}/{etc,data,log,run}
cd 
cp $VERSION/redis.conf $DIR1/etc
sed -i -e "s/bind 127.0.0.1/bind 0.0.0.0/" -e "/# requirepass/a reuqirepass ${PASSWOORD}" -e "/^dir.*/c dir ${DIR1}/data" -e "logfile .*/c logfile ${DIR1}/log/redis_6379.log" -e "/^pidfile .*/c pidfile ${DIR1}/run/redis_6379.pid" ${DIR1}/etc/redis.confif id redis &> /dev/null;thenaction "redis 用户已存在" false
elseuseradd -r -s /sbin/nologin redisaction "reids 用户创建成功"
fi
chown -R redis.redis ${DIR1}
cat >> /etc/systcl.conf <<EOF
net.core.somaxconn = 1024
vm.overcommit_memory=1
EOF
systcl -p
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo "/sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
/etc/rc.d/rc.local
cat >> /lib/systemd/system/redis.server <<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectory=0755
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start redis
systemctl enable --now redis &> /dev/null && action "Redis 服务启动成功" || { action "redis 服务启动失败" false;exit; }
}
installchmod +x vim redis_install.sh
./redis_install.sh

连接到 Redis

主要分为客户端连接和程序的连接

客户端连接redis

  • 本机无密码连接
redis-cli 
  • 跨主机无密码连接,跨机连不上去要看配置文件的bind的IP是不是不允许网络连接
redis-cli -h 192.168.64.129 -p 6379
192.168.64.129:6379>
  • 跨主机密码连接
vim /apps/redis/etc/redis.conf
requirepass centos
systemctl restart redis
redic-cli -h 192.168.64.129 -p 6379 -a centos --no-auth-warning
192.168.64.129:6379>

程序连接 Redis

  • redis支持多种开发语言访问https://redis.io/clients

shell连接方式

vim redis_test.sh
#!/bin/bash
NUM=`seq 1 10000`
PASS= centos
for i in ${NUM};do
redis-cli -h 127.0.0.1 -a "$PASS" --no-auth-warning set key-${i} value-${i}
echo "key-${i} value-${i} 写入完成"
done
echo "一万个key写入到redis完成"vim /apps/redis/etc/redis.conf
# 临时关闭RDB,不然会报错
save ""		不用管快照systemctl restart redis
time bash redis_test.shredis-cli
> auto centos
> keys *
> get key-996>flushdb # 清空当前库的数据
> keys *
> flushall # 清空所有的数据

python连接方式

redis 的多实例

和上次6380的多实例类似

相关文章:

redis(1)

文章目录 一、redis基础redis简介redis 特性单线程redis 对比 memcachedredis 典型应用场景 二、redis安装及连接yum安装redis查看yum仓库redis版本yum安装 redis 编译安装 redis编译安装前台启动redis启动多实例解决启动时的三个警告提示创建 redis 用户编辑 redis 服务器启动…...

【RTP】webrtc 学习2: webrtc对h264的rtp打包

切片只是拷贝帧的split的各个部分到新的rtp 包的封装中。并没有在rtp包本身标记是否为关键帧FU-A 切片 输入的H.264 数据进行split :SplitNalu SplitNalu : 按照最大1200字节进行切分 切分后会返回一个数组 对于FU-A :split的数据总大小是 去掉一个字节的nalu header size …...

【搜索术】代码阅读理解学习笔记

学习资料 《理解源代码》 1 静态阅读 1.1 目标结构 常见目录名含义docs项目文档examples示例代码...

vue 打包下载多层zip文件

npm install jszip npm install file-saverimport JSZip from "jszip"; import FileSaver from "file-saver"; import {Message} from "view-design";/*** 下载文件 传数组* fileList* [* {* type:file,* name:17034953113790548.png,…...

Flink实战五_状态机制

接上文&#xff1a;Flink实战四_TableAPI&SQL 在学习Flink的状态机制之前&#xff0c;我们需要理解什么是状态。回顾我们之前介绍的很多流计算的计算过程&#xff0c;有些计算方法&#xff0c;比如说我们之前多次使用的将stock.txt中的一行文本数据转换成Stock股票对象的ma…...

SQL中having与where的区别 简单明了

having子句与where都是设定条件筛选的语句&#xff0c;有相似之处也有区别。 having与where的区别: having是在分组后对数据进行过滤 where是在分组前对数据进行过滤 having后面可以使用聚合函数 where后面不可以使用聚合 在查询过程中执行顺序&#xff1a;from>where>g…...

Transformer 自然语言处理(二)

原文&#xff1a;Natural Language Processing with Transformers 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第五章&#xff1a;文本生成 基于 Transformer 的语言模型最令人不安的特点之一是它们生成的文本几乎无法与人类写的文本区分开。一个著名的例子是 Ope…...

软件测试之软件缺陷管理

什么是软件缺陷 标准的定义&#xff1a;从产品内部看&#xff0c;缺陷是软件产品开发或维护过程中存在的错误、毛病等各种问题&#xff1b;从产品外部看&#xff0c;缺陷是系统所需要实现的某种功能的失效或违背 软件缺陷的生命周期 一个缺陷的正常生命周期是 新建&#xff…...

分布式锁(Distributed Lock)介绍(基于数据库(mysql);基于缓存(redis);基于ZooKeeper等分布式协调服务)

文章目录 分布式锁介绍1. 分布式锁的工作原理1.1 锁的基本概念1.2 工作机制 2. 分布式锁的实现方式2.1 基于数据库的分布式锁2.2 基于Redis的分布式锁2.3 基于ZooKeeper的分布式锁 3. 分布式锁的挑战3.1 死锁问题3.2 锁粒度问题粗粒度锁细粒度锁锁粒度的选择 3.3 锁的公平性问题…...

10 ISIS 基础 报文 状态

10 ISIS 基础 报文 状态 09 ISIS 大纲-CSDN博客 •看完本篇博客,您将能知道以下内容: ▫描述IS-IS的基本概念 ▫描述IS-IS的工作原理 ▫描述IS-IS与OSPF的差异 ▫实现IS-IS的常用配置 ▫实现 ISIS 的常用到的认证...

Python第三方扩展库Matplotlib

Python第三方扩展库Matplotlib Matplotlib 是第三方库&#xff0c;不是Python安装程序自带的库&#xff0c;需要额外安装&#xff0c;它是Python的一个综合性的绘图库&#xff0c;提供了大量的绘图函数用于创建静态、动态、交互式的图形和数据可视化&#xff0c;可以帮助用户创…...

单例模式有几种写法?请谈谈你的理解?

为什么有单例模式&#xff1f; 单例模式&#xff08;Singleton&#xff09;&#xff0c;也叫单子模式&#xff0c;是一种常用的软件设计模式。在应用这个模式时&#xff0c;单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象&#xff0c;这样有利…...

帕鲁幻兽 一键开服 简单到爆 教你10秒实现 帕鲁幻兽私服联机服务器搭建

幻兽帕鲁是一款非常受欢迎的游戏&#xff0c;最近在社区中呈现了爆火的趋势&#xff0c;在线人数已经突破了百万级别。由于社区的热度不断上升&#xff0c;官方服务器开始出现了不稳定和卡人闪退的情况。搭建一个私人服务器可能是一个最稳定而舒适的解决方案。通过搭建私人服务…...

自动化报告pptx-python|如何将pandas的表格写入PPTX(二)

本篇延续:自动化报告的前奏|使用python-pptx操作PPT(一) 因为在pptx-python中使用table,需要单个cell逐一输入,于是在想有没有pandas可以直接读入的方式, 有两个开源项目有类似的功能: PandasToPowerpointmspandas其中mspandas写的比较复杂,PandasToPowerpoint比较易懂…...

Ruby详解及安装流程

文章目录 一、Ruby详解二、Ruby安装流程三、Ruby案例四、Ruby常见问题五、Ruby优缺点六、热门文章 一、Ruby详解 Ruby是一种高级编程语言&#xff0c;具有简单易学、灵活多变、优雅美丽的语法特点。它是一种面向对象的编程语言&#xff0c;具有动态类型和解释型语言的特性。在…...

免费的ChatGPT网站 ( 7个 )

ChatGPT的核心功能是基于用户在输入时的语言或文本生成相应的回复或继续内容。此外&#xff0c;它还能够完成多种任务&#xff0c;如撰写邮件、视频脚本、文案、翻译、代码编写以及撰写论文等。 博主归纳总结了7个国内非常好用&#xff0c;而且免费的chatGPT网站&#xff0c;AI…...

python异步编程(1)——理论篇

1.理解多线程 当启动一个Python程序时&#xff0c;它会作为一个单独的进程运行在操作系统中。进程是操作系统分配资源&#xff08;如内存和处理器时间&#xff09;的基本单位。每个Python程序启动时&#xff0c;都会创建一个主线程。如果没有在代码中明确创建其他线程&#xf…...

PyTorch复现网络模型VGG

VGG 原论文地址&#xff1a;https://arxiv.org/abs/1409.1556VGG是Visual Geometry Group&#xff08;视觉几何组&#xff09;的缩写&#xff0c;它是一个在计算机视觉领域中非常有影响力的研究团队&#xff0c;主要隶属于牛津大学的工程系和科学系。VGG以其对卷积神经网络&am…...

Springboot集成Javamelody

JavaMelody的目标是监视QA和生产环境中的Java或Java EE应用服务器。它不是模拟用户请求的工具&#xff0c;而是根据用户对应用程序的使用情况来衡量和计算应用程序实际操作的统计信息的工具。JavaMelody主要基于请求统计和演化图。 它允许改进QA和生产中的应用程序&#xff0c…...

如何将 h5 页面快速转换成微信小程序

Hello各位朋友们大家新的一月好呀&#xff01;我是咕噜铁蛋&#xff01;我知道在小程序开发中&#xff0c;有时候需要将H5页面转换成微信小程序页面。这样可以将原本的网页内容适配到小程序中&#xff0c;让用户能够更方便地访问和使用。在本文中&#xff0c;我将分享如何快速将…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...