Learning Redis - 概念

Redis 十分的流行,学习一下,在此留底 。 Redis中文

Redis 是一个高性能的key-value数据库。

性能测试结果:SET操作每秒钟 110000 次,GET操作每秒钟 81000 次,

服务器配置如下:Linux 2.6Xeon X3320 2.5Ghz.

stackoverflow 网站使用 Redis 做为缓存服务器。

国内外3个不同领域多巨头的实践

1. Redis存储,来自淘宝搜索技术博客

2. 来自InfoQ    

为什么使用redis  

Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。

Redis 由于是单线程的,因此部署的时候为了发挥多核CPU的性能,可以考虑有CPU有多少核就装多少个实例。目前实现Shard是在客户端,根据一致性hash调用不同的Redis实例


redis内存使用优化和存储

redis复制与可扩展集群搭建

Redis 的一些相关概念

1. 持久化策略

Dump:Snapshotting(快照),当redis挂掉后会丢掉最后一次快照到挂掉时的数据,当redis挂掉后会丢掉最后一次快照到挂掉时的数据
AOF:Append-only file,Redis会将每一个收到的写命令都通过write函数追加到文件中,类似于MySQL中的binlog。默认写入文件为:appendonly.aof。当redis重启时会通过执行文件中保存的写命令来在内存中重建整个数据库内容
None:不持久化

2. 写策略

SyncMaster:同步写入
asyncMaster:异步写入

3. 读策略

MasterOnly:Redis集群中仅以主为读
SlaveOnly:Redis集群中仅以从为读
MasterFirst:Redis集群中读取数据的优先级以主为先
SlaveFirst:Redis集群中读取数据的优先级以从为先
RoundRbin:Redis集群中轮流读取数据

4. 状态

Pending:试运行
Maintaining:维护
Destroyed:已终止

5. 分片算法

Jedis:官方推荐的redis java客户端

6. 哈希算法

MD5
MurmurHash

7. 内存

  1. Redis memory:redis内存情况
  2. used_memory_rss : 从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致。
  3. used memory:由 Redis 分配器分配的内存总量,以字节(byte)为单位
  4. used_memory_peak : Redis 的内存消耗峰值(以字节为单位)

8.  参数说明

分别列出了server、clients、memory、persistence、stats等方面的信息,具体参数介绍如下:
Server:
1、redis_version :Redis 服务器版本
2、redis_git_sha1 :Git SHA1
3、redis_git_dirty :Git dirty flag
4、arch_bits :操作系统(32 或 64 位)
5、multiplexing_api :Redis 所使用的事件处理机制
6、gcc_version :编译 Redis 时所使用的 GCC 版本
7、process_id :服务器进程的 PID
8、uptime_in_seconds :自 Redis 服务器启动以来,经过的秒数
9、uptime_in_days :自 Redis 服务器启动以来,经过的天数
10、lru_clock :以分钟为单位进行自增的时钟,用于 LRU 管理 
Clients:
1、connected_clients :已连接客户端的数量(不包括通过从属服务器连接的客户端)
2、client_longest_output_list :当前连接的客户端当中,最长的输出列表
3、client_biggest_input_buf :当前连接的客户端当中,最大输入缓存
4、blocked_clients :正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量 
Memory:
1、used_memory :由 Redis 分配器分配的内存总量,以字节(byte)为单位
2、used_memory_human :以可读的格式返回 Redis 分配的内存总量
3、used_memory_rss :从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致
4、used_memory_peak :Redis 的内存消耗峰值(以字节为单位)
5、used_memory_peak_human :以可读的格式返回 Redis 的内存消耗峰值
6、used_memory_ratio :内存使用率(%)
7、mem_allocator :在编译时指定的, Redis 所使用的内存分配器。可以是 libc 、 jemalloc 或者 tcmalloc 
Persistence:
1、loading :负载转储文件是否持续的标识
2、rdb_changes_since_last_save :自上次转储的变化数
3、rdb_bgsave_in_progress :reb保存持续的标识
4、rdb_last_save_time :rdb保存成功的时间戳
5、aof_enabled:表示aof是否被激活的标识
6、aof_rewrite_in_progress:AOF是否重写的标识
7、aof_current_size:AOF当前文件大小
8、aof_base_size :AOF最新启动或重写文件大小
9、aof_pending_rewrite:一旦持续rdb保存完成标识,表示aof重写操作将完成
10、aof_buffer_length:AOF缓冲区的大小
11、aof_pending_bio_fsync:I / O队列FSYNC未决的作业数量 
Stats:
1、total_commands_processed :服务器执行命令的总数
2、total_connections_received :服务器接受的连接的总数
3、evicted_keys :命中 key 的次数
4、expired_keys :运行以来过期的 key 的数量
5、keyspace_hits :命中 key 的次数
6、keyspace_misses :不命中 key 的次数
7、latest_fork_usec :是否开启了 vm
8、pubsub_channels :当前使用中的频道数量
9、pubsub_patterns :当前使用的模式的数量 
Replication:
1、role :角色(主、从)
2、connected_slaves :从属服务器的数量
3、slaveof:设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步 
Cpu:
1、sed_cpu_sys :Redis的服务器系统CPU消耗
2、used_cpu_sys_children :系统后台进程所消耗的CPU
3、used_cpu_user :Redis的服务器用户CPU消耗
4、used_cpu_user_children :用户后台进程所消耗的CPU 
Vm:

  1. vm_enabled :是否使用虚拟内存,默认值为no

Custom:

  1. _db_expires:存储的有限期

     2. _db_keys:存储键值总数

9. 配置信息

配置信息具体参数介绍如下:
1、loglevel:指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
2、maxmemory:指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
3、maxmemory-policy:设置驱逐政策(eviction policy)
4、maxmemory-samples:LRU和minimal TTL是近似算法(为了节省内存),它们会在一个有3个键值的样本中选择较没用的那个
5、timeout:当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
6、dir:redis服务器指定本地数据库存放目录
7、dbfilename:指定本地数据库文件名,默认值为dump.rdb
8、appendonly:是否开启AOF持久化,yes开启,no不开启
9、slowlog-max-len:慢日志的最大长度是128,当慢日志超过128时,最先进入队列的记录会被踢出来,慢日志会消耗内存,你可以使用SLOWLOG RESET清空队列回收这些内存
10、appendfsync:指定更新日志条件,共有3个可选值: 
no:表示等操作系统进行数据缓存同步到磁盘(快) 
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) 
everysec:表示每秒同步一次(折衷,默认值)
11、4、auto-aof-rewrite-min-size:启动重写Aof log时,Aof log的最小大小
12、auto-aof-rewrite-percentage:当Aof log增长超过指定比例时,重写log file, 设置为0表示不自动重写Aof log
13、no-appendfsync-on-rewrite:如果为yes,当BGSAVE或BGREWRITEAOF指令运行时,即把AOF文件转写到RDB文件中时,会阻止调用fsync()
14、save:指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save <seconds> <changes>
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
15、hash-max-zipmap-entries:如果Hash中字段的数量小于参数值,Redis将对该Key的Hash Value采用特殊编码。
16、hash-max-zipmap-value:如果Hash中各个字段的最大长度不超过512字节,Redis也将对该Key的Hash Value采用特殊编码方式
17、list-max-ziplist-entries:配置元素个数最多512个
18、list-max-ziplist-value:配置value最大为64字节
19、set-max-intset-entries:如果set中整型元素的数量不超过512时,Redis将会采用该特殊编码。
20、zset-max-ziplist-entries:类似于上面
21、zset-max-ziplist-value:类似于上面
22、slowlog-log-slower-than:当某个请求执行时间(不包括IO时间)超过10000微妙(10毫秒),把请求记录在慢日志中 ,如果为负数不使用慢日志,如果为0强制记录每个指令

10. 集群参数
1、_cpu_usage_children_perc:后台子进程CPU使用率
2、_cpu_usage_perc:CPU使用率
3、_evicted_keys_per_sec:每秒置换键值总数
4、_expired_keys_per_sec:每秒过期的键值总数
5、_keyspace_hits_perc:查询命中率
6、_maxmemory:置最大内存,达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,任到达最大内存设置,将无法再进行写入操作
7、_rejected_connections_per_sec:每秒拒绝连接数
8、_total_commands_processed_per_sec:每秒执行命令数
9、_total_connections_received_per_sec:每秒新建连接数
10、aof_current_rewrite_time_sec:aof重写操作的持续时间
11、aof_delayed_fsync:延迟FSYNC计数器
12、aof_last_bgrewrite_status:AOF重写的最后操作的状态
13、aof_last_rewrite_time_sec:aof最后一次写操作的持续时间
14、aof_rewrite_buffer_length:AOF重写缓冲区的大小
15、aof_rewrite_scheduled:一旦持续rdb保存完成标识,表示aof重写操作将完成
16、cluster_enabled :Redis的群集启用
17、connected_clients :已连接客户端的数量(不包括通过从属服务器连接的客户端)
18、instantaneous_ops_per_sec:每秒处理的命令数
19、loading_eta_seconds :设置eta的负载完整时间
20、loading_loaded_bytes :已加载的字节数
21、loading_loaded_perc :已加载的相同的值的百分比表示
22、loading_start_time :在加载操作开始的时间戳
23、loading_total_bytes :总文件大小
24、master_host :主服务器的主机名或IP
25、master_last_io_seconds_ago :自上次与主服务器互动的秒数
26、master_link_down_since_seconds :中断以后连接的秒数
27、master_link_status :连接状态(up/down)
28、master_port :主服务器的端口号
29、master_sync_in_progress :主机同步到从服务器
30、master_sync_last_io_seconds_ago :主服务器最后一次同步从服务器io传输的秒数
31、master_sync_left_bytes :离开之前完成的同步字节数
32、mem_fragmentation_ratio :used_memory_rss 和 used_memory 之间的比率
33、os :Redis 服务器的宿主操作系统
34、rdb_current_bgsave_time_sec :reb保存持续时间
35、rdb_last_bgsave_status :RDB最后保存的状态
36、rdb_last_bgsave_time_sec :rdb最后保存的持续时间以秒表示
37、rejected_connections :因为MaxClients的限制,拒绝的连接数
38、run_id :Redis 服务器的随机标识符(用于 Sentinel 和集群)
39、slowlog_len :慢日志长度
40、tcp_port :TCP/IP 监听端口
41、used_memory_lua :Lua 引擎所使用的内存大小(以字节为单位)

配置列:
1、activerehashing:指定是否激活重置哈希,默认为开启
2、bind:绑定的主机地址
3、client-output-buffer-limit:
4、daemonize:Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
5、databases:设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
6、hash-max-ziplist-entries:含义基本等同于hash-max-zipmap-entries两个和Hash相关的参数,只是作用的对象类型为List
7、hash-max-ziplist-value:含义基本等同于hash-max-zipmap-value两个和Hash相关的参数,只是作用的对象类型为List
8、logfile:日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
9、lua-time-limit:一个Lua脚本最长的执行时间为5000毫秒(5秒),如果为0或负数表示无限执行时间。
10、masterauth:当master服务设置了密码保护时,slav服务连接master的密码
11、maxclients:设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
12、maxmemory:指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机 制,会把Key存放内存,Value会存放在swap区
13、maxmemory-policy:设置驱逐政策(eviction policy)
14、maxmemory-samples:LRU和minimal TTL是近似算法(为了节省内存),它们会在一个有3个键值的样本中选择较没用的那个
15、28、pidfile:当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
16、port:指定Redis监听端口,默认端口为6379
17、rdbchecksum:存储和加载rdb文件时是否校验
18、rdbcompression:指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
19、repl-disable-tcp-nodelay:
20、repl-ping-slave-period:slave发送ping给master的时间间隔,单位是秒
21、repl-timeout:Bulk transfer I/O超时,或ping响应超时,单位是秒,值必须要比repl-ping-slave-period大
22、requirepass:设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
23、slave-priority:如果master不能再正常工作,那么会在多个slave中,选择优先值最小的一个slave提升为master,优先值为0表示不能提升为master
24、slave-read-only:如果为yes,slave实例只读,如果为no,slave实例可读可写
25、slave-serve-stale-data:当slave失去与master的连接,或正在拷贝中,如果为yes,slave会响应客户端的请求,数据可能不同步甚至没有数据,如果为no,slave会返回错误"SYNC with master in progress"
26、slaveof:设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
27、stop-writes-on-bgsave-error:后台存储错误是否停止写
28、tcp-keepalive: 验证tcp的激活状态
29、unixsocket:连接本地unix系统的socket
30、unixsocketperm:连接本地unix系统的socket
31、watchdog-period:watchdog-period参数,其值单位为毫秒,运行时间超过指定毫秒的操作将会被记录下来
32、shard:分片
33、address:ip地址和对应的端口号
34、redis_instance:redis实例
35、redis_master:redis主服务器
36、redis_slave:redis从发服务器
37、alive:存活性

11. 监控参数

  1. memory:数据占用内存量
  2. cpu_usage_perc:每秒中cpu使用率

      3. clients:每秒中客户端链接数

  1. mem_fragmentation_ratio:内存碎片率
  2. client_lol:client_longest_output_list,当前连接的客户端当中,最长的输出列表
  3. client_bib:client_biggest_input_buf,当前连接的客户端当中,最大输入缓存
  4. slowlog:慢日志
  5. cps:每秒中新建连接数
  6. ops:每秒中操作数
  7. rejected_connections_per_sec:拒绝连接数

10、hits_perc:命中率
11、k_db:存储键值总数
12、expired_ecicted_kps:每秒中过期并被逐出的key


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页