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

浙公网安备 33010602011771号