返回顶部
首页 > 资讯 > 数据库 >Redis详解(一)冰叔带你了解Redis
  • 875
分享到

Redis详解(一)冰叔带你了解Redis

Redis详解(一)冰叔带你了解Redis 2020-02-04 23:02:55 875人浏览 猪猪侠
摘要

Redis 是一种基于 键值对 的 NoSQL 数据库。与很多键值对数据库不同,Redis 提供了丰富的 值数据存储结构,包括 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、bitmap(

Redis 是一种基于 键值对 的 NoSQL 数据库。与很多键值对数据库不同,Redis 提供了丰富的 值数据存储结构,包括 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、bitmap(位图)等等。

 

 

正文

Redis 是一个使用 ANSI C 编写的开源、支持 网络、基于 内存单线程模型可选持久性 的 键值对存储数据库

1. Redis的特性

  1. 速度快,最快可达到 10w QPS(基于 内存C 语言,单线程 架构);

  2. 基于 键值对 (key/value) 的数据结构服务器。全称 Remote Dictionary Server。包括 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、bitmap(位图)。同时在 字符串 的基础上演变出 位图BitMaps)和 HyperLogLog 两种数据结构。3.2 版本中加入 GEO地理信息位置)。

  3. 丰富的功能。例如:键过期缓存),发布订阅消息队列), lua 脚本(自己实现 Redis 命令),事务流水线Pipeline,用于减少网络开销)。

  4. 简单稳定。无外部库依赖,单线程模型。

  5. 客户端语言多。

  6. 持久化(支持两种 持久化 方式 RDB 和 AOF)。

  7. 主从复制分布式的基础)。

  8. 高可用Redis Sentinel),分布式Redis Cluster)和 水平扩容

2. Redis的应用场景

2.1. 缓存

合理的使用 缓存 能够明显加快访问的速度,同时降低数据源的压力。这也是 Redis 最常用的功能。Redis 提供了 键值过期时间EXPIRE key seconds)设置,并且也提供了灵活控制 最大内存 和 内存溢出 后的 淘汰策略

2.2. 排行榜

每个网站都有自己的排行榜,例如按照 热度排名 的排行榜,发布时间 的排行榜,答题排行榜 等等。Redis 提供了 列表list)和 有序集合zset)数据结构,合理的使用这些数据结构,可以很方便的构建各种排行榜系统。

2.3. 计数器

计数器 在网站应用中非常重要。例如:点赞数加 1浏览数 加 1。还有常用的 限流操作,限制每个用户每秒 访问系统的次数 等等。Redis 支持 计数功能INCR key),而且计数的 性能 也非常好,计数的同时也可以设置 超时时间,这样就可以 实现限流

2.4. 社交网络

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

2.5. 消息队列

Redis 提供的 发布订阅PUB/SUB)和 阻塞队列 的功能,虽然和专业的消息队列比,还 不够强大,但对于一般的消息队列功能基本满足。

3. Redis的安装配置

下面介绍一下 Redis 的安装流程。我会按照如下的顺序,逐步搭建出 高可用 的 Redis 缓存服务器集群

  • Redis 单机服务器 搭建
  • Redis 主从复制 搭建
  • Redis-Sentinel 高可用 搭建

3.1. Redis单机服务器安装

3.1.1. 下载并解压

首先从 Redis 官网下载 Redis 源代码并解压,这里使用的是 最新稳定版本 4.0.11。依次执行如下命令:

cd /usr/local/
wget Http://download.redis.io/releases/redis-4.0.11.tar.gz
tar -zxvf redis-4.0.2.tar.gz

3.1.2. 编译并安装

下载并解压完毕后,则对 源码包 进行 编译安装,这里 Redis 安装路径为 /usr/local/redis

注意make install PREFIX=目标安装路径

cd /usr/local/redis-4.0.11
make install PREFIX=/usr/local/redis

安装完成时,/usr/local/redis/bin 目录下会生成的几个可执行的文件。

可执行文件 作用
redis-server 启动 redis 服务
redis-cli redis 命令行客户端
redis-benchmark redis 基准测试工具
redis-check-aof redis AOF 持久化文件检测和修复工具
redis-check-dump redis RDB 持久化文件检测和修复工具
redis-sentinel 启动 redis sentinel

复制 Redis 相关命令到 /usr/local/bin 目录下,这样就可以直接执行这些命令,不用写全路径。

$ cd /usr/local/redis/bin/
$ sudo sudo cp redis-cli redis-server redis-sentinel /usr/local/bin

3.1.3. 修改Redis配置文件

安装完成之后将 Redis 配置文件拷贝到 /usr/local 下,redis.conf 是 Redis 的配置文件,redis.conf 在 Redis 源码目录,port 默认是 6379

$ sudo cp /usr/local/redis-4.0.11/redis.conf /usr/local/

Redis 配置文件主要参数解析参考:

# redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端)。
daemonize no
# 指定redis进程的PID文件存放位置
pidfile /var/run/redis.pid
# redis进程的端口号
port 6379
# 绑定的主机地址
bind 127.0.0.1
# 客户端闲置多长时间后关闭连接,默认此参数为0即关闭此功能
timeout 300
# redis日志级别,可用的级别有debug.verbose.notice.warning
loglevel verbose
# log文件输出位置,如果进程以守护进程的方式运行,此处又将输出文件设置为stdout的话,就会将日志信息输出到/dev/null里面去了
logfile stdout
# 设置数据库的数量,默认为0可以使用select 命令在连接上指定数据库id
databases 16
# 指定在多少时间内刷新次数达到多少的时候会将数据同步到数据文件
save  
# 指定存储至本地数据库时是否压缩文件,默认为yes即启用存储
rdbcompression yes
# 指定本地数据库文件名
dbfilename dump.db
# 指定本地数据问就按存放位置
dir ./
# 指定当本机为slave服务时,设置master服务的IP地址及端口,在redis启动的时候他会自动跟master进行数据同步
slaveof  
# 当master设置了密码保护时,slave服务连接master的密码
masterauth 
# 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH命令提供密码,默认关闭
requirepass footbared
# 设置同一时间最大客户连接数,默认无限制。redis可以同时连接的客户端数为redis程序可以打开的最大文件描述符,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回 max number of clients reached 错误信息
maxclients 128
# 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key。当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory
# 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no。
appendonly no
# 指定跟新日志文件名默认为appendonly.aof
appendfilename appendonly.aof
# 指定更新日志的条件,有三个可选参数 - no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全), everysec:表示每秒同步一次(折衷,默认值);
appendfsync everysec
  • 设置后台启动

由于 Redis 默认是 前台启动,不建议使用。修改 Redis 配置文件,把 daemonize no 改为 daemonize yes

daemonize yes
  • 设置远程访问

Redis 默认只允许 本机访问,把 bind 修改为 bind 0.0.0.0 此设置会变成 允许所有远程访问。如果想指定限制访问,可设置对应的 IP

bind 0.0.0.0
  • 配置 Redis 日志记录

找到 logfile 配置,默认是:logfile "",改为自定义日志文件路径。

logfile /var/log/redis_6379.log
  • 设置 Redis 请求密码

把 requirepass 修改为 123456,修改之后重启下服务

requirepass "123456"

有了密码之后,进入客户端,就得这样访问:

3.1.4. Redis

$ redis-cli -h 127.0.0.1 -p 6379 -a 123456

 

的常用命令

  • 启动命令
$ redis-server /usr/local/redis.conf
  • 关闭命令
$ redis-cli -h 127.0.0.1 -p 6379 shutdown
  • 查看是否启动

      

$ ps -ef | grep redis

 

  • 进入客户端
$ redis-cli
  • 关闭客户端
$ redis-cli shutdown

 

注意:不建议使用 kill -9,这种方式不但不会做持久化操作,还会造成缓冲区等资源不能优雅关闭。极端情况下造成 AOF 和 复制丢失数据 的情况。shutdown 还有一个参数,代表是否在关闭 redis 前,生成 持久化文件,命令为 redis-cli shutdown nosave|save

  • 设置为开机自动启动
$ echo "redis-server /usr/local/redis.conf" >> /etc/rc.local

 

  • 开放防火墙端口
 
# 添加规则
iptables -I INPUT -p tcp -m tcp --dport 6379 -j ACCEPT
# 保存规则
service iptables save
# 重启iptables
service iptables restart

3.1.5. 注册Redis为系统服务

在 /etc/init.d 目录下添加 Redis 服务的 启动暂停 和 重启 脚本:

$ sudo /etc/init.d/redis

 

脚本的内容如下:

#!/bin/sh  
#  
# redis - this script starts and stops the redis-server daemon  
#  
# chkconfig:   - 85 15  
# description:  Redis is a persistent key-value database  
# processname: redis-server  
# config:      /usr/local/redis/bin/redis-server
# config:      /etc/redis.conf  
# Source function library.  
. /etc/rc.d/init.d/functions  
# Source networking configuration.  
. /etc/sysconfig/network  
# Check that networking is up.  
[ "$NETWORKING" = "no" ] && exit 0  
redis="/usr/local/redis/bin/redis-server" 
prog=$(basename $redis)  
REDIS_CONF_FILE="/etc/redis.conf" 
[ -f /etc/sysconfig/redis ] && . /etc/sysconfig/redis  
lockfile=/var/lock/subsys/redis  
start() {  
    [ -x $redis ] || exit 5  
    [ -f $REDIS_CONF_FILE ] || exit 6  
    echo -n $"Starting $prog: "  
    daemon $redis $REDIS_CONF_FILE  
    retval=$?  
    echo  
    [ $retval -eq 0 ] && touch $lockfile  
    return $retval  
}  
stop() {  
    echo -n $"Stopping $prog: "  
    killproc $prog -QUIT  
    retval=$?  
    echo  
    [ $retval -eq 0 ] && rm -f $lockfile  
    return $retval  
}  
restart() {  
    stop  
    start  
}  
reload() {  
    echo -n $"Reloading $prog: "  
    killproc $redis -HUP  
    RETVAL=$?  
    echo  
}  
force_reload() {  
    restart  
}  
rh_status() {  
    status $prog  
}  
rh_status_q() {  
    rh_status >/dev/null 2>&1  
}  
case "$1" in  
    start)  
        rh_status_q && exit 0  
        $1  
        ;;  
    stop)  
        rh_status_q || exit 0  
        $1  
        ;;  
    restart|configtest)  
        $1  
        ;;  
    reload)  
        rh_status_q || exit 7  
        $1  
        ;;  
    force-reload)  
        force_reload  
        ;;  
    status)  
        rh_status  
        ;;  
    condrestart|try-restart)  
        rh_status_q || exit 0  
    ;;  
    *)  
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|orce-reload}"  
        exit 2  
esac

赋予脚本文件可执行权限:

$ chmod 755 /etc/init.d/redis

 

启动、停止和重启 redis 服务:

service redis start
service redis stop
service redis restart

 

3.2. Redis主从复制集群安装

3.2.1. Redis-Server配置说明

角色 IP地址 端口号
Redis Master 10.206.20.231 16379
Redis Slave 10.206.20.231 26379

3.2.2. Redis主从架构配置

  • 编辑 从机 的 Redis 配置文件,找到 210 行(大概)- #slaveof  。去掉该注释,填写 主服务器 的 IP 和 端口
slaveof 10.206.20.231 16379

 

  • 如果 主服务器 设置了密码,还需要找到 masterauth  这一行,去掉注释,改为 masterauth 的主机密码。
masterauth 123456
  • 配置完成后重启 从服务器 的 Redis 服务。
$ service redis restart
  • 重启完成之后,进入 主服务器 的 redis-cli 模式下,命令为 redis-cli -h 127.0.0.1 -p 16379 -a 123456。输入 INFO replication 查询到 当前主机 的 Redis 的状态,连接上 主服务器 的 从服务器

Redis 主服务器 的配置文件:

  • redis.conf
daemonize yes
pidfile /var/run/redis-16379.pid
logfile /var/log/redis/redis-16379.log
port 16379
bind 0.0.0.0
timeout 300
databases 16
dbfilename dump-16379.db
dir ./redis-workdir
masterauth 123456
requirepass 123456

 

Redis 从服务器 的配置文件:

  • redis.conf
daemonize yes
pidfile /var/run/redis-26379.pid
logfile /var/log/redis/redis-26379.log
port 26379
bind 0.0.0.0
timeout 300
databases 16
dbfilename dump-26379.db
dir ./redis-workdir
masterauth 123456
requirepass 123456
slaveof 127.0.0.1 16379

Redis 主服务器 的状态如下:

# Replication
role:master
connected_slaves:1
slave0:ip=10.206.20.231,port=16379,state=online,offset=28,lag=1
master_replid:625ae9f362643Da5337835beaeabfdca426198c7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28

Redis 从服务器 的状态如下:

# Replication
role:slave
master_host:10.206.20.231
master_port:26379
master_link_status:up
master_last_io_seconds_aGo:3
master_sync_in_progress:0
slave_repl_offset:210
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:625ae9f362643da5337835beaeabfdca426198c7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:210
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:210

3.2.3. Redis主从配置验证

上面完成了基本的 主从配置,可以简单的测试一下效果:

  • 进入 主服务器 的 redis-cli 模式,然后 set 一个值,比如:        
> set master_port "16379"
OK
  • 切换进入 从服务器 的 redis-cli 的模式,查询刚刚设置的值看是否存在:    
> get master_port
"16379"

此时,我们可以发现是可以获取到值的,Redis 的 主从模式 正常工作。

您可能感兴趣的文档:

--结束END--

本文标题: Redis详解(一)冰叔带你了解Redis

本文链接: https://lsjlt.com/news/2856.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Redis详解(一)冰叔带你了解Redis
    Redis 是一种基于 键值对 的 NoSQL 数据库。与很多键值对数据库不同,Redis 提供了丰富的 值数据存储结构,包括 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、bitmap(...
    99+
    2020-02-04
    Redis详解(一)冰叔带你了解Redis
  • 一文带你了解Redis中RDB与AOF的区别
    目录Redis 中的 RDB 与 AOFRDBAOF小结Redis 中的 RDB 与 AOF 我们都知道,Redis 运行时是将数据保存在内存中的,如果服务器宕机或者重启,那么内存中的数据必然会丢失,从而影响正常的业务运...
    99+
    2023-06-10
    Redis中RDB与AOF区别 Redis RDB Redis AOF
  • 一文带你了解Redis的三种集群模式
    目录Redis 的三种集群模式主从复制模式哨兵模式Redis-Cluster集群模式小结Redis 的三种集群模式 Redis 的常用的集群方式主要有以下三种,分别是主从复制模式、哨兵模式、Redis-Cluster集群...
    99+
    2023-06-10
    Redis的三种集群模式 Redis 集群模式
  • 一文带你了解如何在Java中操作Redis
    文章目录 前言一、 Redis客户端简介1. Redis客户端分类2. Spring 整合 Redis 的两种方式 二、 使用 Jedis 操作 Redis1. Jedis的maven坐标2. 使用Jedis操作Redis的步骤...
    99+
    2023-08-16
    java redis 开发语言 后端 缓存 数据库
  • 一文带你了解Redis怎么启动以及使用
    目录一、认识Redis二、启动Redis(命令行客户端)总结一、认识Redis 特征: 键值型,value支持多种不同的数据结构单线程,每个命令具备原子性(核心命令执行依然是单线程)低延迟,速度快(基于内存、IO多路复...
    99+
    2023-04-12
    redis的启动 redis启动方法 redis启动流程
  • 一文带你详细了解jQuery
    目录举个例子 : jQuery 使用常见插件常用的一些内容jQuery于2006年1月由John Resig在BarCamp NYC首次发布。它目前由Timmy Wilso...
    99+
    2023-05-15
    Javascript jQuery
  • 你了解Redis事务吗
    目录前言ACID属性说明原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)Redis如何实现事务实现原理事务相关命...
    99+
    2022-11-13
    Redis 事务
  • redis中的bitmap你了解吗
    目录1、BitMap是什么2、setbit命令介绍 总结1、BitMap是什么 通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个b...
    99+
    2024-04-02
  • 一文带你了解Java
    今天就跟大家聊聊有关一文带你了解Java,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java 简介Java是由Sun Microsystems公司(现已被oracle公司收购)于1...
    99+
    2023-05-31
    java ava
  • 一文带你深入了解Node.js(图文详解)
    本篇文章通过超多代码和图解来带大家深入解析Node.js,主要内容包括模块化处理、包的基本应用、Express、跨域、操作Mysql数据库等,希望对大家有所帮助!一、Node.js简介1.1什么是Node.jsNode.js是一个调用内置A...
    99+
    2023-05-14
    nodejs
  • 关于Redis你可能不了解的一些事
    引子 Redis 是一个高性能分布式的key-value数据库。它支持多种数据结构,并可应用于缓存、队列等多种场景下。使用过Redis的小伙伴们可能对这些已经非常熟知了,下面我想来谈谈Redis也许并不被...
    99+
    2024-04-02
  • 一文带你详细了解Vue脚手架
    本篇文章带大家了解vue脚手架,聊聊怎么初始化Vue脚手架,介绍ref和props、mixin(混合)等,希望对大家有所帮助!一.初始化Vue脚手架1.说明一般脚手架选择最新版本2.具体步骤全局安装vue/cli脚手架切换到项目目录,运行v...
    99+
    2023-05-14
    Vue
  • 【MySQL】一文带你了解SQL
    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! ...
    99+
    2023-09-06
    mysql sql 数据库
  • 一篇文章带你了解C++智能指针详解
    目录为什么要有智能指针?智能指针的使用及原理RALLshared_ptr的使用注意事项创建多个 shared_ptr 不能拥有同一个对象shared_ptr 的销毁shared_pt...
    99+
    2024-04-02
  • 一篇文章带你了解C++模板编程详解
    目录模板初阶泛型编程函数模板函数模板概念函数模板格式函数模板的原理函数模板的实例化模板参数的匹配原则类模板类模板的定义格式类模板的实例化总结模板初阶 泛型编程 在计算机程序设计领域...
    99+
    2024-04-02
  • 一篇文章带你详细了解JavaScript数组
    目录一、数组的作用:二、数组的定义:1.通过构造函数创建数组2.通过字面量的方式创建数组三、数组元素四、数组长度五、数组索引(下标)六、数组注意的问题1.数组中存储的数据可以是不一样...
    99+
    2024-04-02
  • 一文带你详细了解Vue中的v-for
    目录v-forv-set重绘和回流虚拟DOMcomputed计算属性总结v-for 作用: 列表渲染,所在标签结构,按照数据数量,循环生成。指令写在谁身上,就循环创建谁 1.语法: ...
    99+
    2022-11-13
    vue的v-for的使用 vue的v-for循环 vue的v-for用法
  • 一分钟带你了解mysql DDL
    小编给大家分享一下一分钟带你了解mysql DDL,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!SQL分类:SQL语句主要可以划分为以下3个类别:DDL语句:数据定义语言,这些语句定义了不...
    99+
    2024-04-02
  • 一文带你了解MySQL之锁
    目录 一、解决并发事务带来问题的两种基本方式1.1 一致性读(Consistent Reads)1.2 锁定读(Locking Reads)1.2.1 共享锁和独占锁1.2.2 锁定读的语句 1.3 写操作 二、多粒度锁三...
    99+
    2023-08-16
    mysql 数据库 大数据 数据库架构 数据库开发
  • 带你了解Spring AOP的使用详解
    目录springmvc.xmlBankDaoAdminCheckBankDaoImplLogInfoTransmactionAdminCheckInterceptorLogInfoI...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作