author: UpDown published: True created: 2022年5月11日20点24分 tags: Done version: Outer

参考:

官网:http://redis.cn/

安装

apt安装

  • sudo apt install redis-server
    • 安装完后检查 执行程序都在 usr/bin/下
  • sudo service redis-server start 启动
  • sudo service redis-server stop 停止
  • sudo service redis-server restart 重启
  • ps aux|grep redis查看进程 默认端口 6379
  • /etc/redis/redis.conf数据库的默认配置文件

    源码编译安装

    下载地址 http://download.redis.io/releases/redis-5.0.7.tar.gz
  1. 下载获得 redis-5.0.7.tar.gz 后将它放到我们Linux的目录下 /opt
  2. /opt 目录下,解压命令 : tar -zxvf redis-5.0.7.tar.gz
  3. 解压完成后出现文件夹:redis-5.0.7
  4. 进入目录:cd redis-5.0.7
  5. 在 redis-5.0.7 目录下执行 make 命令

运行make命令时故意出现的错误解析:

  1. 1. 安装gcc (gcclinux下的一个编译程序,是c程序的编译工具)
  2. 能上网: yum install gcc-c++
  3. 版本测试: gcc-v
  4. 2. 二次make
  5. 3. Jemalloc/jemalloc.h: 没有那个文件或目录
  6. 运行 make distclean 之后再make
  7. 4. Redis Test(可以不用执行)
  1. 如果make完成后继续执行 make install
  2. 查看默认安装目录:/usr/local/bin
  3. 拷贝配置文件(备用)
    1. cd /usr/local/bin
    2. ls -l
    3. # 在redis的解压目录下备份redis.conf
    4. mkdir myredis
    5. cp redis.conf myredis # 拷一个备份,养成良好的习惯,我们就修改这个文件
    6. # 修改配置保证可以后台应用
    7. vim redis.conf

    开始使用

    启动redis服务

  • cd /usr/local/bin
  • redis-server /opt/redis-5.0.7/redis.conf

    redis客户端连接

  • redis-cli -p 6379

  • ping
    • pong
  • set k1 helloworld

    • get k1

      ps显示系统当前进程信息

  • ps aux|grep redis

    退出连接(非关闭)

  • exit,ctrl+c

    关闭连接

  • shutdown

    指令/键

    select num

    命令切换数据库

  • select 7

不同的库可以存不同的数据

dbsize

查看当前数据库的key的数量

keys *

查看具体的key

exists key

判断某个key是否存在

move key db

将key从指定数据库中移除

flushdb

清空当前库

flushall

清空全部的库

(nil)

expire key 秒钟

为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除

ttl key

查看还有多少秒过期,-1 表示永不过期,-2 表示已过期

type key

查看你的key是什么类型

del key

删除key
del key1 key2 ...

append key "hello"

对不存在的key进行append,等同于set key "hello"
对已存在的字符串进行append,长度从5个字符增加到10个字符

strlen key

获取字符串的长度

incr key

使key + 1

decr key

使key - 1

incrby key 10

使key + 10

decrby key 10

使key - 10

getrange key 0 -1

获取指定区间范围内的值,类似between…and的关系,从零到负一表示全部

数据类型

image.png

String

  • String是redis最基本的类型
  • 一个key对应一个value
  • 一个redis中字符串value最多可以是512M
  • String类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象

  • set key value设置键值

  • setex key seconds value设置键值及过期时间,以秒为单位
    • setex aa 3 aa设置键为aa值为aa过期时间为3秒的数据
  • mset key1 value1 key2 value2 ...设置多个键值
    • mset a1 python a2 java a3 c设置键为’a1’值为’python’、键为’a2’值为’java’、键为’a3’值为’c’
  • append key value追加值
    • append 'a1' 'haha'向键为a1中追加值’ haha’
  • get key根据键获取值,如果不存在此键则返回nil
  • mget key1 key2 ...根据多个键获取多个值

    Hash

  • Redis hash 是一个键值对集合。

  • Redis hash 是一个String类型的field和value的映射表
  • hash特别适合用于存储对象。

  • hset key field value

    • hset user name itheima设置键 user的属性name为itheima
  • hkeys key获取指定键所有的属性
    • hkeys u2获取键u2的所有属性
    • image.png
  • hget u2 'name'获取键u2属性’name’的值
    • image.png
  • hmget key field1 field2 ...获取多个属性的值
    • hmget u2 name age
  • hvals key获取key的所有属性的值
  • hdel key field1 field2 ...删除整个hash键及值,使⽤del命令,删除属性,属性对应的值会被⼀起删除

    • hdel u2 age

      List

  • 列表的元素类型为string

  • 按照插⼊顺序排序
  • 可以添加一个元素到列表的头部(左边)或者尾部(右边)
  • 它的底层实际是个链表 !

  • lpush key value1 value2...在左侧插⼊数据

    • lpush a1 a b c从键为’a1’的列表左侧加⼊数据a 、 b 、c
  • rpush key value1 value2 ...在右侧插⼊数据
  • linsert key before或after 现有元素 新元素在指定元素的前或后插⼊新元素
    • linsert a1 before b 3在键为’a1’的列表中元素’b’前加⼊’3’
  • lrange key start stop
    • 返回列表⾥指定范围内的元素
    • start、stop为元素的下标索引
    • 索引从左侧开始,第⼀个元素为0
    • 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
    • lrange a1 0 -1获取键为’a1’的列表所有元素
  • lset key index value
    • 设定指定索引位置的元素值
    • 索引从左侧开始,第⼀个元素为0
    • 索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素
    • lset a 1 z修改键为’a1’的列表中下标为1的元素值为’z’
  • lrem key count value

    • 删除指定元素
    • 将列表中前count次出现的值为value的元素移除
    • count > 0: 从头往尾移除
    • count < 0: 从尾往头移除
    • count = 0: 移除所有
    • lrange a2 0 -1查看列表’py12’的所有元素

      Set

  • ⽆序集合

  • 元素为string类型
  • 元素具有唯⼀性,不重复
  • 说明:对于集合没有修改操作

  • sadd key member1 member2 ...添加元素

    • sadd a3 zhangsan sili wangwu
  • smembers key返回所有的元素
    • smembers a3
  • srem key删除指定元素

    • srem a3 wangwu删除键’a3’的集合中元素’wangwu’

      Zset

  • sorted set,有序集合

  • 元素为string类型
  • 元素具有唯⼀性,不重复
  • 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序
  • 说明:没有修改操作

  • zadd key score1 member1 score2 member2 ...添加

    • zadd a4 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan向键’a4’的集合中添加元素’lisi’、’wangwu’、’zhaoliu’、’zhangsan’,权重分别为4、5、6、3
  • zrange key start stop返回指定范围内的元素
    • start、stop为元素的下标索引
    • 索引从左侧开始,第⼀个元素为0
    • 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
  • zrangebyscore key min max返回score值在min和max之间的成员
    • zrangebyscore a4 5 6获取键’a4’的集合中权限值在5和6之间的成员
  • zscore key member返回成员member的score值
    • zscore a4 zhangsan获取键’a4’的集合中元素’zhangsan’的权重
  • zrem key member1 member2 ...删除指定元素
    • zrem a4 zhangsan删除集合’a4’中元素’zhangsan’
  • zremrangebyscore key min max删除权重在指定范围的元素
    • zremrangebyscore a4 5 6删除集合’a4’中权限在5、6之间的元素

      介绍

      默认16个数据库,类似数组下标从零开始,初始默认使用零号库

      为什么redis是单线程

      我们首先要明白,Redis很快!官方表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就 顺理成章地采用单线程的方案了!

      redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为 多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切 换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis 用 单个CPU 绑定一块内存 的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处 理这个事。在内存的情况下,这个方案就是最佳方案。 因为一次CPU上下文的切换大概在 1500ns 左右。从内存中读取 1MB 的连续数据,耗时大约为 250us, 假设1MB的数据由多个线程读取了1000次,那么就有1000次时间上下文的切换,那么就有1500ns * 1000 = 1500us ,我单线程的读完1MB数据才250us ,你光时间上下文的切换就用了1500us了,我还不 算你每次读一点数据 的时间

redis.conf

daemonize

A、redis.conf配置文件中daemonize守护线程,默认是NO。
B、daemonize是用来指定redis是否要用守护线程的方式启动。

daemonize 设置yes或者no区别

  • daemonize:yes
    • redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启 守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项 pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。
  • daemonize:no
    • 当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭 连接工具(putty,xshell等)都会导致redis进程退出。

image.png

databases 16

设置数据库数量

redis压力测试工具

Redis-benchmark是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能。
image.png
用法详见:https://blog.updown.world/articles/kuang/37%E3%80%81Redis%E7%B2%BE%E8%AE%B2.pdf

主从

image.png

  • ⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构
  • master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1
  • 通过主从配置可以实现读写分离
  • master和slave都是一个redis实例(redis服务)

    master配置

  • 修改/etc/redis/redis.conf文件

    • sudo vi redis.conf
    • bind 192.168.26.128
  • 重启redis服务

    • sudo service redis stop
    • redis-server redis.conf

      slave配置

  • 复制etc/redis/redis.conf文件

    • sudo cp redis.conf ./slave.conf
  • 修改redis/slave.conf文件
    • sudo vi slave.conf
  • 编辑内容

    1. bind 192.168.26.128
    2. slaveof 192.168.26.128 6379
    3. port 6378
  • sudo redis-server slave.conf

    查看主从关系

    redis-cli -h 192.168.26.128 info Replication
    image.png

    数据操作

  • 在master和slave分别执⾏info命令,查看输出信息 进入主客户端redis-cli -h 192.168.26.128 -p 6379

  • 进入从的客户端redis-cli -h 192.168.26.128 -p 6378
  • 在master上写数据set aa aaimage.png
  • 在slave上读数据get aa

    sentinel(哨兵)

    介绍

  • Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移

image.png

功能

Sentinel的主要功能包括主节点存活检测、主从运行情况检测、自动故障转移(failover)、主从切换。Redis的Sentinel最小配置是一主一从。 Redis的Sentinel系统可以用来管理多个Redis服务器,该系统可以执行以下四个任务:

  • 监控Sentinel会不断的检查主服务器和从服务器是否正常运行。
  • 通知当被监控的某个Redis服务器出现问题,Sentinel通过API脚本向管理员或者其他的应用程序发送通知。
  • 自动故障转移当主节点不能正常工作时,Sentinel会开始一次自动的故障转移操作,它会将与失效主节点是主从关系的其中一个从节点升级为新的主节点, 并且将其他的从节点指向新的主节点。
  • 配置提供者在Redis Sentinel模式下,客户端应用在初始化时连接的是Sentinel节点集合,从中获取主节点的信息。
  • Sentinel负责监控集群中的所有主、从Redis
  • 当发现主故障时,Sentinel会在所有的从中选一个成为新的主,并且会把其余的从变为新主的从。
  • 那台有问题的旧主也会变为新主的从,也就是说当旧的主即使恢复时,并不会恢复原来的主身份,而是作为新主的一个从。
  • 在Redis高可用架构中,Sentinel往往不是只有一个,而是有3个或者以上。目的是为了让其更加可靠

    主客观失效

  • 主观失效SDOWN(subjectively down),直接翻译的为”主观”失效,即当前sentinel实例认为某个redis服务为”不可用”状态.

  • 客观失效ODOWN(objectively down),直接翻译为”客观”失效,即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启failover

    配置

    架构
    1. master 127.0.0.1:7000
    2. slave01 127.0.0.1:7001
    3. slave02 127.0.0.1:7002
    1. master 127.0.0.1:27000 sentinel01
    2. slave01 127.0.0.1:27001 sentinel02
    3. slave02 127.0.0.1:27002 sentinel03
    sentinel配置
    ```

    端口

    port 27000

是否后台启动

daemonize yes

pid文件路径

pidfile /var/run/redis-sentinel.pid

日志文件路径

logfile “/var/log/redis/sentinel.log”

rdb数据备份的目录

dir /var/lib/redis

定义Redis主的别名, IP, 端口,这里的2指的是需要至少2个Sentinel认为主Redis挂了才最终会采取下一步行为

sentinel monitor mymaster 127.0.0.1 7000 2

如果mymaster 30秒内没有响应,则认为其主观失效

sentinel down-after-milliseconds mymaster 30000

如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。

sentinel parallel-syncs mymaster 1

该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒

sentinel failover-timeout mymaster 180000

不允许使用SENTINEL SET设置notification-script和client-reconfig-script

sentinel deny-scripts-reconfig yes

  1. <a name="pCh2r"></a>
  2. ##### 脚本配置
  3. - notification-script和client-reconfig-script 的配置含义如下:

sentinel notification-script

通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。

配置示例:

sentinel notification-script mymaster /var/redis/notify.sh

sentinel client-reconfig-script
当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。以下参数将会在调用脚本时传给脚本:

目前总是“failover”, 是“leader”或者“observer”中的一个。 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的。这个脚本应该是通用的,能被多次调用,不是针对性的。

配置示例: sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

  1. <a name="Jn1Og"></a>
  2. #### 启动Sentinel
  3. 启动的顺序:主Redis --> 从Redis --> Sentinel1/2/3<br />启动后去查看下sentinel的配置文件,里面有自动写入的主从信息
  4. <a name="Y43wV"></a>
  5. #### 连接哨兵 查看信息

redis-ci -p 27000 sentinel master mymaster # 查看被监控的mymaster的主节点信息 sentinel slaves mymaster # 查看被监控的mymaster的从节点信息 sentinel sentinels mymaster # 查看被监控的mymaster的其他sentinel信息 ```

测试

详情:https://blog.updown.world/articles/python/pythonbook9/redis/da-jian-ji-qun.html