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
常见问题
- 如果哨兵没有正常启动,那么就在哨兵的配置文件中的ip信息检验
- 如果哨兵没有正常通信,那么就从主从同步开始重新配置
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/
来源:https://www.cnblogs.com/oden/p/10677613.html