Redis的简单应用

Redis

  • ####redis 是一个高性能的 key-value 数据库。 redis 的出现,很大程度补偿了memcached 这类 keyvalue 存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了 Python,Ruby,Erlang,PHP
    客户端,使用很方便。Redis
    的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个
    appendonly file(aof)里面(这称为“全持久化模式”)。

主机环境 rhel6.5 selinx and iptales disabled

1. Redis 安装

[root@server1 mnt]# tar zxf redis-4.0.8.tar.gz
[root@server1 mnt]# rpm -ivh jemalloc-3.6.0-1.el6.x86_64.rpm
[root@server1 redis-4.0.8]# yum install -y gcc
[root@server1 redis-4.0.8]Make && make instal

可执行文件作用如下:

ls /usr/local/bin/
redis-benchmark redis-check-dump redis-sentinel
redis-check-aof redis-cli
redis-server

redis-server: Redis 服务主程序。
redis-cli: Redis 客户端命令行工具,也可以用 telnet 来操作。redis-benchmark: Redis 性能测试工具,用于测试读写性能。
redis-check-aof:检查 redis aof 文件完整性,aof 文件持久化记录服务器执行的所有写
操作命令,用于还原数据。
redis-check-dump:检查 redis rdb 文件的完整性,rdb 就是快照存储, 即按照一定的
策略周期性的将数据保存到磁盘,是默认的持久化方式。
redis-sentinel:
redis-sentinel 是集群管理工具,主要负责主从切换

2.配置并启动服务

[root@server1 redis-4.0.8]# cd utils/
[root@server1 utils]# ./install_server.sh 
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] 
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] 
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] 
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] 
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful! 

3查看端口

查看监听端口

[root@server1 utils]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      6454/redis-server 0 
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      909/sshd            
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1523/master         
tcp        0      0 172.25.24.1:22              172.25.24.1:56002           ESTABLISHED 2194/sshd           
tcp        0      0 172.25.24.1:56002           172.25.24.1:22              ESTABLISHED 2193/ssh            
tcp        0      0 172.25.24.1:22              172.25.24.250:53394         ESTABLISHED 1413/sshd           
tcp        0      0 :::22                       :::*                        LISTEN      909/sshd            
tcp        0      0 ::1:25                      :::*                        LISTEN      1523/master         
[root@server1 utils]# 
##4.基础配置[root@server1 utils]# vim /etc/redis/6379.conf     ##0.0.0.0为监听所有端口

这里写图片描述

[root@server1 utils]# /etc/init.d/redis_6379 stop   ##先关闭再打开
Stopping ...
Redis stopped
[root@server1 utils]# /etc/init.d/redis_6379 start
Starting Redis server...

redis的主从切换

上面redis的配置是基础server1 、server2、server3都要配置

server2 为master

server1 和 server3 为slave,配置相同

server1和3
  root@server1 utils]# vim /etc/redis/6379.conf 

这里写图片描述

server2:
[root@server2 redis-4.0.8]# cp sentinel.conf /etc/redis/
[root@server2 redis-4.0.8]# cd /etc/redis/
[root@server2 redis]# ls
6379.conf  sentinel.conf
[root@server2 redis]# vim sentinel.conf 

这里写图片描述

The authenticity of host 'server1 (172.25.24.1)' can't be established.
RSA key fingerprint is c4:b9:31:bc:e1:e6:f7:19:16:f3:b7:bc:26:45:68:e6.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server1' (RSA) to the list of known hosts.
sentinel.conf                                                  100% 7588     7.4KB/s   00:00    
[root@server2 redis]# scp sentinel.conf server3:/etc/redis/
The authenticity of host 'server3 (172.25.24.3)' can't be established.
RSA key fingerprint is c4:b9:31:bc:e1:e6:f7:19:16:f3:b7:bc:26:45:68:e6.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server3' (RSA) to the list of known hosts.
sentinel.conf                                                  100% 7588     7.4KB/s   00:00    
必须先scp在重启服务

[root@server2 redis]# /etc/init.d/redis_6379 restart

查看状态:

[root@server2 redis]# /etc/init.d/redis_6379 restart
6504:X 11 Aug 17:08:18.692 # +monitor master mymaster 127.0.0.1 6379 quorum 2
6504:X 11 Aug 17:08:18.693 * +slave slave 172.25.24.3:6379 172.25.24.3 6379 @ mymaster 127.0.0.1 6379
6504:X 11 Aug 17:08:18.709 * +slave slave 172.25.24.1:6379 172.25.24.1 6379 @ mymaster 127.0.0.1 6379

二.Redis 集群(去中心化)

1.安装服务

[root@server1 src]# cp redis-trib.rb /usr/local/bin/
root@server1 bin]# ./redis-trib.rb 
/usr/bin/env: ruby: No such file or directory
[root@server1 bin]# yum install ruby -y
[root@server1 mnt]# yum install rubygems-1.3.7-5.el6.noarch.rpm  -y
[root@server1 mnt]# yum install ruby-2.2.3-1.el6.x86_64.rpm
[root@server1 mnt]# yum install libyaml-0.1.3-4.el6_6.x86_64.rpm  -y
[root@server1 mnt]# gem install --local redis-4.0.1.gem 
Successfully installed redis-4.0.1
Parsing documentation for redis-4.0.1
Installing ri documentation for redis-4.0.1
Done installing documentation for redis after 1 seconds
1 gem installed
[root@server1 mnt]# gem list --local

*** LOCAL GEMS ***

bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
redis (4.0.1)
test-unit (3.0.8)

[root@server1 mnt]# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped

2.配置redis集群

[root@server1 mnt]# cd /usr/local/
[root@server1 local]# mkdir cluster
[root@server1 local]# cd cluster/
[root@server1 cluster]# mkdir 700{1..6}
[root@server1 cluster]# ls
7001  7002  7003  7004  7005  7006 
[root@server1 7001]# pwd
/usr/local/cluster/7001
[root@server1 7001]# ls
redis.conf
[root@server1 7001]# cat redis.conf 
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
pidfile /usr/local/cluster/7001/redis.pid
logfile /usr/local/cluster/7001/redis.log
[root@server1 7001]# 
root@server1 7001]# redis-server redis.conf   ##启动
[root@server1 7001]# ls
appendonly.aof  nodes.conf  redis.conf  redis.log  redis.pid

3.查看日志修复:

cat     redis.log

错误:
1563:M 12 Aug 10:14:48.158 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
解决办法:
[root@server1 7001]# echo 511 > /proc/sys/net/core/somaxconn 
[root@server1 7001]# cat /proc/sys/net/core/somaxconn 
511


错误:
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.


解决办法:
[root@server1 7001]# vim /etc/sysctl.conf 
[root@server1 7001]# sysctl -w vm.overcommit_memory=1
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.


解决办法:
[root@server1 7001]# echo never > /sys/kernel/mm/transparent_hugepage/enabled

4.将配置文件复制到别的目录为

比如7002  由于日志的 修复已经没有问题了,依次类推,复制到其他的目录下,并启动
[root@server1 cluster]# cd 7002/
[root@server1 7002]# ls
redis.conf
[root@server1 7002]# vim redis.conf 
port 7002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
pidfile /usr/local/cluster/7002/redis.pid
logfile /usr/local/cluster/7002/redis.log

[root@server1 7002]# redis-server redis.conf 




Ps ax

1563 ?        Ssl    0:00 redis-server *:7001 [cluster]
 1585 ?        Ssl    0:00 redis-server *:7002 [cluster]
 1593 ?        Ssl    0:00 redis-server *:7003 [cluster]
 1600 ?        Ssl    0:00 redis-server *:7004 [cluster]
 1626 ?        Ssl    0:00 redis-server *:7005 [cluster]
 1632 ?        Ssl    0:00 redis-server *:7006 [cluster]
 1636 pts/1    R+     0:00 ps ax

5.开启集群

[root@server1 7006]# redis-trib.rb create --replicas 1 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 127.0.0.1:7006   
  ##输入yes


M: d4e60f975c2e5d91aef2c974cfaf23977d4cd533 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 623e3f755b18757d1f8cbcc3605465bd0bb65816 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 5e7bbe8c85db0c9c3ca8fcaf0c43231548cb2178
M: 5e7bbe8c85db0c9c3ca8fcaf0c43231548cb2178 127.0.0.1:7002
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: c3153197738158fa3969b6beccf535dc872b312a 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 1a8680b32cc02264ce9f5316a46e9a7ae6a06f79
S: b880381168e2fde099546252e876025b224f70e4 127.0.0.1:7005
   slots: (0 slots) slave
   replicates d4e60f975c2e5d91aef2c974cfaf23977d4cd533
M: 1a8680b32cc02264ce9f5316a46e9a7ae6a06f79 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)

6.测试:

[root@server1 7006]# redis-cli -c -p 7001 
127.0.0.1:7001> info   ##可以查看节点
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=7005,state=online,offset=98,lag=1



127.0.0.1:7001> set name xixi
-> Redirected to slot [5798] located at 127.0.0.1:7002
OK
127.0.0.1:7002> get name
"xixi"

[root@server1 7006]# redis-cli -c -p 7006
127.0.0.1:7006> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002
"xixi"





节点删除与添加:
 1714 ?        Ssl    0:00 redis-server *:7001 [cluster]
 1722 ?        Ssl    0:00 redis-server *:7002 [cluster]
 1730 ?        Ssl    0:00 redis-server *:7003 [cluster]
 1738 ?        Ssl    0:00 redis-server *:7004 [cluster]
 1745 ?        Ssl    0:00 redis-server *:7005 [cluster]
 1752 ?        Ssl    0:00 redis-server *:7006 [cluster]
 1769 pts/1    R+     0:00 ps ax
[root@server1 7006]# kill 1722
[root@server1 7006]# redis-cli -c -p 7002
Could not connect to Redis at 127.0.0.1:7002: Connection refused
Could not connect to Redis at 127.0.0.1:7002: Connection refused
not connected> 
[root@server1 7006]# redis-cli -c -p 7004
127.0.0.1:7004> get name
-> Redirected to slot [5798] located at 127.0.0.1:7006
"xixi"


[root@server1 cluster]# cd 7002/
[root@server1 7002]# ls
appendonly.aof  dump.rdb  nodes.conf  redis.conf  redis.log
[root@server1 7002]# cat appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
set
$4
name
$4
xixi


再次启动7002 ,它变成了slave
7006 变成了master
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=7002,state=online,offset=504,lag=1
master_replid:85fece10420caee8ab98d4702415ad3c954eb1ea
master_replid2:4c42988f097d1d834b822833c27975964123f2

. Redis.conf 文件详解:

daemonize yes #默认值 no,该参数用于定制 redis 服务是否以守护模式运行。
pidfile /var/run/redis_6379.pid #指定 redis 服务的进程号文件路径.
port 6379
#默认值 6379,指定 redis 服务的端口号。
bind 127.0.0.1 #绑定 ip,默认是本机所有网络接口;
timeout 0
#客户端空闲 n 秒后断开连接;默认是 0 表示不断开。
loglevel notice #设置服务端的日志级别,有下列几种选择:
debug:记录详细信息,用于开发或调试;
verbose:提供很多有用的信息,但是又不像 debug 那么详尽,默认就是这一
选项;
notice:适度提醒,多用于产品环境;
warning:仅显示重要的警告信息;
logfile stdout
##指定日志的输出路径,默认值 stdout,表示输出到屏幕,守
护模式时则输出到/dev/null;
如果要输出日志到 syslog 中,可以启动 syslog-enabled yes,默认该选项值为
no。
syslog-enabled no
databases 16
#指定数据库的数量,默认为 16 个,默认使用的数据库是 DB 0,
可以使用 SELECT <dbid>命令在连接上指定数据库 id。save <seconds> <changes> #指定在多长时间内,有多少次更新操作,才将数
据同步到数据文件,这个选项有两个属性值,只有当两个属性值均满足时才会触
发;可以设置多种级别:
save 900 1 #每 900 秒(15 分钟)至少一次键值变更时被触发;
save 300 10
#每 300 秒(5 分钟)至少 10 次键值变更时被触发;
save 60 10000 #每 60 秒至少 10000 次键值变更时被触发;
rdbcompression yes #默认值 yes,当 dump 数据库时使用 LZF 压缩字符串对
象,如果 CPU 资源比较紧张,可以设置为 no,选择不压缩,但会导致数据库文
件变的巨大。
rdbchecksum yes
dbfilename dump.rdb #默认值 dump.rdb,dump 到文件系统中的文件名。
dir /var/lib/redis/6379 #默认值./,即当前目录,dump 出的数据文件的存储路
径。
# slaveof <masterip> <masterport> #设置当本机为 slav 服务时,设置 master
服务的 IP 地址及端口,在 Redis 启动时,它会自动从 master 进行数据同步。
# masterauth <master-password> #如果 master 配置了密码的话,此处也需
做设置;
slave-serve-stale-data yes #默认值 yes。当 slave 丢失与 master 端的连接,或
者复制仍在处理,那么 slave 会有下列两种表现:
当本参数值为 yes 时,slave 为继续响应客户端请求,尽管数据已不同步甚至没
有数据(出现在初次同步的情况下);
当本参数值为 no 时, slave 会返回"SYNC with master in progreee"的错误信息;slave-read-only yes #默认 salve 是只读模式
# repl-ping-slave-period 10 #默认值 10,指定 slave 定期 ping master 的周期;
# repl-timeout 60 #默认值 60,指定超时时间。注意本参数包括批量传输数据
和 ping 响应的时间。
# requirepass foobared #指定一个密码,客户端连接时也需要通过密码才能成
功连接;
# rename-command CONFIG
b840fc02d524045429941cc15f59e41cb7be6c52 #重定义命令,例如将
CONFIG 命令更名为一个很复杂的名字:
# rename-command CONFIG "" 取消这个命令;
# maxclients 10000 #指定客户端的最大并发连接数,默认是没有限制,直到
redis 无法创建新的进程为止,设置该参数值为 0 也表示不限制,如果该参数指
定了值,当并发连接达到指定值时,redis 会关闭所有新连接,并返回'max
number of clients reached'的错误信息;
# maxmemory <bytes> #设置 redis 最大可使用内存。当达到最大内存后, redis
会尝试按照设置的回收策略删除键值。如果无法删除键值,或者保留策略设置为
不清除,那么 redis 就会向发出内存的请求返回错误信息。当把 redis 做为一级
LRU 的缓存时本参数较为有用。但仍然可以进行读取操作。 Redis 新的 vm 机制,
会把 Key 存放内存,Value 会存放在 swap 区。
# maxmemory-policy volatile-lru #默认值 volatile-lru,指定清除策略,有下列
几种方法:
volatile-lru -> remove the key with an expire set using an LRU algorithmallkeys-lru -> remove any key accordingly to the LRU algorithm
volatile-random -> remove a random key with an expire set
allkeys->random -> remove a random key, any key
volatile-ttl -> remove the key with the nearest expire time (minor TTL)
noeviction -> don't expire at all, just return an error on write operations
# maxmemory-samples 3
#默认值 3,LRU 和最小 TTL 策略并非严谨的策略,
而是大约估算的方式,因此可以选择取样值以便检查。
ONLY 模式的设置,默认情况下 redis 采用异步方式 dump 数据到磁盘上,极端
情况下这可能会导致丢失部分数据(比如服务器突然宕机),如果数据比较重要,
不 希望丢失,可以启用直写的模式,这种模式下 redis 会将所有接收到的写操
作同步到 appendonly.aof 文件中,该文件会在 redis 服务启动时 在内存中重建
所有数据。注意这种模式对性能影响非常之大。
appendonly no #默认值 no,指定是否启用直写模式;
# appendfilename appendonly.aof #直写模式的默认文件名 appendonly.aof
appendfsync:调用 fsync()方式让操作系统写数据到磁盘上,数据同步方式,有
下列几种模式:
always:每次都调用,比如安全,但速度最慢;
everysec:每秒同步,这也是默认方式;
no:不调用 fsync,由操作系统决定何时同步,比如快的模式;
no-appendfsync-on-rewrite:默认值 no。当 AOF fsync 策略设置为 always
或 everysec,后台保存进程会执行大量的 I/O 操作。某些 linux 配置下 redis 可
能会阻塞过多的 fsync()调用。auto-aof-rewrite-percentage:默认值 100
auto-aof-rewrite-min-size:默认值 64mb
appendfsync everysec
hash-max-zipmap-entries:默认值 512,当某个 map 的元素个数达到最大值,
但是其中最大元素的长度没有达到设定阀值时,其 HASH 的编码采用一种特殊的
方式(更有效利用内存)。本参数与下面的参数组合使用来设置这两项阀值。设置
元素个数;
hash-max-zipmap-value:默认值 64,设置 map 中元素的值的最大长度;
list-max-ziplist-entries:默认值 512,与 hash 类似,满足条件的 list 数组也会
采用特殊的方式以节省空间。
list-max-ziplist-value:默认值 64
set-max-intset-entries:默认值 512,当 set 类型中的数据都是数值类型,并且
set 中整型元素的数量不超过指定值时,使用特殊的编码方式。
zset-max-ziplist-entries:默认值 128,与 hash 和 list 类似。
zset-max-ziplist-value:默认值 64
activerehashing:默认值 yes,用来控制是否自动重建 hash。Active rehashing
每 100 微秒使用 1 微秒 cpu 时间排序,以重组 Redis 的 hash 表。重建是通过一
种 lazy 方式,写入 hash 表的操作越多,需要执行 rehashing 的步骤也越多,如
果服务器当前空闲,那么 rehashing 操作会一直执行。如果对实时性要求较高,
难以接受 redis 时不时出现的 2 微秒的延迟,则可以设置 activerehashing 为 no,
否则建议设置为 yes,以节省内存空间。设置内存分配策略(可选,根据服务器的实际情况进行设置)
/proc/sys/vm/overcommit_memory
可选值:0120, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用
内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
值得注意的一点是,redis 在 dump 数据的时候,会 fork 出一个子进程,理论上
child 进程所占用的内存和 parent 是一样的,比如 parent 占用的内存为 8G,这
个时候也要同样分配 8G 的内存给 child,如果内存无法负担,往往会造成 redis
服务器的 down 机或者 IO 负载过高,效率下 降。所以这里比较优化的内存分配
策略应该设置为 1 (表示内核允许分配所有的物理内存,而不管当前的内存状态

猜你喜欢

转载自blog.csdn.net/a939029674/article/details/81608256
今日推荐