1. 使用redis有哪些好处?

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
(2) 支持丰富数据类型,支持string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

  1. redis相比memcached有哪些优势?
    (1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
    (2) redis的速度比memcached快很多
    (3) redis可以持久化其数据

  2. redis常见性能问题和解决方案:

(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件
(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
(4) 尽量避免在压力很大的主库上增加从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...

这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

4.redis集群的工作原理
1主多从+哨兵模式

安装:参考文档 菜鸟教程:http://www.runoob.com/redis/redis-data-types.html
依赖环境:
rpm -qa gcc 查找系统是否安装gcc编译环境,无任何显示表示没有安装
yum -y install gcc gcc-c++ 安装gcc编译环境
下载地址:http://redis.io /download,下载最新文档版本。
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
解压进入redis-4.0.9/目录下
make make install
./redis-server 启动redis

redis-cli 客户端
在远程服务上执行命令
如果需要在远程 redis 服务上执行命令,同样我们使用的也是 redis-cli 命令。
语法
$ redis-cli -h host -p port -a password
127.0.0.1:6379> ping
PONG #用于检测redis服务是否开启
CONFIG GET * 获取东西

集群:测试环境虚拟机少的原因只用了一台基于不同端口实现
安装:安装ruby要求版本在2.0以上,直接在官网下载:
http://www.ruby-lang.org/en/ 安装完自带一个gem接口
mkdir -p redis-master/7001 7002 7003
mkdir -p redis-slave/7004 7005 7006
cd ruby解压缩的包
#编译安装:
./configure --prefix=/usr/local/ruby
make && make install
#直接放在/usr/bin/下可以直接使用命令
cp ruby gem /usr/bin
#使用gem接口安装
gem install redis
cd redis-4.0.9/src/
cp redis-trib-rb /usr/bin
#查看配置文件
grep -Pv "(^$|#)" /redis-master/7001/7001.conf
bind 0.0.0.0
protected-mode no
port 7001
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_7001.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump_7001.rdb
dir ./
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 15000
cluster-migration-barrier 1
cluster-require-full-coverage no
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 100
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

把配置文件复制给其他的主从
sed -ri 's/7001/7002/' 7002.conf

添加集群主:
redis-trib.rb create 10.18.42.71:7001 10.18.42.71:7002 10.18.42.71:7003
从指定主:
redis-trib.rb add-node --slave --master-id dd43785e0478031a6471348aaed51e5cbf5e1836 10.18.42.71:7004 10.18.42.71:7001
redis-trib.rb add-node --slave --master-id dd43785e0478031a6471348aaed51e5cbf5e1836 10.18.42.71:7006 10.18.42.71:7003
redis-trib.rb add-node --slave --master-id feaae6f7077d37fdfa6b1b64b4fc5edef96275c2 10.18.42.71:7005 10.18.42.71:7002

查看cluster状态 redis-trib.rb check 172.31.24.139:6300
查看cluster信息 redis-trib.rb info 172.31.24.139:6300

172.31.24.139:6300 (42050de2...) -> 0 keys | 5461 slots | 1 slaves.

172.31.24.140:6300 (b233ca19...) -> 0 keys | 5462 slots | 1 slaves.

172.31.24.141:6300 (9681bbeb...) -> 0 keys | 5461 slots | 1 slaves.

Redis Cluster中的节点分为两种:Master节点和Slave节点,一个Master节点可以拥有若干个Slave节点,
Master节点上的数据通过异步方式与Slave节点实现数据同步,当Master节点因为某种原因退出集群后,
Redis Cluster会自动从该Master节点的Slave节点中选择出一个作为新的Master节点。
因此,redis-trib.rb工具的create子命令提供了--args参数来指定集群中的Master节点拥有几个Slave节点,
譬如使用6个redis实例构建集群且--args参数值为1,那么整个集群就包含三个Master节点和三个Slave节点,每个Master节点都有一个Slave节点

客户端连接操作
redis-cli -h redis02-jp -p 6300
CLUSTER INFO #查看cluster信息
CLUSTER NODES #查看各节点的哈希槽和储存节点

redis.conf 的配置信息

  • daemonize 如果需要在后台运行,把该项改为yes redis-server ../redis.conf 指定配置文件重启
  • pidfile 配置多个pid的地址 默认在/var/run/redis.pid
  • bind 绑定ip,设置后只接受来自该ip的请求
  • port 监听端口,默认是6379
  • loglevel 分为4个等级:debug verbose notice warning
  • logfile 用于配置log文件地址
  • databases 设置数据库个数,默认使用的数据库为0
  • save 设置redis进行数据库镜像的频率。
  • rdbcompression 在进行镜像备份时,是否进行压缩
  • dbfilename 镜像备份文件的文件名
  • Dir 数据库镜像备份的文件放置路径
  • Slaveof 设置数据库为其他数据库的从数据库
  • Masterauth 主数据库连接需要的密码验证
  • Requriepass 设置 登陆时需要使用密码
  • Maxclients 限制同时使用的客户数量
  • Maxmemory 设置redis能够使用的最大内存
  • Appendonly 开启append only模式
  • Appendfsync 设置对appendonly.aof文件同步的频率(对数据进行备份的第二种方式)
  • vm-enabled 是否开启虚拟内存支持 (vm开头的参数都是配置虚拟内存的)
  • vm-swap-file 设置虚拟内存的交换文件路径
  • vm-max-memory 设置redis使用的最大物理内存大小
  • vm-page-size 设置虚拟内存的页大小
  • vm-pages 设置交换文件的总的page数量
  • vm-max-threads 设置VM IO同时使用的线程数量
  • Glueoutputbuf 把小的输出缓存存放在一起
  • hash-max-zipmap-entries 设置hash的临界值
  • Activerehashing 重新hash