redis实战

介绍

redis:缓存数据库

速度快,数据全放在内存中,支持多种数据结构,string list hash set, storted set(有序集合型)

持久化

主从复制

支持过期时间

支持事物

消息订阅

支持虚拟内存

 

运用场景:

数据缓存 提高访问性能

会话缓存 保存web会话信息 seseion cache

排行榜 计数器 nginx+lua+redis 计数器进行IP自动封禁

消息队列 构建实时消息系统,聊天,群聊

 

yum安装

yum install epel-release  -y  安装epel扩展源

yum install redis -y 安装redis

systemctl start redis

redis-cli

 

安装

源码包安装

cd cd /etc/yum.repos.d/

rz  epel.repo

 mkdir /data && cd /data

tar xf redis-5.0.5.tar.gz

yum install gcc* -y

cd redis-5.0.5/

make MALLOC=libc

mkdir /data/redis6379

cp redis.conf /data/redis6379/

cp src/redis-server /data/redis6379/

cd /data/redis6379/

grep '^[^$|#]' redis.conf > 2

mv redis.conf redis.conf.bak

mv 2 redis.conf

bind 192.168.81.20 绑定主机IP

daemonize yes 后台启动

appendonly yes  二进制日志开关 记录数据变化

logfile “redis.log” 指定日志文件

dbfilename dump.rdb  持久化数据文件

 

服务启动

./redis-server ./redis.conf &

https://www.cnblogs.com/bug1024/p/8989649.html  搭建redis常见错误参考

拷贝命令

cd /data/redis-5.0.5/src

cp redis-cli /usr/bin/

redis-cli --help

192.168.81.20:6379> set foo ghj 创建键值对

192.168.81.20:6379> get foo 获取value

192.168.81.20:6379> keys * 获取所有的key

192.168.81.20:6379> SHUTDOWN 关闭redis服务

 

redis保护模式

protected-mode yes

requirepass root 设置验证密码

[root@node1 ~]# redis-cli -h 192.168.81.20

192.168.81.20:6379> auth root  认证

192.168.81.20:6379> set name lwb

192.168.81.20:6379> get name

192.168.81.20:6379> CONFIG GET * 查看配置

192.168.81.20:6379> CONFIG GET loglevel

192.168.81.20:6379> CONFIG SET loglevel "notice" 变更当前运行配置

 

redis数据存储 内存  ---->  硬盘  数据文件.rdb  更新日志.aof(二进制文件)

                   持久化

aof记录写的命令

 

持久化策略:

databases 16

always-show-logo yes

save 900 1

    900秒内有一次改动 进行保存

save 300 10

    300秒内有10次改动 保存

save 60 10000

60秒内有1000次改动 保存到硬盘

 

rdbcompression yes 启用压缩

 

appendfsync everysec  每秒保存数据  no: 30秒同步一次将缓存写到磁盘  always:每次更新操作调用fsync将数据写到磁盘 everysec:每一秒同步一次

 

 

redis操作:

string

192.168.81.20:6379> type name  一个键最大能保存512M

192.168.81.20:6379> append name 123 最加

192.168.81.20:6379> mset name lwb foo oldboy 同时设置

192.168.81.20:6379> MGET name foo 同时取

192.168.81.20:6379> STRLEN name value长度

integer

192.168.81.20:6379> set age 12

192.168.81.20:6379> INCR age 整数加1 计数器使用

192.168.81.20:6379> decr age 1

192.168.81.20:6379> exists name 检查数据是否存在

192.168.81.20:6379> INCRBY age 10 每次加10

192.168.81.20:6379> DECRBY age 10 每次减10

 

hash 一个hash用于存储多个键值对

192.168.81.20:6379> HSET user:1 name lwb

192.168.81.20:6379> type user:1

192.168.81.20:6379> HSET user:1 age 22

192.168.81.20:6379> HSET user:1 sex male

192.168.81.20:6379> hgetall user:1  获取hash的所有键值对

192.168.81.20:6379> HGET user:1 age 获取单个键值对

192.168.81.20:6379> HMGET user:1 name age 查询多个键值对

192.168.81.20:6379> del foo 删除键值对

192.168.81.20:6379> HDEL user:1 age 删除hash的单个键值对

192.168.81.20:6379> HSET user:1 age 22

192.168.81.20:6379> HINCRBY user:1 age 5 hash的键值对增量

list

192.168.81.20:6379> LPUSH list1 bmw benz totato honda  创建list1列表

192.168.81.20:6379> TYPE list1

192.168.81.20:6379> LRANGE list1 0 10  取第1到第10的列表数

192.168.81.20:6379> LPUSH list1 volvo 插在列表左边

192.168.81.20:6379> RPUSH list1 byd 插在列表右边

192.168.81.20:6379> RPOP list1 移除列表最右边的并输出打印

192.168.81.20:6379> LPOP list1 移除列表最左边的并输出打印

192.168.81.20:6379> LLEN list1 列表的长度

192.168.81.20:6379> LREM list1 1 volvo 删除左边第一个volvo

192.168.81.20:6379> LRANGE list1 0 -1 获取列表所有的数据

192.168.81.20:6379> LSET list1 0 HONDA 设置左边第1个下标的值

192.168.81.20:6379> LINDEX list1 1 列表第2个索引值

192.168.81.20:6379> LINSERT list1 after benz mashaladi benz后面插入mashaladi

set, sort set 的操作看以前的文档

 

 

高级运用

发布订阅

终端1

192.168.81.20:6379> SUBSCRIBE CCTV1  订阅频道

终端2

192.168.81.20:6379> SUBSCRIBE CCTV1 订阅相同的频道

终端3 发布消息

192.168.81.20:6379> PUBLISH  CCTV1  "hello this is sz"  CCTV1频道上发布消息

 

事物

192.168.81.20:6379> zadd salary 3000 lwb 5000 oldboy

192.168.81.20:6379> MULTI  开启一个事物

192.168.81.20:6379> ZINCRBY salary 1000 lwb

192.168.81.20:6379> ZINCRBY salary -1000 oldboy

192.168.81.20:6379> exec 执行事物内的命令

 

服务器命令

192.168.81.20:6379> info  查看服务器情况

192.168.81.20:6379> client list  查看客户端

192.168.81.20:6379> save 立刻保存数据到磁盘

192.168.81.20:6379> monitor 监控客户端的操作

 

 

慢日志查询

redis.conf

slowlog-log-slower-than 10000 超过10000毫秒的查询操作定义为慢查询

slowlog-max-len 128 最多保存128条慢查询记录

192.168.81.20:6379> CONFIG GET slow*

 

save的操作

redis.conf

appendonly no 关闭持久化

192.168.81.20:6379> shutdown 

rm -rf appendonly.aof dump.rdb 删除持久化数据

[root@node1 redis6379]# ./redis-server ./redis.conf 重启

192.168.81.20:6379> set name hkl

192.168.81.20:6379> save

192.168.81.20:6379> shutdown

[root@node1 redis6379]# mv  dump.rdb /root/ 备份 重启服务之后数据就没了

[root@node1 redis6379]# ./redis-server ./redis.conf 重启

cp ~/dump.rdb ./

192.168.81.20:6379> SHUTDOWN

[root@node1 redis6379]# ./redis-server ./redis.conf 重启数据恢复

 

 

互为主从搭建

主从同步原理:https://www.cnblogs.com/lukexwang/p/4711977.html?from=singlemessage&isappinstalled=0

主从搭建及sentinel参考: https://www.cnblogs.com/carrychan/p/9396997.html

主节点

vim redis.conf

port  6379      

daemonize  yes

masterauth 123456

bind  192.168.81.20

requirepass 123456

slaveof  192.168.81.30  6380

pidfile   /var/run/redis-6379.pid

logfile   /var/log/redis/redis-6379.log

从节点

port 6380         

daemonize  yes

bind  192.168.81.30 6380

requirepass 123456

masterauth 123456

pidfile   /var/run/redis-6380pid

logfile   /var/log/redis/redis-6380.log

slaveof  192.168.81.20 6379

测试

192.168.81.20:6379> INFO replication

192.168.81.20:6379> set test4 www

192.168.81.20:6379> shutdown

192.168.81.30:6380> INFO replication

主从切换

192.168.81.30:6379> SLAVEOF no one 让自己变成master

192.168.81.20:6380> SLAVEOF 192.168.81.30 6379 切换到 192.168.81.30master

 

 

搭建redis-sentinel系统 每个节点同样部署

ha高可用解决方案,实现主备切换

sentinel.conf

protected-mode no

daemonize yes

port  6800

sentinel monitor mymaster 192.168.81.30 6379  1(集群中有多少台 sentinel同意切换才切换)

sentinel auth-pass mymaster 123456

sentinel down-after-milliseconds mymaster 5000  #5秒内192.168.81.30没有响应,就认为master DOWN了

sentinel failover-timeout mymaster 15000 主从多久没切换成功之后认为切换失败

logfile  sentinel.log

pidfile  sentinel.pid

# Generated by CONFIG REWRITE

protected-mode no

sentinel leader-epoch mymaster 5

sentinel known-replica mymaster 192.168.81.20 6379 切到哪个master

sentinel current-epoch 5

启动redis-sentinel

./bin/redis-sentinel  ./sentinel.conf

 

 

redis集群

16384hash

依赖:yum install ruby rubygems -y

安装ruby参考https://blog.csdn.net/Gushiyuta/article/details/90770681

gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3

gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/

gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D695610

curl -L get.rvm.io | bash -s stable

source /usr/local/rvm/scripts/rvm

rvm install 2.3.3 安装

ruby --version 查询版本

gem install redis  安装redis集群组件

gem source -

部署集群

cd /data

for i in 0 1 2 3 4 5;do cp -r redis6379  700$i;done  部署6redis

for i in 0 1 2 3 4 5;do rm -rf 700$i/dump.rdb;done  删除rdb

chang_file.sh

#!/bin/sh

for i in 0 1 2 3 4 5

do

    file=redis.conf

    cd /data/700$i

    sed -i "s/port 6379/port 700$i/g" $file

    echo "cluster-enabled yes" >> $file

    echo "cluster-config-file nodes.conf"  >> $file

    echo "cluster-node-timeout 5000" >> $file

    sed -i "s/appendonly no/appendonly yes/g" $file

    sed -i "s/redis_6379.pid/redis_700$i.pid/g" $file

    sed -i "/^dir/d" $file

    echo "dir './'" >> $file

done

批量启动

for i in 0 1 2 3 4 5;do cd /data/700$i && ./redis-server ./redis.conf;done

创建集群

redis-cli --cluster create 192.168.81.20:7000 192.168.81.20:7001 192.168.81.20:7002 192.168.81.20:7003 192.168.81.20:7004 192.168.81.20:7005 --cluster-replicas 1

: --cluster-replicas 1 为集群中的每个几点创建一个从节点

登录集群

redis-cli -c -p 7000 -h 192.168.81.20

192.168.81.20:7000> set ssh:1 192.168.85.20

192.168.81.20:7004> get ssh:1

-> Redirected to slot [5147] located at 192.168.81.20:7000  定向到存储该key的槽位slot

redis-cli -p 7001 -h 192.168.81.20 cluster nodes 查看集群状态

redis-cli --cluster reshard 192.168.81.20:7000 重新分片

posted on 2019-08-25 17:41  SZ_文彬  阅读(320)  评论(0编辑  收藏  举报