Redis由浅入深

10.  PHP环境中安装redis的客户端扩展

11.  开发php程序实战操作redis

12.  开发python程序实战操作redis

13.  逐条分析redis服务的配置文件

    1.  include   /path

    2.  daemonize no  后台运行

    3.  pidfile  /var/run/redis.pid

    4.  port  默认端口号6379

    5.  tcp-backlog  511

    6.  bind  绑定哪个网卡

    7.  timeout  客户端连接超时时间,0为不超时

    8.  loglevel  日志级别,notice

    9.  logfile  写文件路径,不加路径相对于配置文件的

    10.   database  16  默认16个数据库

    11.   快照

       save  seconds  changes

       save 900 1

       save 300 10

       save 60 10000

       save会阻塞客户端请求

       生产场景,读写比较频繁,不使用save。

       使用bgsave不会阻塞客户端请求

    12.   stop-writes-on-bgsave-error  yes  bgsave发生错误的时候,停止写操作

    13.  rdbcompression yes  rdb压缩

    14.  dbfilename  dump.rdb  相当于conf路径

    15.  dir  ./

    16.  limits  限制

        maxclients  客户端并发

        maxmemory  内存限制  

          内存一旦满了,redis会使用算法把内存中的过期数据清除

    17.  AOF持久化

        appendonly  no  默认关闭

        appendfilename  "appendonly.aof"

        appendrsync  eversec  每秒

        auto-aof-rewrite-percentage 100

        auto-aof-rewrite-min-size 64mb

    18.  lua脚本

 

15.  Redis多实例

    1.  复制原来的redis.conf文件到另外一个目录下。

    2.  修改新的redis.conf文件的端口和aof目录路径和pid文件

    3.  redis-server 新配置文件目录

    4.  redis-cli -p 6380登录新实例即可

 

      

17.  Redis主从复制配置

    1.  在从服务器2配置文件中,添加语句:

        slaveof master_ip  master_port

    2.  登录到从服务器的redis中,然后执行命令slaveof master_ip master_port

    3.  从库的配置文件参数

        slave-serve-stale-data yes  

        slave-read-only yes

        slave-prot  100  优先级  优先级高,当主宕了,优先级高的成为主

    4.  redis主从复制怎么确定复制完成了?

        通过info可以查看主从是否有延时。

    5.  redis主服务器如果宕机,那么从服务器上会有报错。

18722:S 21 Nov 14:45:13.828 * MASTER <-> SLAVE sync started
18722:S 21 Nov 14:45:13.828 # Error condition on socket for SYNC: Connection refused

如果主恢复了,那么从不会再报错。

6.  redis主服务器宕机,从如何切换为主?

         主宕机,从执行slaveof no one变成主,

         原来的主恢复以后,成为新主的从,然后再切换回来就好了。         

18.  Redis发布与订阅

    1.  publish channel01 hello  发布频道的信息hello,频道名称可以任意使用

    2.  subscribe channel01  订阅频道

    3.  psubscribe channel*  批量订阅

19.  Redis数据过期

    1.  查看key是否过期  ttl  key  返回-1,永不过期

        返回-2,键不存在

       返回的时间为单位为秒。

    2.  设置key过期  expire  key  5  5秒过期

    3.  设置时间戳过期  expireat  key  时间戳

    4.  获取时间戳   linux系统中执行命令date +%s -d "2014-07-06 02:08:00" 

    5.  过期机制

        redis对过期键采用了lazy expiration。

        过期的key没有被访问,可能不会被删除

        过期方法:主动过期和被动过期

21.  Redis持久化

    2.  AOF

        因为快照一定间隔时间保存一次,如果redis意外宕机,就会丢数据。

        appendonly yes  启用aof持久化方式

        appendfsync always  收到命令立即写入磁盘,最慢,但是保证完全的持久化

        appendfsync everysec  每秒写入磁盘一次,生产常用

        appendfsync no  完全依赖操作系统,持久化没保证

    3.  数据恢复

        可以直接编辑aof文件,删除不想要的数据,然后关闭redis,再重新启动。

        注意:如果测试时,使用了del,也会记录到aof中,那么要删除aof文件中的del。

    4.  bgrewriteaof

        用来减小aof文件

        auto-aof-rewrite-percentage 100  设置为0,就不会重写

        auto-aof-rewrite-min-size 64mb

22.  Redis生产优化经验

    1.  内存管理优化

        1.  尽量采用hash类型

        2.  hash-max-zipmap-entries 64  超过64,就使用真正的hashmap

           hash-max-zipmap-value 512  值的大小不能超过512

           以上两个值任意一个条件超过设置值都会转换成真正的hashmap

    2.  根据业务选择合适的数据类型

    3.  当业务场景不需要数据持久化,关闭所有的持久化方式

    4.  如果可以容忍部分数据丢失,使用aof,可以调整写入的频率

    5.  不要设置redis所使用的内存超过实际内存的3/5

    6.  maxmemory,设置使用多少个物理内存后拒绝后续的写入请求

    7.  redis.conf文件中vm-enabled为no

    8.  大数据量尽量按业务使用多个redis实例把数据分散开

23.  开发优化经验

    1.  一次性批量写入比多次循环写入效率要高

    2.  key的命名尽量简短

24.  Redis的info结果分析

    1.  cpu

used_cpu_sys:96894.66             #将所有redis主进程在核心态所占用的CPU时求和累计起来
used_cpu_user:87397.39           #将所有redis主进程在用户态所占用的CPU时求和累计起来
used_cpu_sys_children:6.37     #将后台进程在核心态所占用的CPU时求和累计起来
used_cpu_user_children:52.83 #将后台进程在用户态所占用的CPU时求和累计起来

    2.  memory

used_memory:327494024                 #由redis分配器分配的内存总量,以字节为单位
used_memory_human:312.32M       #以人类可读的格式返回redis分配的内存总量
used_memory_rss:587247616         #从操作系统的角度,返回redis已分配的内存总量(俗称常驻集大小)。这个值和top命令的输出一致
used_memory_peak:1866541112    #redis的内存消耗峰值(以字节为单位) 
used_memory_peak_human:1.74G #以人类可读的格式返回redis的内存消耗峰值
used_memory_lua:35840                   #lua引擎所使用的内存大小(以字节为单位)
mem_fragmentation_ratio:1.79          #used_memory_rss和used_memory之间的比率,小于1表示使用了swap,大于1表示碎片比较多
mem_allocator:jemalloc-3.6.0            #在编译时指定的redis所使用的内存分配器。可以是libc、jemalloc或者tcmalloc

 

    3.  client

connected_clients:1081       #已连接客户端的数量(不包括通过slave连接的客户端)
client_longest_output_list:0 #当前连接的客户端当中,最长的输出列表,用client list命令观察omem字段最大值
client_biggest_input_buf:0   #当前连接的客户端当中,最大输入缓存,用client list命令观察qbuf和qbuf-free两个字段最大值
blocked_clients:0                   #正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量

    4.  rdb

rdb_changes_since_last_save:28900855 #离最近一次成功生成rdb文件,写入命令的个数,即有多少个写入命令没有持久化
rdb_bgsave_in_progress:0                  #服务器是否正在创建rdb文件
rdb_last_save_time:1482358115        #离最近一次成功创建rdb文件的时间戳。当前时间戳 - rdb_last_save_time=多少秒未成功生成rdb文件
rdb_last_bgsave_status:ok                   #最近一次rdb持久化是否成功
rdb_last_bgsave_time_sec:2                #最近一次成功生成rdb文件耗时秒数
rdb_current_bgsave_time_sec:-1        #如果服务器正在创建rdb文件,那么这个域记录的就是当前的创建操作已经耗费的秒数

    5.  stats

total_connections_received:209561105 #新创建连接个数,如果新创建连接过多,过度地创建和销毁连接对性能有影响,说明短连接严重或连接池使用有问题,需调研代码的连接设置
total_commands_processed:2220123478  #redis处理的命令数
instantaneous_ops_per_sec:279                  #redis当前的qps,redis内部较实时的每秒执行的命令数
total_net_input_bytes:118515678789          #redis网络入口流量字节数
total_net_output_bytes:236361651271       #redis网络出口流量字节数
instantaneous_input_kbps:13.56                  #redis网络入口kps
instantaneous_output_kbps:31.33               #redis网络出口kps
rejected_connections:0                                   #拒绝的连接个数,redis连接个数达到maxclients限制,拒绝新连接的个数
sync_full:1                                                          #主从完全同步成功次数
sync_partial_ok:0                                             #主从部分同步成功次数
sync_partial_err:0                                            #主从部分同步失败次数
expired_keys:15598177                                #运行以来过期的key的数量
evicted_keys:0                                                 #运行以来剔除(超过了maxmemory后)的key的数量
keyspace_hits:1122202228                          #命中次数
keyspace_misses:577781396                     #没命中次数
pubsub_channels:0                                       #当前使用中的频道数量
pubsub_patterns:0                                         #当前使用的模式的数量
latest_fork_usec:15679                                 #最近一次fork操作阻塞redis进程的耗时数,单位微秒
migrate_cached_sockets:0                          

    6.  replication

# Replication(主从信息,master上显示的信息)
role:master                               #实例的角色,是master or slave
connected_slaves:1              #连接的slave实例个数
slave0:ip=192.168.64.104,port=9021,state=online,offset=6713173004,lag=0 #lag从库多少秒未向主库发送REPLCONF命令
master_repl_offset:6713173145  #主从同步偏移量,此值如果和上面的offset相同说明主从一致没延迟
repl_backlog_active:1                   #复制积压缓冲区是否开启
repl_backlog_size:134217728    #复制积压缓冲大小
repl_backlog_first_byte_offset:6578955418  #复制缓冲区里偏移量的大小
repl_backlog_histlen:134217728   #此值等于 master_repl_offset - repl_backlog_first_byte_offset,该值不会超过repl_backlog_size的大小\

# Replication(主从信息,slave上显示的信息)
role:slave                                        #实例的角色,是master or slave
master_host:192.168.64.102       #此节点对应的master的ip
master_port:9021                          #此节点对应的master的port
master_link_status:up                   #slave端可查看它与master之间同步状态,当复制断开后表示down
master_last_io_seconds_ago:0  #主库多少秒未发送数据到从库?
master_sync_in_progress:0        #从服务器是否在与主服务器进行同步
slave_repl_offset:6713173818   #slave复制偏移量
slave_priority:100                          #slave优先级
slave_read_only:1                         #从库是否设置只读
connected_slaves:0                      #连接的slave实例个数
master_repl_offset:0         
repl_backlog_active:0                  #复制积压缓冲区是否开启
repl_backlog_size:134217728   #复制积压缓冲大小
repl_backlog_first_byte_offset:0 #复制缓冲区里偏移量的大小
repl_backlog_histlen:0           #此值等于 master_repl_offset - repl_backlog_first_byte_offset,该值不会超过repl_backlog_size的大小

26.  redis实战经验

      1.  默认是开启rdb持久化的,如果关闭了,那么关闭redis服务的时候,不会保存内存中的数据到硬盘上。也就是重启redis服务,会丢失内存中的数据。

      2.  如果开启了rdb持久化,重启redis所在的服务器,那么内存中的数据会丢失;需要设置linux系统内核参数:vm.overcommit_memory = 1

27.  redis客户端jedis的使用

28.  redis集群新建key

127.0.0.1:7001> set name yangjianbo
(error) MOVED 5798 192.168.1.49:7001
127.0.0.1:7001> get name
(error) MOVED 5798 192.168.1.49:7001

    原因:这种情况一般是因为启动redis-cli时没有设置集群模式所导致。

    解决方法:redis-cli -c -p 7001

29.  启动redis报错

*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 80
>>> 'protected-mode yes'
Bad directive or wrong number of arguments

解决方法:因为配置文件版本不同

 

 

ImportError: No module named argparse

 

yum install python-argparse   

参考文档:https://www.cnblogs.com/cheyunhua/p/10598181.html

    

    

 

  

 

 

 

 

 

    

 

 

 

 

        

    

      

 

        

        

        

        

          

  

        

        

 

    

   

posted @ 2018-04-20 15:07  奋斗史  阅读(571)  评论(0)    收藏  举报