1、Redis简单介绍

276 阅读10分钟

1、Redis简介

Redis 是一个开源(BSD 许可)、内存中数据结构存储,用作数据库、缓存和消息代理。它支持数据结构,如字符串、哈希、列表、集、带范围查询的排序集、位图、超日志、具有半径查询的地理空间索引和流。Redis 具有内置复制、Lua 脚本、LRU 逐出、事务和不同级别的磁盘持久性,并且通过 Redis Sentinel 和 Redis 群集自动分区提供高可用性。(官网详解

2、Redis安装

下载官网

 [root@app1 ~]# wget http://download.redis.io/releases/redis-5.0.9.tar.gz
 [root@app1 ~]# tar -zxvf redis-5.0.9.tar.gz
 [root@app1 ~]# mv redis-5.0.9 /home/redis
 ​
 [root@app1 ~]# cd /home/redis/
 [root@app1 redis]# yum install -y gcc
 make 或 make MALLOC=libc

启动后日志报错,处理方法:

 # 报错1
 16290:M 24 Sep 2020 09:57:18.316 # 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 backlog设置值511没有成功,因为/proc/sys/net/core/somaxconn这个设置的是更小的128
 ​
 # 报错2
 16290:M 24 Sep 2020 09:57:18.316 # Server initialized
 16290:M 24 Sep 2020 09:57:18.316 # 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!在内存不足的情况下,后台程序save可能失败。建议在文件 /etc/sysctl.conf 中将overcommit_memory修改为1
 ​
 [root@app1 ~]# vim /etc/sysctl.conf
 net.core.somaxconn=1024
 vm.overcommit_memory=1
 [root@app1 ~]# sysctl -p
 ​
 # 报错3:
 16314:M 24 Sep 2020 09:58:44.540 # 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.
 # 你使用的是透明大页,可能导致redis延迟和内存使用问题,执行 echo never > /sys/kernel/mm/transparent_hugepage/enabled 修复该问题
 ​
 [root@app1 ~]# vim /etc/rc.local
 echo never > /sys/kernel/mm/transparent_hugepage/enabled
 [root@app1 ~]# source /etc/rc.local

重新启动Redis:

 3408:C 30 Sep 2020 12:47:00.818 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
 3408:C 30 Sep 2020 12:47:00.818 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=3408, just started
 3408:C 30 Sep 2020 12:47:00.818 # Configuration loaded
 3409:M 30 Sep 2020 12:47:00.820 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                 _._
            _.-``__ ''-._
       _.-``    `.  `_.  ''-._           Redis 5.0.9 (00000000/0) 64 bit
   .-`` .-```.  ```/    _.,_ ''-._
  (    '      ,       .-`  | `,    )     Running in standalone mode
  |`-._`-...-` __...-.``-._|'` _.-'|     Port: 7000
  |    `-._   `._    /     _.-'    |     PID: 3409
   `-._    `-._  `-./  _.-'    _.-'
  |`-._`-._    `-.__.-'    _.-'_.-'|
  |    `-._`-._        _.-'_.-'    |           http://redis.io
   `-._    `-._`-.__.-'_.-'    _.-'
  |`-._`-._    `-.__.-'    _.-'_.-'|
  |    `-._`-._        _.-'_.-'    |
   `-._    `-._`-.__.-'_.-'    _.-'
       `-._    `-.__.-'    _.-'
           `-._        _.-'
               `-.__.-'
 ​
 3409:M 30 Sep 2020 12:47:00.821 # Server initialized
 3409:M 30 Sep 2020 12:47:00.821 * DB loaded from disk: 0.000 seconds
 3409:M 30 Sep 2020 12:47:00.821 * Ready to accept connections

3、Redis配置文件详解

配置文件详解
daemonize noRedis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
pidfile /home/redis/redis.pidRedis默认会把pid写入/var/run/redis.pid(默认)文件,可以通过pidfile指定
port 6379指定Redis监听端口,默认端口为6379
bind 127.0.0.1指定Redis只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求(0.0.0.0)
timeout 300当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能(默认是0,连接永远不断开)
loglevel verboes指定日志记录级别
logfile "/home/redis/redis.log"日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null,可以指定发送到某个日志文件
database 16设置数据库的数量,默认数据库为0(0-15),可以使用SELECT dbid 命令在连接上指定数据库id
save 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合, Redis默认配置文件中提供了三个条件:save 900 1、save 300 10、save 60 10000
rdbcompression指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的特别大
dbfilename dump.rdb指定本地数据库文件名,默认值为dump.rdb
dir ./指定本地数据库存放目录
slaveof 设置当本机为slave服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slave-read-only yes | noslave服务只读设置,当开启时,slave服务不能写入数据,只能同步master数据
masterauth 当master设置密码是,slave服务连接master的密码
requirepass passwd设置redis连接密码,设置后redis客户端连接需要认证 auth passwd
maxclients 128设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxmemory 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
appendonly yesno指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendfilename appendonly.aof指定更新日志文件名,默认为src/appendonly.aof
appendfsync everysec指定更新日志条件,共有3个可选值:no表示等操作系统进行数据缓存同步到磁盘(快)、always表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)、everysec表示每秒同步一次(折中,默认值)
cluster-enabled yes开启集群功能
cluster-config-file nodes-7001.conf集群信息配置文件自动生成 默认位置src/nodes_6379.conf
cluster-node-timeout 15000cluster节点通信时间
aof-use-rdb-preamble混合持久化(RDB持久化以及AOF持久化混合写入AOF文件,这样做的好处是可以结合 rdb 和 aof 的优点, 快速加载同时避免丢失过多的数据,缺点是 aof 里面的 rdb 部分就是压缩格式不再是 aof 格式,可读性差)
repl-disable-tcp-nodelay禁用 TCP_NODELAY:no ,不禁用,双重否定等于肯定,即启用 ,TCP_NODELAY=on; 禁用 TCP_NODELAY:yes,就是禁用, TCP_NODELAY=off。 启用 TCP_NODELAY 时,无网络延迟,主服务器的命令无论大小都会及时发送给从节点,此时会增加网络带宽的消耗。适合主从网络环境良好的场景。 禁用 TCP_NODELAY 时,主从节点的通信会受到网络拥塞控制,Linux 内核会做出一定的优化,如合并较小的 TCP 数据包从而节省带宽。默认发送时间间隔取决 Linux 内核,一般默认为 40 毫秒。适合垮机房部署的情况。
slave-priority 100适用Sentinel模块(unstable,M-S集群管理和监控),需要额外的配置文件支持。slave的权重值,默认100.当master失效后,Sentinel将会从slave列表中找到权重值最低(>0)的slave,并提升为master。如果权重值为0,表示此slave为"观察者",不参与master选举
 # 开启redis
 ​
 [root@app1 src]# ./redis-server ../redis.conf
 ​
 # 关闭redis
 [root@app1 src]# ./redis-cli -h 127.0.0.1 -p 6379 -a qwer -c shutdown
 ​
 # h:host 
 # p:port 
 # a:auth 
 # c:comand

4、Redis修改配置

修改配置文件方法(在不重启实例情况下):修改日志等级

Redis默认的设置为verbose,开发测试阶段可以用debug,生产模式一般选用notice

  • debug:会打印出很多信息,适用于开发和测试阶段
  • verbose(冗长的):包含很多不太有用的信息
  • notice:适用于生产模式
  • warning : 警告信息
 10.224.192.209:7000> CONFIG GET loglevel
 1) "loglevel"
 2) "verbose"
 ​
 10.224.192.209:7000> CONFIG SET loglevel notice
 OK
 ​
 10.224.192.209:7000> CONFIG GET loglevel
 1) "loglevel"
 2) "notice"

Redis的危险命令主要有:

flushdb:清空数据库 flushall:清空所有记录,数据库 config:客户端连接后可配置服务器,禁用了此条命令以后,即使是自己也无法连接redis 动态修改配置了,所以建议更改名称。 keys:客户端连接后可查看所有存在的键 作为服务端,我们常常需要禁用以上命令来使服务器更加安全。

 rename-command FLUSHALL ""
 rename-command FLUSHDB  ""
 rename-command CONFIG   "SAFECONFIG"
 rename-command KEYS     ""

5、Redis INFO

localhost:6371> info

 # Server
 redis_version:5.0.9                       # redis 版本
 redis_git_sha1:00000000
 redis_git_dirty:0
 redis_build_id:c2153235e2964534
 redis_mode:cluster
 os:Linux 2.6.32-696.el6.x86_64 x86_64     # 运行系统内核版本
 arch_bits:64                              # 系统
 multiplexing_api:epoll                    # redis的事件循环机制
 atomicvar_api:sync-builtin
 gcc_version:4.4.7                         # GCC版本号
 process_id:7191                           # redis当前进程号
 run_id:3f465afebb6c6cb7f3745e5e3fe01474544bfdc4
 tcp_port:7001
 uptime_in_seconds:605372                  # 运行时间(秒)
 uptime_in_days:7                          # 运行时间(天)
 hz:10
 configured_hz:10
 lru_clock:8115510
 executable:/home/redis/src/./redis-server
 config_file:/home/redis/redis-cluster/data1/redis.conf    #配置文件路径
 # Clients
 connected_clients:1                   # 客户端连接数
 client_recent_max_input_buffer:2      # 当前客户端最大输出列表
 client_recent_max_output_buffer:0     # 当前客户端最大输入列表
 blocked_clients:0                     # 被阻塞的客户端数
 # Memory
 used_memory:1578296             # 使用内存B
 used_memory_human:1.51M         # 使用内存MB
 used_memory_rss:3833856         # 使用内存总量(包括碎片)
 used_memory_rss_human:3.66M
 used_memory_peak:2690160        # 使用内存最高峰B
 used_memory_peak_human:2.57M    # 使用内存最高峰MB
 used_memory_peak_perc:58.67%
 used_memory_overhead:1499640
 used_memory_startup:1449760
 used_memory_dataset:78656
 used_memory_dataset_perc:61.19%
 allocator_allocated:1642792
 allocator_active:1859584
 allocator_resident:5398528
 total_system_memory:16858718208
 total_system_memory_human:15.70G
 used_memory_lua:37888
 used_memory_lua_human:37.00K
 used_memory_scripts:0
 used_memory_scripts_human:0B
 number_of_cached_scripts:0
 maxmemory:0
 maxmemory_human:0B
 maxmemory_policy:noeviction
 allocator_frag_ratio:1.13
 allocator_frag_bytes:216792
 allocator_rss_ratio:2.90
 allocator_rss_bytes:3538944
 rss_overhead_ratio:0.71
 rss_overhead_bytes:-1564672
 mem_fragmentation_ratio:2.50
 mem_fragmentation_bytes:2297808
 mem_not_counted_for_evict:114
 mem_replication_backlog:0
 mem_clients_slaves:0
 mem_clients_normal:49694
 mem_aof_buffer:114
 mem_allocator:jemalloc-5.1.0
 active_defrag_running:0
 lazyfree_pending_objects:0
 # Stats
 total_connections_received:494226       # 总计连接请求
 total_commands_processed:107427         # 总结执行命令
 instantaneous_ops_per_sec:0             # 每秒执行个数
 total_net_input_bytes:82256300
 total_net_output_bytes:84286476
 instantaneous_input_kbps:0.19
 instantaneous_output_kbps:0.21
 rejected_connections:0                  # 因最大客户端限制而被拒绝连接的个数
 sync_full:1
 sync_partial_ok:0
 sync_partial_err:1
 expired_keys:0                          # 总过期key数量
 expired_stale_perc:0.00
 expired_time_cap_reached_count:0
 evicted_keys:0
 keyspace_hits:1
 keyspace_misses:0
 pubsub_channels:0
 pubsub_patterns:0
 latest_fork_usec:337
 migrate_cached_sockets:0
 slave_expires_tracked_keys:0
 active_defrag_hits:0
 active_defrag_misses:0
 active_defrag_key_hits:0
 active_defrag_key_misses:0
 # Replication
 role:master                             # 角色,这里为master
 connected_slaves:0                      # 有几个连接的slvae
 master_repl_offset:0
 second_repl_offset:-1
 repl_backlog_active:0
 repl_backlog_size:1048576
 repl_backlog_first_byte_offset:1
 repl_backlog_histlen:150459
 ​
 # CPU
 used_cpu_sys:364.685559                 # redis server的sys cpu使用率
 used_cpu_user:451.414374                # redis server的user cpu使用率
 used_cpu_sys_children:0.001999          # 后台进程的sys cpu使用率
 used_cpu_user_children:0.000000         # 后台进程的user cpu使用率
 ​
 # Cluster
 cluster_enabled:0                       # 集群enabled
 ​
 # Keyspace
 db0:keys=1,expires=0,avg_ttl=0          # db0数据库,一共有多少个key,过期key,带生存期的key数量