Redis介绍、安装、持久化、数据类型、常用操作、操作键值、安全设置、慢查询日志、PHP安装扩展、存储session、主从配置、集群

21.9 Redis介绍

  • Redis和Memcached类似,也属于k-v数据存储
  • Redis官网redis.io, 当前最新稳定版4.0.1 1
  • 支持更多value类型,除了和string外,还支持hash、lists(链表)、sets(集合)和sorted sets(有序集合)
  • redis使用了两种文件格式:全量数据(RDB)和增量请求(aof)
  • 全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载
  • 增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,这种类似于mysql binlog。
  • redis的存储分为内存存储、磁盘存储和log文件三部分。
Redis适用场景:

取出最新N个数据的操作
排行榜应用,取出Top N操作
需要精确设定过期时间的应用
计数器应用
uniq操作,获取某段时间所有数据排除重复值
实时系统,反垃圾系统
Pub/Sub构建实时消息系统。Redis独有功能,发布/订阅
构建队列系统
缓存

21.10redis的安装

[root@aming2 ~]# cd /usr/local/src/
[root@aming2 src]# wget -c http://download.redis.io/releases/redis-4.0.11.tar.gz
[root@aming2 src]# tar -xvf redis-4.0.11.tar.gz
  • 它没有configure 文件,直接make && make install
[root@aming2 src]# cd redis-4.0.11/
[root@aming2 redis-4.0.11]# make && make install
[root@aming2 redis-4.0.11]# echo $?
0
  • 复制配制文件到etc下:cp redis.conf /etc/ ;修改配制文件:
[root@aming2 redis-4.0.11]# cp redis.conf /etc/
[root@aming2 redis-4.0.11]# vim /etc/redis.conf 
daemonize yes   # 设置Redis为后台启动
logfile "/var/log/redis.log"   # 定义日志文件的存储路径
dir /data/redis_data/  # 定义数据存储文件的路径
appendonly yes  # 开启aof存储日志

创建数据存储文件的目录;启动redis服务

[root@aming2 redis-4.0.11]# mkdir /data/redis_data/
[root@aming2 redis-4.0.11]# redis-server /etc/redis.conf
[root@aming2 redis-4.0.11]# ps aux |grep redis
root      8185  0.1  0.7 145308  7536 ?        Ssl  17:40   0:00 redis-server 127.0.0.1:6379
root      8190  0.0  0.0 112720   984 pts/0    R+   17:40   0:00 grep --color=auto redis
[root@aming2 redis-4.0.11]# netstat -lntp |grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      8185/redis-server 1
  • 查看redis日志:
[root@aming2 redis-4.0.11]# less /var/log/redis.log
8184:C 25 Aug 17:40:30.136 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8184:C 25 Aug 17:40:30.136 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=8184, just started
8184:C 25 Aug 17:40:30.136 # Configuration loaded
8185:M 25 Aug 17:40:30.146 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.11 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 8185
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

8185:M 25 Aug 17:40:30.150 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
8185:M 25 Aug 17:40:30.150 # Server initialized
8185:M 25 Aug 17:40:30.150 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
8185:M 25 Aug 17:40:30.150 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
8185:M 25 Aug 17:40:30.150 * Ready to accept connections

第一条 警告信息

WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
#警告:无法强制执行TCP的积压设置511,因为/ proc / sys / net / core / somaxconn设置为较低的值128。

第二条 警告信息

WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

#overcommit_memory设置为0!在低内存条件下,后台保存可能会失败。要解决此问题,请将“vm.overcommit_memory = 1”添加到/etc/sysctl.conf,然后重新启动或运行命令“sysctl vm.overcommit_memory = 1”以使其生效。

第三条警告信息

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

# 警告您在内核中启用了透明大页面(THP)支持。这将导致Redis的延迟和内存使用问题。要解决此问题,请以root身份运行命令“echo never> / sys / kernel / mm / transparent_hugepage / enabled”,并将其添加到/etc/rc.local中,以便在重新启动后保留设置。禁用THP后必须重新启动Redis。
  • 解决方法:
  • 修改内核参数
[root@aming2 redis-4.0.11]# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
[root@aming2 redis-4.0.11]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@aming2 redis-4.0.11]#
  • 把这两条命令放到 /etc/rc.local 里,设置开机启动就执行这两条命令:
[root@aming2 redis-4.0.11]# vim /etc/rc.local 
sysctl vm.overcommit_memory=1

echo never > /sys/kernel/mm/transparent_hugepage/enable
  • 重启redis服务,再次查看redis.log,发现2个警告已经解除
[root@aming2 redis-4.0.11]# redis-cli -h 127.0.0.1 -p 6379 shutdown   //停止服务
[root@aming2 redis-4.0.11]# netstat -lntp |grep redis
[root@aming2 redis-4.0.11]# redis-server /etc/redis.conf   //开启服务
[root@aming2 redis-4.0.11]# netstat -lntp |grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      8206/redis-server 1

21.11Redis 持久化

  • edis的两种持久化方式:RDB(Redis DataBase)和AOF(Append Only File)。

  • RDB:在不同的时间点,将redis存储的数据生成快照并保存到磁盘等介质上。默认情况下,RDB是开启的。

  • AOF:将Redis执行过的所有指令记录下来,下次Redis重新启动时,只要把这些指令从前到后再重复执行一遍,就可以实现数据恢复了。默认情况,AOF是关闭的。

  • 这两种方式可以同时使用。优先使用AOF恢复;

  • 如果你没有数据持久化的需求,就可以关闭RDB、AOF,这样就跟memcache一样,变成了一个纯内存数据库

  • 要注意的是:由于AOF会记录全部的指令,没有去做优化的话指令就会随着日积月累越积越多,甚至达到上百G,而且那些数据已经过期的也会被记录着,所以最好是定时就去删除一些过期的数据的写入指令,以达到优化的目的。

  • 进入redis.conf配置文件,修改一些参数,一般默认即可

[root@aming2 redis-4.0.11]# vim /etc/redis.conf
#   save ""         //开启持久化

save 900 1          //表示每(900s)15分钟且至少有1个key改变,就触发一次持久化
save 300 10         //表示每(300s)5分钟且至少有10个key改变,就触发一次持久化
save 60 10000       //表示每(60s)5分钟且至少有10个key改变,就触发一次持久化

AOF格式中appendfsync三种形式解析:

# appendfsync always            //一直写,每次有变更就写进去
appendfsync everysec            //安全高效,每一秒记录一次,把数据从内存刷新到磁盘中去
# appendfsync no               //每隔一段时间,根据系统的算法,Linux系统不定期把内存的数据同步到磁盘上去,根据这个频率走,容易丢数据
  • save "" #这样可以禁用rdb持久化
  • appendonly yes #如果是yes,则开启aof持久化
  • appendfilename “appendonly.aof” # 指定aof文件名字
  • appendfsync everysec #指定fsync()调用模式,有三种no(不调用fsync),always(每次写都会调用fsync),everysec(每秒钟调用一次fsync)。第一种最快,第二种数据最安全,但性能会差一些,第三种为这种方案,默认为第三种

21.12redis数据类型

string类型

  • string为最简单的类型,与Memcached一样的类型,一个key对应一个value,其支持的操作与Memcached的操作类似,它的功能更丰富。设置可以存二进制的对象
[root@aming2 redis-4.0.11]# redis-cli
127.0.0.1:6379> set mykey "abc" //设置单个键值
OK
127.0.0.1:6379> get mykey //获取键值
"abc"
127.0.0.1:6379> mset k1 a k2 b k3 c //设置多个键值
OK
127.0.0.1:6379> mget k2 //获取键值
1) "b"
127.0.0.1:6379> mget k2 mykey //获取多个键值
1) "b"
2) "abc"
127.0.0.1:6379>

list类型

  • ist是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字
  • 使用 list 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。list 的另一个应用就是消息队列,可以利用 list 的 push操作,将任务存在 list 中,然后工作线程再用pop操作将任务取出进行执行
[root@aming2 redis-4.0.11]# redis-cli
127.0.0.1:6379> lpush list1 "12" #list1是链表的名字,可以把它当做是一个集合或数组
(integer) 1
127.0.0.1:6379> lpush list1 "34" #链表中可以存储多个元素
(integer) 2
127.0.0.1:6379> lpush list1 "56"
(integer) 3
127.0.0.1:6379> lrange list1 0 -1 # lrange可以显示链表的值域,0表示一个元素,-1表示最后一个元素,结合起来就是第一个到最后一个的范围,所以通过这两个下标或者说索引,就可以显示出链表中的全部数据
1) "56"   # 因为有堆栈的先进后出概念,所以"12"会在排在最后面显示
2) "34"
3) "12"
127.0.0.1:6379> lrange list1 0 1 因为下标是从0开始,而链表中的元素只有三个,所以0-1这个范围就可以显示出链表中两个元素
1) "56"
2) "34"
127.0.0.1:6379> lpop list1  # lpop是拿出链表中的元素,注意是拿出,拿出之后链表中就不会有这个元素了
"56"
127.0.0.1:6379> lrange list1 0 -1  # 元素被拿出后,就不会再存储在链表中
1) "34"
2) "12"

set类型:

  • set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字
  • 比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
127.0.0.1:6379> sadd set1 a  # 添加一个集合,集合的名称是set1,a是该集合的元素
(integer) 1
127.0.0.1:6379> sadd set1 b  # 添加一个元素b到set1集合中,注意是添加,不会覆盖原有的元素
(integer) 1
127.0.0.1:6379> sadd set1 c
(integer) 1
127.0.0.1:6379> sadd set1 d e f g h  # 可以一次添加多个元素
(integer) 5
127.0.0.1:6379> SMEMBERS set1  # 显示set1里的全部元素
1) "f"
2) "c"
3) "h"
4) "d"
5) "b"
6) "g"
7) "e"
8) "a"
127.0.0.1:6379>
  • 并集:就是去掉两个集合中相同的元素,简单来说就是去重
127.0.0.1:6379> sadd set2 a b c 1 2 3  # 添加一个集合,该集合中有与set1集合相同的元素
(integer) 6
127.0.0.1:6379> SUNION set1 set2  # 使用SUNION命令求两个集合中的并集
 1) "a"
 2) "1"
 3) "2"
 4) "h"
 5) "3"
 6) "f"
 7) "c"
 8) "d"
 9) "b"
10) "g"
11) "e"
127.0.0.1:6379>
  • 交集:就是把两个集合中相同的元素打印出来
127.0.0.1:6379> SINTER set1 set2  # 使用SINTER命令求两个集合中的交集
1) "c"
2) "a"
3) "b"
127.0.0.1:6379>
  • 差集:就是打印集合A中有的元素,而集合B中没有的元素
127.0.0.1:6379> SDIFF set1 set2
1) "f"
2) "g"
3) "d"
4) "h"
5) "e"
127.0.0.1:6379>
  • 删除元素
127.0.0.1:6379> SREM set1 a  # 删除set集合中的元素a
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "f"
2) "c"
3) "h"
4) "d"
5) "b"
6) "g"
7) "e"
127.0.0.1:6379> SREM set1 b c d e  # 可以删除多个元素
(integer) 4
127.0.0.1:6379> SMEMBERS set1
1) "f"
2) "h"
3) "g"
127.0.0.1:6379>

sort set类型

  • sorted set是有序集合,它比set多了一个权重参数score,使得集合中的元素能够按 score 进行有序排列
  • 比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。
127.0.0.1:6379> zadd set3 11 "11" #添加一个名称为set3的一个有序集合,名称后面跟的是权重参数score,"11"则是元素
(integer) 1
127.0.0.1:6379> zadd set3 22 "22"
(integer) 1
127.0.0.1:6379> zadd set3 33 "33"
(integer) 1
127.0.0.1:6379> zrange set3 0 -1 #可 以看到打印出来的结果有按照权重参数排序
1) "11"
2) "22"
3) "33"
127.0.0.1:6379> zrevrange set3 0 -1  # ZREVRANGE 命令可以进行倒序排序
1) "33"
2) "22"
3) "11"
127.0.0.1:6379>

hash类型

  • 在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等
127.0.0.1:6379> HSET hash1 name zero  # 添加一个名称为hash1的hash集合,name是键,zero是值
(integer) 1
127.0.0.1:6379> HSET hash1 age 30
(integer) 1
127.0.0.1:6379> HSET hash1 job it
(integer) 1
127.0.0.1:6379> HGET hash1 name  # 按键来拿值
"zero"
127.0.0.1:6379> HGET hash1 age
"30"
127.0.0.1:6379> HGET hash1 job
"it"
127.0.0.1:6379> HGETALL hash1  # 打印集合中所有的元素,奇数行是key,偶数行是value
1) "name"
2) "zero"
3) "age"
4) "30"
5) "job"
6) "it"
127.0.0.1:6379>

21.13-15 redis常用操作

string操作

  • 如果一个key设置两个不同的值,第二个值会覆盖第一个值
[root@aming2 redis-4.0.11]# redis-cli
127.0.0.1:6379> set key1 abc
OK
127.0.0.1:6379> get key1
"abc"
127.0.0.1:6379> set key1 123
OK
127.0.0.1:6379> get key1
"123"
  • SETNX 检测键值是否有value 如果有直接返回一个 0 如果没有直接返回一个 1 并且创建此 value
127.0.0.1:6379> setnx key1 abc
(integer) 0
127.0.0.1:6379> get key1
"123"
127.0.0.1:6379> setnx key2 abc
(integer) 1
127.0.0.1:6379> get key2
"abc"
127.0.0.1:6379>
  • set命令中的ex参数可以给某个键值设置过期时间
127.0.0.1:6379> set key3 test ex 10   # 单位为秒
OK
127.0.0.1:6379> get key3
"test"
127.0.0.1:6379> get key3  # 10秒过后数据就过期了
(nil)
127.0.0.1:6379>
  • setex命令则是先设置过期时间然后再设置值
127.0.0.1:6379> setex key3 20 test   # 给key3设置过期时间为20s,值为test,若key已经存在,会覆盖新的值
OK
127.0.0.1:6379> get key3
"test"
127.0.0.1:6379>

list类型的操作

  • LPUSH 取值,RPOP 或者 LPOP只要把值取出来 其中的值就会被删除掉

  • lpush lista a //从左侧加入一个元素

127.0.0.1:6379> lpush list2 aaa
(integer) 1
127.0.0.1:6379> lpush list2 bbb
(integer) 2
  • lrange lista 0 -1 //取出从0开始到倒数第一个之间的元素
127.0.0.1:6379> lrange list2 0 -1
1) "bbb"
2) "aaa"
  • lpop lista //从左侧取出第一个元素
127.0.0.1:6379> lpop list2
"bbb"
  • rpush lista 1 //从右侧加入一个元素
  • rpop lista //从右侧取出第一个元素
127.0.0.1:6379> rpush list2 123
(integer) 2
127.0.0.1:6379> rpop list2
"123"
  • linsert命令用于指定在某个元素的前、后位置插入元素,例如:
127.0.0.1:6379> linsert list2 before aaa ccc  # 在aaa的前面插入一个元素为ccc
(integer) 2
127.0.0.1:6379> linsert list2 after ccc ddd  # 在ccc的后面插入一个元素为ddd
(integer) 3
127.0.0.1:6379> LRANGE list2 0 -1
1) "ccc"
2) "ddd"
3) "aaa"
127.0.0.1:6379>
  • lset命令用来修改某一个指定的元素
127.0.0.1:6379> lset list2 0 abc  # 将列表中下标为0的元素修改成abc
OK
127.0.0.1:6379> LRANGE list2 0 -1
1) "abc"
2) "ddd"
3) "aaa"
127.0.0.1:6379>
  • lindex命令查看某个下标的元素:
127.0.0.1:6379> LINDEX list2 0
"abc"
127.0.0.1:6379> LINDEX list2 1
"ddd"
127.0.0.1:6379> LINDEX list2 2
"aaa"
127.0.0.1:6379> LINDEX list2 3
(nil)
127.0.0.1:6379>
  • llen命令查看某个列表中的元素数量
127.0.0.1:6379> llen list2
(integer) 3

set类型的操作

hash操作

  • 单个创建hash键值
[root@aming2 redis-4.0.11]# redis-cli
127.0.0.1:6379> hset hash1 name aming
(integer) 1
127.0.0.1:6379> hset hash1 age 30
(integer) 1
127.0.0.1:6379> hset hash1 job it
(integer) 1
  • 批量建立键值对
  • 批量获得键值对
127.0.0.1:6379> hmset hash2 name aming2 age 31 job it
OK
127.0.0.1:6379> hmget hash2 name age job
1) "aming2"
2) "31"
3) "it"
  • 获得所有的键值对
127.0.0.1:6379> hgetall hash2
1) "name"
2) "aming2"
3) "age"
4) "31"
5) "job"
6) "it"
  • 删除指定filed
127.0.0.1:6379> hdel hash2 job
(integer) 1
127.0.0.1:6379> hgetall hash2
1) "name"
2) "aming2"
3) "age"
4) "31"
  • 打印所有的key
  • 打印所有的values
127.0.0.1:6379> hkeys hash2
1) "name"
2) "age"
127.0.0.1:6379> hvals hash2
1) "aming2"
2) "31"
  • 查看hash有几个filed
127.0.0.1:6379> hlen hash2
(integer) 2

21.16Redis操作键值

常用以下键值

keys * :取出所有键
exists 键名:存在返回1
del 键:删除键
expire 键 100:设置键100秒后过期
ttl 键:查看键的过期时间,单位是秒,当键不存在返回-2,键存在但没设置过期时间返回-1
select 0 :代表选择当前数据库,默认进入0数据库
move age 1 :把age移动到1数据库
persist 键:取消键的过期时间
randomkey:返回一个键
rename oldname newname:重命名
type 键:返回键的类型
  • 查看所有键值:keys *
[root@aming2 redis-4.0.11]# redis-cli
127.0.0.1:6379> keys *
 1) "set3"
 2) "k3"
 3) "hsah2"
 4) "hash2"
 5) "mykey"
 6) "k1"
 7) "k2"
 8) "list1"
 9) "key1"
10) "list2"
11) "hash1"
12) "set1"
  • 模糊匹配
127.0.0.1:6379> keys k*
1) "k3"
2) "k1"
3) "k2"
4) "key1"
127.0.0.1:6379>
  • exists命令可以判断某个键是否存在,存在返回1 ,否则返回0
127.0.0.1:6379> exists key1
(integer) 1
127.0.0.1:6379> exists key100
(integer) 0
127.0.0.1:6379>
  • del命令可以删除一个key ,删除成功返回1 ,否则返回0
127.0.0.1:6379> del key1
(integer) 1
127.0.0.1:6379> get key1
(nil)
127.0.0.1:6379>
  • EXPIRE命令可以给指定的键设置一个过期时间
127.0.0.1:6379> EXPIRE k1 100   # 设置key2 100s后过期
(integer) 1
127.0.0.1:6379>
  • ttl 命令可以查看指定的键还有多长时间过期,单位是秒,当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,返回 key 的剩余生存时间。
127.0.0.1:6379> ttl k1
(integer) 80
127.0.0.1:6379> ttl key2
(integer) -2
127.0.0.1:6379> get key2
(nil)
127.0.0.1:6379> ttl k2
(integer) -1
127.0.0.1:6379>
  • select命令可以选择一个数据库,redis默认有6个数据库,通过0-6的数字就可以选择进入哪一个库:
127.0.0.1:6379> select 0   # 代表选择当前数据库,默认进入 0 数据库
OK
127.0.0.1:6379> SELECT 1  # 选择 1 数据库
OK
127.0.0.1:6379[1]> keys *  # 1 数据库下没有键值数据
(empty list or set)
127.0.0.1:6379[1]>
  • move set1 1 // 把set1移动到 1 数据库里(注意当前所选数据库有没有键值)
127.0.0.1:6379> move set1 1
(integer) 1
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "set1"
  • persist key1 //取消key1的过期时间
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> expire set3 100
(integer) 1
127.0.0.1:6379> ttl set3
(integer) 95
127.0.0.1:6379> persist set3
(integer) 1
127.0.0.1:6379> ttl set3
(integer) -1
  • randomkey //随机返回一个key
127.0.0.1:6379> randomkey
"list1"
127.0.0.1:6379> randomkey
"hsah2"
127.0.0.1:6379> randomkey
"k2"
  • rename oldname newname //重命名key
127.0.0.1:6379> rename set3 set4
OK
127.0.0.1:6379> keys s*
1) "set4"
  • type key1 //返回键的类型,不存在的key则返回none
127.0.0.1:6379> type set4
zset
127.0.0.1:6379> type set3
none

21.17redis安全设置

  • redis默认会监听所有ip,这样的话所有ip都能来进行连接,所以需要设置指定的监听ip来提高安全性。

  • redis默认端口是6379,如果使用默认端口很容易被***扫到,所以设置一个其他的监听端口也可以提高安全性。

  • 如何解决redis漏洞

  1. 设置密码
  2. 更改默认端口
  3. 监听内网IP
  4. 设定专用账户
  5. 修改configure命令
  • redis默认是没有密码的,所以还需要设置密码:
[root@aming2 ~]# vim /etc/redis.conf

port 18000                     //更改端口
requirepass password             //设置密码
rename-command CONFIG aming    //改为aming,自定义
# rename-command CONFIG ""   //禁用
  • 修改完之后重启redis服务
[root@aming2 ~]#  killall redis-server
[root@aming2 ~]#  redis-server /etc/redis.conf
  • 指定端口、密码登陆
redis-cli -p 18000 -a 'password'

21.18redis慢查询日志

慢查询日志,两个参数:一个是执行时长,单位是微妙,另一个是慢查询日志的长度。当一个新的命令被写入日志时,最老的一条会从命令日志队列中被移除。

slowlog-log-slower-than 1000:表示慢于1000ms则记录日志
slowlog-max-len 128:定义长度,最多存128条
slowlog get:列出 全部慢查询日志
slowlog len:查看慢查询日志条数
  • 编辑配置文件,文件中搜素slowlog,可以设置以下几个参数,一般情况下保持默认即可
[root@aming2 ~]#  vim /etc/redis.conf
slowlog-log-slower-than 1000 //单位ms,表示慢于1000ms则记录日志
slowlog-max-len 128  //定义日志长度,表示最多存128条
  • 修改完之后重启redis服务
[root@aming2 ~]#  killall redis-server
[root@aming2 ~]#  redis-server /etc/redis.conf
  • 可以使用以下命令查看相应的慢查询日志信息
slowlog get //列出所有的慢查询日志
slowlog get 2 //只列出2条
slowlog len //查看慢查询日志条数

21.19php安装redis扩展

  • 下载、解压、编译安装
[root@aming2 ~]# cd /usr/local/src/
[root@aming2 src]# wget https://coding.net/u/aminglinux/p/yuanke_centos7/git/raw/master/21NOSQL/phpredis.zip
[root@aming2 src]# unzip phpredis.zip
[root@aming2 src]# cd phpredis-develop
[root@aming2 phpredis-develop]#  /usr/local/php-fpm/bin/phpize 
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
[root@aming2 phpredis-develop]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config
[root@aming2 phpredis-develop]# make && make install

编辑php配置文件:

[root@aming2 phpredis-develop]# vim /usr/local/php-fpm/etc/php.ini
# 增加这一行
extension=redis.so

查看是否有redis模块,重启php-fpm服务

[root@aming2 phpredis-develop]# /usr/local/php-fpm/bin/php -m|grep redis
redis
 [root@aming2 phpredis-develop]#/etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done

21.20 redis存储session

编辑PHP配置文件:

[root@aming2 phpredis-develop]# vim /usr/local/php-fpm/etc/php.ini
# 修改或增加这两行
session.save_handler = "redis"
session.save_path = "tcp://127.0.0.1:6379"
  • 如果是apache的话可以在虚拟主机配置文件中这样配置:
php_value session.save_handler " redis" 
php_value session.save_path " tcp://127.0.0.1:6379"
  • nginx的话可以在php-fpm配置文件对应的pool中增加:
[root@aming2 phpredis-develop]# vim /usr/local/php-fpm/etc/php-fpm.conf
php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://127.0.0.1:6379"

重启php-fpm服务:

[root@aming2 phpredis-develop]#  /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done

如果配置了redis的密码的话,得先把redis的密码去掉;

[root@aming2 phpredis-develop]# vim /etc/redis.conf
# 把密码注释掉
# requirepass password
  • 重启redis服务
killall redis-server
redis-server /etc/redis.conf

下载测试文件测试session是否存储成功

wget http://study.lishiming.net/.mem_se.txt
mv .mem_se.txt /data/wwwroot/default/test.php
curl localhost/test.php

21.21 redis主从配置

redis的主从和mysql主从类似,但是配置起来比mysql要简单。

两台机器的IP: 192.168.222.111 (主) 192.168.222.112 (从) redis版本:4.0.0.1

1.两台机器都关闭所有的防火墙。

2.如果你的两台机器都只监听了127.0.0.1这个本地ip的话,需要先添加能够访问外网的ip:

主机器:
[root@localhost ~]# vim /etc/redis.conf
bind 192.168.222.111

从机器:
[root@localhost ~]# vim /etc/redis.conf
bind 192.168.222.112

配置主从,编辑 从(slave) 上的redis配置文件:

[root@localhost ~]# vim /etc/redis.conf
# 增加这行配置,参数是主的ip和端口
slaveof 192.168.111.222 6379

# 如果主机器上设置了密码,还需要增加这行配置,如果没有则不需要
masterauth password # 设置主的密码

重启从机器的redis服务:

killall redis-server
redis-server /etc/redis.conf

测试:在从机器上进入redis的命令行,然后执行keys *命令,看看主上的数据是否已经同步过来。

注意:redis主从和mysql主从不一样,redis主从不用事先同步数据,它会自动同步过去。

21.22 redis集群介绍

redis cluster(redis集群)是redis3.0之后的版本才支持的架构,和其他集群一样,redis集群也是为了解决单台服务器不够用的情况。redis cluster是一个分布式的集群方案,它支持横向扩展。redis的集群方案不单止官方的redis cluster,还有第三方的Codis集群方案。Codis类似于LVS做负载均衡一样,它用的是路由的技术。而官方的redis cluster则是把所有的节点都互联,实现数据共享。

redis cluster集群的特点:

  • 多个redis节点网络互联,数据共享
  • 所有的节点都是一主一从(可以是多个从),其中从不提供服务,仅作为备用
  • 不支持同时处理多个键(如mset/mget),因为redis需要把键均匀分布在各个节点上,并发量很高的情况下同时创建键值会降低性能并导致不可预测的行为。
  • 支持在线增加、删除节点
  • 客户端可以连任何一个主节点进行读写

21.23-21.25 redis集群搭建配置、操作

场景设置:
 两台机器,分别开启三个Redis服务(端口)
 A机器上三个端口7000,7002,7004,全部为主
 B机器上三个端口7001,7003,7005,全部为从
 两台机器上都要编译安装redis,然后编辑并复制3个不同的redis.conf,分别设置不同的端口号、dir等参数,还需要增加cluster相关参数,然后分别启动6个redis服务
 具体redis配置文件大家到https://coding.net/u/aminglinux/p/yuanke_centos7/git/tree/master/21NOSQL下载或者查看
配置:
 安装ruby2.2 (只需要一台机器上运行)
 yum -y groupinstall "Development Tools"
 yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve
 cd /root/
 mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
 wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES
 wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS
 rpmbuild -bb rpmbuild/SPECS/ruby22x.spec
 yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
 gem install redis
配置和操作
cp /usr/local/src/redis-4.0.1/src/redis-trib.rb  /usr/bin/
 redis-trib.rb create --replicas 1 192.168.133.130:7000 192.168.133.130:7002 192.168.133.130:7004 192.168.133.132:7001 192.168.133.132:7003 192.168.133.132:7005
 redis-cli -c -h 192.168.133.130 -p 7000//-c说明以集群的方式登录
 任意一个节点都可以创建key,或者查看key(演示)
 redis-trib.rb check  192.168.133.130:7000//检测集群状态
 cluster nodes//列出节点
 cluster info//查看集群信息
 cluster meet ip port //添加节点
 cluster forget node_id //移除某个节点
 cluster replicate node_id//将当前节点设置为指定节点的从
 cluster saveconfig//保存配置文件

猜你喜欢

转载自blog.csdn.net/xou6363/article/details/82079949