简介
Redis 是 C 语言开发的一个开源的(遵从 BSD 协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。
它是一种 NoSQL(not-only sql,泛指非关系型数据库)的数据库
- 性能优秀,数据在内存中,读写速度非常快,支持并发 10W QPS。
- 单进程单线程,是线程安全的,采用 IO 多路复用机制。
- 丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
- 支持数据持久化。
- 可以将内存中数据保存在磁盘中,重启时加载。
- 主从复制,哨兵,高可用。
- 可以用作分布式锁。
- 可以作为消息中间件使用,支持发布订阅。
安装
五种数据类型

命令
启动/停止
启动:
#进入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>

主数据库的 ip 端口
replicaof 127.0.0.1 6379
主库密码
masterauth 123456
填写主数据库的ip和端口
第二个填密码
连不上->防火墙添加端口
firewall-cmd --add-port=6379/tcp --permanent
哨兵模式
哨兵模式概述
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

这里的哨兵有两个作用:
- 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
- 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。
用文字描述一下故障切换(failover)的过程。假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。
Redis配置哨兵模式
配置3个哨兵和1主2从的Redis服务器来演示这个过程。


首先配置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个哨兵的服务进程。
哨兵模式的其他配置项

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 服务,然后在重新搭建集群环境