redis的下载安装

准备相关依赖

yum install gcc

下载安装包

# 切换到存放安装包到目录
cd /usr/local # 下载安装包
wget http://download.redis.io/releases/redis-4.0.10.tar.gz # 等待下载完成

解压

# 默认解压是当前目录
tar -zxvf redis-4.0.10.tar.gz # 解压到制定目录
tar -zxvf redis-4.0.10.tar.gz /tmp # 等待解压完成

编译安装

# 切换到redis源码目录
cd redis-4.0.10 # 编译源文件
make && make install # 编译好后,/usr/local/redis-4.0.10/src/下面有编译好的redis指令

配置文件

# 在/etc下创建存放redis配置的目录
mkdir /etc/redis-conf # 创建配置文件
vim /etc/redis-conf/redis-6379.conf # 相关配置

编辑配置文件

port 6379                         # 运行在6379的redis数据库实例
daemonize yes # 后台运行redis
pidfile /data/6379/redis.pid # 存放redis pid的文件
loglevel notice # 日志等级
logfile "/data/6379/redis.log" # 指定redis日志文件的生成目录
dir /data/6379 # 指定redis数据文件夹的目录
protected-mode yes # 安全模式
requirepass qiuxiang # 设置redis的密码 """
注意:1./data/6379/这个目录要先创建,不然会报错
"""

redis的启动

启动redis服务

# 指定用哪个配置来启动
redis-server /etc/redis-conf/redis-6379.conf

启动redis客户端

# 根据服务配置的端口指定端口,有密码加 -a password
redis-cli -p6370

redis的基本数据类型及使用

字符串strings

# 设置key   set key value
127.0.0.1:6379> set name 'aaa'
OK # 获取value get key
127.0.0.1:6379> get name    
"tt" # 覆盖key set key value
127.0.0.1:6379> set name 'bbb'  #覆盖key
OK # 获取value get key
127.0.0.1:6379> get name   
"bbb" # 追加key的string
127.0.0.1:6379> append name 'AAA'   
(integer) 6 # 获取value
127.0.0.1:6379> get name  
"bbbAAA" # 设置多个键值对 mset key1 value1 key2 value2
127.0.0.1:6379> mset name1 'aaa' name2 'bbb'    
OK 127.0.0.1:6379> get name1   
"alex"
127.0.0.1:6379> get name2    
"xiaopeiqi" # 找到所有key keys partten
127.0.0.1:6379> keys *     
1) "name"
2) "name1"
3) "name2" # 获取多个value
127.0.0.1:6379> mget name1 name2 name
1) "aaa"
2) "bbb"
3) "bbbAAA" # 删除key
127.0.0.1:6379> del name        
(integer) 1 # 获取不存在的value,为nil
127.0.0.1:6379> get name        
(nil) # string类型实际上不仅仅包括字符串类型,还包括整型,浮点型。redis可对整个字符串或字符串一部分进行操作,而对于整型/浮点型可进行自增、自减操作。
127.0.0.1:6379> set num 10    
OK 127.0.0.1:6379> get num
"10" # 给num string 加一 INCR 命令将字符串值解析成整型,将其加一,最后将结果保存为新的字符串值,可以用作计数器
127.0.0.1:6379> incr num    
(integer) 11 127.0.0.1:6379> get num  
"11" # 递减1
127.0.0.1:6379> decr num      
(integer) 10 # 递减1
127.0.0.1:6379> decr num    
(integer) 9
127.0.0.1:6379> get num
"9" # 待更新

列表lists

# 从左边插入lpush
127.0.0.1:6379> lpush name3 'aaa' 'bbb' 'ccc'
(integer) 3 # 查看name3中的全部数据
127.0.0.1:6379> lrange name3 0 -1
1) "ccc"
2) "bbb"
3) "aaa" # 查看name3的长度
llen name3 # 从右边插入rpush
127.0.0.1:6379> rpush name4 'AAA' 'BBB' 'CCC'
(integer) 3 # 查看name4中的全部数据
127.0.0.1:6379> lrange name4 0 -1
1) "AAA"
2) "BBB"
3) "CCC" # key存在则添加 dsb元素,key不存在则不作处理
lpushx duilie2 'dsb' # 截取队列的值,从索引0取到2,删除其余的元素
ltrim duilie 0 2 # 删除左边的第一个
lpop # 删除右边的第一个
rpop # 待更新

集合sets

# 添加集合,有三个元素,不加引号就当作字符串处理
127.0.0.1:6379> sadd age 18 19 20
(integer) 3 # 查看集合age中的数据
127.0.0.1:6379> smembers age
1) "18"
2) "19"
3) "20" # 删除age中的某个成员
127.0.0.1:6379> srem age 20
(integer) 1
127.0.0.1:6379> smembers age
1) "18"
2) "19" # 判断该成员是否是集合age中的信息,不存在返回0,存在返回1
127.0.0.1:6379> sismember age 220
(integer) 0 # 再把该成员添加到age集合中,后查看
127.0.0.1:6379> sadd age 220
(integer) 1
127.0.0.1:6379> smembers age
1) "18"
2) "19"
3) "220" # 添加新集合gender
127.0.0.1:6379> sadd gender man women 220
(integer) 2
127.0.0.1:6379> smembers gender
1) "women"
2) "man"
3) "220" # 找出集合gender中有的,而age中没有的元素
127.0.0.1:6379> sdiff gender age
1) "women"
2) "man" # 找出age中有,而gender没有的元素
127.0.0.1:6379> sdiff age gender
1) "18"
2) "19" # 找出age和gender的交集
127.0.0.1:6379> sinter age gender
1) "220" # 找出age和gender的并集
127.0.0.1:6379> sunion age gender
1) "women"
2) "220"
3) "19"
4) "18"
5) "man"

哈希hash

redis hash是一个string类型的field和value的映射表

语法  hset key field value  

# 插入一条hash数据
127.0.0.1:6379> hset user:paul age 18
(integer) 1 # 添加一个school内容
127.0.0.1:6379> hset name:paul school qinghua
(integer) 1 # 获取name:paul的学校
127.0.0.1:6379> hget name:paul school
"qinghua" # 获取多对name:paul的 值
127.0.0.1:6379> hmget name:paul gender school
1) "man"
2) "qinghua" # 获取name:paul的所有key
127.0.0.1:6379> hkeys name:paul
1) "school"
2) "gender"
3) "age" # 获取name:paul的所有vals
127.0.0.1:6379> hvals name:paul
1) "qinghua"
2) "man"
3) "18" # 获取name:paul的多个值
127.0.0.1:6379> hmget name:paul age school
1) "18"
2) "qinghua" # 判断name:paul是否有age,不存在返回0,存在返回1
127.0.0.1:6379> hexists name:paul age
(integer) 1 # 新增一个字段
127.0.0.1:6379> hset name:aaa age 220
(integer) 1
127.0.0.1:6379> hvals name:aaa
1) "220" # 待更新

有序集合sorted sets

# 待更新

redis持久化存储

持久化的功能,这个功能可以将redis在内存中的的状态保存到硬盘中,它可以手动执行。也可以在redis.conf中配置,定期执行。

Redis DataBase

RDB持久化产生的RDB文件是一个压缩的二进制文件,这个文件被保存在硬盘中,redis可以通过这个文件还原数据库当时的状态。

其原理是:在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot),它速度快,适合做备份,主从复制就是基于RDB持久化功能实现

# 配置
port 6379
daemonize yes
pidfile /data/6379/redis.pid
loglevel notice
logfile "/data/6379/redis.log"
dir /data/6379
protected-mode yes
requirepass haohaio
dbfilename dbmp.rdb # 持久化存储的文件名 save 900 1 # rdb机制 每900s 内存种有一个修改记录就自动存储
save 300 10 # 每 300s 10个修改记录
save 60 10000 # 每60s 10000修个记录

Append Only File

AOF(append-only log file):记录服务器执行的所有变更操作命令(例如set del等),并在服务器启动时,通过重新执行这些命令来还原数据集。AOF 文件中的命令全部以redis协议的格式保存,新命令追加到文件末尾。

优点:最大程度保证数据不丢失 (比RDB要好,因为RDB有可能丢失数据)

缺点:日志记录非常大

# 配置
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename dbmp.rdb
requirepass redhat
save 900 1
save 300 10
save 60 10000 appendonly yes
appendfsync always """
appendfsync always 总是修改类的操作 appendfsync everysec 每秒做一次持久化 appendfsync no 依赖于系统自带的缓存大小机制
"""

AOF VS RDB

RDB:
"""
优点: 1.适合备份 2.恢复大数据集时速度比AOF快
缺点: 1.手动save 2.耗时长 3.备份时宕机数据易丢失
""" AOL:
"""
优点: 1.追加到日志文件后面 2.数据不易丢失
缺点: 1.速度较慢 2.文件体积较大

redis主从同步

准备

# 准备三个redis库到配置文件
redis-6379.conf
redis-6380.conf
redis-6381.conf # 配置三个配置文件的信息,同时在redis-6380.conf/redis-6381.conf添加配置,申明是6379的从库
slaveof 127.0.0.1 6379 # 在data中创建三个文件夹6379/,6380/,6381/

启动三个redis服务

# 启动这三个redis服务
redis-server -p 6379 /opt/redis-conf/redis-6379.conf
redis-server -p 6380 /opt/redis-conf/redis-6380.conf
redis-server -p 6381 /opt/redis-conf/redis-6381.conf

启动redis客户端

# 启动6379 redis的客户端
redis-cli -p 6379

插入数据

# 在启动的这个redis-cli中插入数据
set name 'aaa' # 退出
exit # 登录其他两个redis-cli验证

检测同步是否成功

# 登录6380客户端
redis-cli -p 6380 # 检测数据是否存在
keys * # 退出6380,登录6381检测

故障时身份切换

# kill 6379进程,模拟主库挂掉
kill -9 进程id # 检测

更改主库信息

# 登录6380
redis-cli -p 6380 # 更改slaveof信息
slaveof no one # 退出6380
exit

更改从库信息

# 登录6381
redis-cli -p 6381 # 更改从库信息
slave no one
slave 127.0.0.1 6380

查看主从库信息

# 查看6380库的信息
redis-cli -p 6380 info replication # 查看6381库的信息
redis-cli -p 6381 info replication #

redis-sentinel

准备

# redis库的准备,同上,准备三个独立的redis库,和配置文件

配置

# redis库配置同上

# 配置三个哨兵
cd /opt/redis_conf
vim redis-26380.conf
vim redis-26381.conf
vim redis-26382.conf # 写入三个配置文件
port 26379 # 哨兵的端口
dir /var/redis/data/
logfile "26379.log"
sentinel monitor mymaster 127.0.0.1 6379 2 # 监听主库的端口
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
daemonize yes

启动哨兵

[root@qishi666 redis_conf]# redis-sentinel redis-26379.conf
[root@qishi666 redis_conf]# redis-sentinel redis-26380.conf
[root@qishi666 redis_conf]# redis-sentinel redis-26381.conf

检查哨兵是否成功通信

redis-cli -p 26379 info sentinel

常见问题

  1. 如果哨兵没有正常启动,那么就在哨兵的配置文件中的ip信息检验
  2. 如果哨兵没有正常通信,那么就从主从同步开始重新配置

redis集群

准备节点

vim redis-7000.conf
vim redis-7001.conf
vim redis-7002.conf
vim redis-7003.conf
vim redis-7004.conf
vim redis-7005.conf

写入配置

port 7000
daemonize yes
dir "/opt/redis/data"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes # 开始集群模式
cluster-config-file nodes-7000.conf # 集群内部的配置文件 # 不同配置文件的端口不同

启动节点

redis-server redis-7000.conf
redis-server redis-7001.conf
redis-server redis-7002.conf
redis-server redis-7003.conf
redis-server redis-7004.conf
redis-server redis-7005.conf

检查

# 随便登录一个端口,写入数据
(error)CLUSTERDOWN Hash slot not served # 报错,没有hash槽

准备ruby环境

# 下载ruby
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz # 安装ruby
tar -xvf ruby-2.3.1.tar.gz # 释放源
./configure --prefix=/opt/ruby/ # 编译
make && make install # 配置环境变量
PATH=$PATH:/opt/ruby/bin # ruby准备完成

安装ruby gem管理工具

# 下载
wget http://rubygems.org/downloads/redis-3.3.0.gem # 安装
gem install -l redis-3.3.0.gem #查看gem有哪些包
gem list -- check redis gem # 安装redis-trib.rb命令
root@yugo /opt/redis/src 18:38:13]#cp /opt/redis/src/redis-trib.rb /usr/local/bin/

一键开始redis-cluster集群

redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

# 集群完成

查看集群状态

redis-cli -p 7000 cluster info  

redis-cli -p 7000 cluster nodes  #等同于查看nodes-7000.conf文件节点信息

# 集群主节点状态
redis-cli -p 7000 cluster nodes | grep master # 集群从节点状态
redis-cli -p 7000 cluster nodes | grep slave

测试写入数据

#  登录集群必须使用redis-cli -c -p 7000			必须加上-c参数

参考文档

http://doc.redisfans.com/

最新文章

  1. 理解Docker(5):Docker 网络
  2. js 定义方法的集中方式
  3. FFmpeg-20160506-snapshot-bin
  4. java操作MySQL数据库(插入、删除、修改、查询、获取所有行数)
  5. 对CLR基本原理概念&垃圾回收机制的简单理解
  6. Layout Resource官方教程(4)<include>与<merge>
  7. Dorado浏览器调试
  8. Android组件间的数据传输
  9. java实现文件编码监测(转)
  10. CSS中的字体属性和文本属性
  11. ACL技术总结
  12. zabbix3.0对tcp连接数和状态的监控优化
  13. SVN 多分支管理
  14. Nginx多进程高并发、低时延、高可靠机制缓存代理中的应用
  15. httpModules 不起作用 modules 不起作用 血泪经验
  16. windows installer 应用变换时的错误.请验证指定的变换路径是否有
  17. CTF web题型解题技巧
  18. IO多路复用之epoll(二)
  19. 六十四 asyncio
  20. 5.14日学习内容1:jquery表单相关知识

热门文章

  1. Keepalived 介绍 原理
  2. Eclipse 无法引用到Maven 解决方法
  3. SpringBoot基础篇-SpringBoot快速入门
  4. Educational Codeforces Round 32 E 二分
  5. Python中verbaim标签使用详解
  6. 使用JDK工具进行Java服务器应用程序故障排除
  7. PostgreSQL内核学习笔记十一(索引)
  8. Java Web 笔记(3)
  9. Python学习笔记———递归遍历多层目录
  10. exp导出含有双引号的表