redis

redis

_

简介

Redis 是 C 语言开发的一个开源的(遵从 BSD 协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。

它是一种 NoSQL(not-only sql,泛指非关系型数据库)的数据库

  • 性能优秀,数据在内存中,读写速度非常快,支持并发 10W QPS。
  • 单进程单线程,是线程安全的,采用 IO 多路复用机制。
  • 丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
  • 支持数据持久化。
  • 可以将内存中数据保存在磁盘中,重启时加载。
  • 主从复制,哨兵,高可用。
  • 可以用作分布式锁。
  • 可以作为消息中间件使用,支持发布订阅。

安装

安装

五种数据类型

640.png

命令

启动/停止

启动:

#进入bin目录
./redis-server ../etc/redis.conf

连接:
redis-cli -h 指定ip -p 指定端口 -a 指定密码 --raw 解决中文乱码

./redis-cli --raw 

退出:exit

停止

./redis-cli shutdown 

String

操作 命令
设置值 set key value
取值 get key
删除 del key
不存在在设置 setnx key value
替换字符串 setrange key offset value(将字符串第几个替换为什么)
批量设置值 mset key1 value key2 value
获取值在重新设置 getset key newvalue
获取字符下标几到几的值
批量获取 mget key1 key2
将储存的值加上1 incr key
将储存的值减去1 decr key
加上整数amount incrby key amout
减去整数amount decrby key amout
加上浮点数amount字符串二进制 incrbybyfloat key amout
将值追加到key当前储存值的末尾 append key v
获取下标start到end的字符串 getrange key start end
将字符串看做二进制位串,并将位串中偏移量为offset的二进制位的值 setrange key offset v
将字符串看做是二进制位串值为1的二进制位的数量,如果给定了可选的start偏移量和end偏移量,那么只对偏移量指定范围的二进制位进行统计 getbit key offset
对一个或多个二进制位串进行 并and,或 or,异或XOR,非NOT 在内的任意一种安位运算符操作(bitwise operation),并将计算的结果放到dest -key里面 bitop operation dest-key key-name [key-name …]

hash

说明 命令
设置 hset key field value
获取 hget key field
删除 hdel key field
获取多个值 hmget hkey key…
为多个key设置值 hmset hkey key v…
删除多个值并返回 hdel hkey key…
返回总数量 hlen hkey
设置集合值,不存在就设置,存在就不设置 hsetnx key field value
检查key是否存在在散列中 hexists hkey key
获取散列中所有key hkeys hkey
获取散列中所有值 hvals hkey
获取散列 hgetall hkey
为key的值上加上整数increment hincrby hkey key increment
为key的值上加上浮点数increment hincrbyfloat hkey key increment

list

说明 命令
从头部添加元素 lpush listkey value
从尾部添加元素 rpush listkey value
查看队列(从头取到尾) lrange listjey 0 -1
插入元素 linsert [队列] before [集合的元素] [插入的元素]
替换下标元素 lset [队列] 下标 [value]
删除元素,返回删除的个数 lrem [队列] [移除的个数] [value]
保留指定key范围的数据 ltrim [队列] [几] -[几]
从队列头部删除数据并返回value lpop listkey
从队列尾部删除数据并返回value rpop listkey
移除列表的最后一个元素,并将该元素添加到另一个列表并返回 rpoplpush [listkey] [listkey]
输入下标返回对应的value lindex [队列] [下标]
返回元素的个数 llen listkey

set

说明 命令
向集合添加一个或多个成员 sadd kye [成员1] [成员2]
获取集合的成员数 scard setkey
返回集合中所有成员 smembers key
移除一个或多个key srem [成员1] [成员2]
检查元素item是否在集合中 sismember key item
随机返回cout个元素 cout为正整数 随机元素不重复 相反可能会出现重复 srandmember key cout
随机的移除一个元素 并返回已删除的元素 spop key
如果key1中包含item 移除key1中的item 添加到key2中,成功返回1 失败返回0 smove key1 key2 item
将存在于key集合但是不存在key1…集合的其他元素 放到newkey里面(咬掉一口剩下的) 差运算 sdiffstore newkey key key1…
返回所有集合的交集(返回我们都有的的) 交运算 sinter key…
返回多个集合的交集生成集合newkey 交运算 sinterstore newkey key…
(返回我们不重复的所有元素 ) 并运算 sunion key…
结果放到newkey中 并运算 sunion newkey key…

zset

说明 命令
添加多个 zadd key score member …
移除多个 zerm key memer…
返回所有成员 zcard key
将member成员的分值加上increment zincrby key incremnet member
返回分值在 min和max中间的排名 zcount key min max
返回成员member在集合中的排名 zrank key member
返回member的分值 zscore key member
返回 介于两者之间的成员 zrange key start stop

redis 高级命令

说明 命令
模糊查询 keys * ,keys list*
是否存在指定的key exists
设置某个key 过期时间,使用ttl查看过期时间 expire key [时间] (秒)
取消过期时间 persist key
选择数据库 0-15 (一共16个数据库) 默认进入的是0 select index
将当前数据的的key移动到其他数据库 move [key] [数据库下标]
随机返回数据库里的一个key randomkey
重命名key rename [key] [新key名]
打印命令(控制台输出) echo message
查看当前数据库key数量 dbsize
获取数据库信息 info
实时传储收到的请求(返回相关的配置信息) config get [配置]( redis.conf的配置项 * 匹配所有)
清空当前数据库信息 flushdb
清空所有数据库信息 flushall

redis安全

密码修改
在redis.conf中找到
#requirepass foobared
requirepass ***

重启服务
pkill redis-server
再次进入:redis.cli
没有权限
auth [密码]
输入密码则成功进入
每次进入都需要输入密码
更简单的方式:直接登录的时候输入密码:
redis-cli -a [密码]

redis主从复制

配置从库文件

在配置文件redis.conf中打选项:
replicaof <masterip> <masterport>
配置了密码才打开这个
masterauth <master-password>

redis01.png

主数据库的 ip 端口
replicaof 127.0.0.1 6379

主库密码 
masterauth 123456

填写主数据库的ip和端口
第二个填密码

连不上->防火墙添加端口

firewall-cmd --add-port=6379/tcp --permanent

哨兵模式

哨兵模式概述

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例

clipboard.png

这里的哨兵有两个作用:

  • 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
  • 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。
用文字描述一下故障切换(failover)的过程。假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。

Redis配置哨兵模式

配置3个哨兵和1主2从的Redis服务器来演示这个过程。
redis03.png
redis04.png

首先配置Redis的主从服务器,修改redis.conf文件如下

## 使得Redis服务器可以跨网络访问
bind 0.0.0.0
# 设置密码
requirepass "123456"
# 指定主服务器,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
slaveof 192.168.11.128 6379
# 主服务器密码,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
masterauth 123456

上述内容主要是配置Redis服务器,从服务器比主服务器多一个slaveof的配置和密码。
配置3个哨兵,每个哨兵的配置都是一样的。在Redis安装目录下有一个sentinel.conf文件,copy一份进行修改


# 禁止保护模式
protected-mode no
# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.11.128代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 192.168.11.128 6379 2
# sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456

上述关闭了保护模式,便于测试。
有了上述的修改,我们可以进入Redis的安装目录的src目录,通过下面的命令启动服务器和哨兵
(./redis-sentinel在安装目录bin,移动一下)

# 启动Redis服务器进程
./redis-server ../redis.conf
# 启动哨兵进程  
./redis-sentinel ../sentinel.conf

注意启动的顺序。首先是主机(192.168.11.128)的Redis服务进程,然后启动从机的服务进程,最后启动3个哨兵的服务进程

哨兵模式的其他配置项

redis05.png
sentinel down-after-milliseconds配置项只是一个哨兵在超过规定时间依旧没有得到响应后,会自己认为主机不可用。对于其他哨兵而言,并不是这样认为。哨兵会记录这个消息,当拥有认为主观下线的哨兵达到sentinel monitor所配置的数量时,就会发起一次投票,进行failover,此时哨兵会重写Redis的哨兵配置文件,以适应新场景的需要。

redis 持久化机制

1、快照模式(默认)[redis.conf]
snapshotting
save 900 1 #900秒类如果超过1个key被修改 则发起快照保存
save 300 10 #300秒类如果超过10个key被修改 则发起快照保存
save 60 10000 #60秒类如果超过10000个key被修改 则发起快照保存

2、append-only file (aof)
aof设置
appendonly yes #启动aof持久化有三种方式
#appendfsync always //收到命令就立即写入磁盘,效率最慢,但是保证完全的持久化(工作中用这种)
#appendsync everysec //每秒钟写入磁盘一次 性能和持久折中
#appendsync no //完全依赖os,性能最好,持久没保证

发布与订阅

subscribe [频道] 订阅一个频道(频道发布信息后能收到)
publish [频道] [发布类容] 发布一个频道 推送类容

redis 集群搭建

**条件: 至少需要三个 master **

一、创建一个文件夹redis-cluster 然后在下面创建六个文件夹

mkdir -p /usr/local/redis-cluster
mkdis 7001
mkdis 7002
mkdis 7003
mkdis 7004
mkdis 7005
mkdis 7006

二、把之前的redis.conf 分别copy到 创建的 700(*) 下,进行修改文件类容

#守护进程
daemonize yes
#端口
port 700*
bind 本机ip (必须绑定本机ip)
dir /usr/local/redis-cluster/700*/
#开启集群模式  开始玩耍
luster-enabled yes 
cluster-config-file nodes700*.conf
cluster-node-timeout 5000
appendonly yes

三、修改文件后分别copy到个各文件夹下,注意每个文件都要改端口号,并且nides文件也不能相同

四、由于redis集群需要使用ruby命令,所以需要安装ruby

yum install ruby
yum install rubygams
#安装redis 和ruby的接口
gem install redis 

五、分别启动6个redis实例 然后检查是否启动成功

/usr/local/redis/bin/redis-server /usr/local/redis-cluster/700*/redis.conf
# 查看是否启动成功
ps -ef | grep redis

六、首先到redis-6.2.3安装目录下 然后执行 redis-trib.rb命令。

cd /usr/local/redis-6.2.3/src

./redis-trib.rb create --replicas 1 192.168.1.8:7001 192.168.1.8:7002 192.168.1.8:7003 192.168.1.8:7004 192.168.1.8:7005 192.168.1.8:7006

<–replicas 1> 配置比例 主节点 3个从节点3个 比例为 1
主节点6 从节点3 比例为 2
主节点 6 从节点 12 比例为 0.5

#查看
netstat -tunpl | grep redis

七、到这步集群就创建成功了 ! 接下来进行验证

1.连接任意一个客服端即可

/usr/local/redis/bin/redis-cli -c -h -p (-c 表示集群模式,-h 指定ip -p 指定端口号)
如 : /usr/local/redis/bin/redis-cli -c -h 192.168.1.8 -p 700*

2 进行验证

cluster info :查看集群信息
clister nodes :查看节点列表

3 进行数据操作验证

4关闭集群需要逐个关闭,使用命令:
/usr/local/redis/bin/redis-cli -c -h 192.168.1.8 -p 700* shutdown

八 、提示:当集群出现无法启动时删除临时的数据文件,再次重新启动每一个redis 服务,然后在重新搭建集群环境

redis安装 2021-06-03
go 下载、安装与环境配置 2021-07-19

评论区