Redis介绍和部署


前言: 在本人学习docker的过程中,课程设计到了redis数据库,由于后续docker需要以redis为例,故暂停docker的学习,先学习了解redis,在学习过程中写下本篇文章,方便后续复习。

概述

简介

redis,全称remote dictionary server,远程字典服务,由意大利人Antirez使用C语言编写,redis是一个支持网络、可基于内存亦可持久化的日志型、nosql开源内存数据库,其提供多种语言的api。从2010年3月15日起,redis的开发工作由VMware主持。从2013年5月开始,redis的开发由pivotal赞助。

redis之所以被称为字典服务,是因为redis是一个key-value(键值对)存储系统。支持存储的value类型很多,包括string(字符串)、list(链表)、set(集合)、zset(有序集合)、hash(哈希)等。

NoSQL :泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。

1、键值存储数据库:像map一样的Key-Value对,典型代表就是redis

2、列存储数据库:关系型数据库是典型的行存储数据库,其存在的问题是,按行存储的数据在物理层面占用的是连续存储空间,不适合存储海量数据(这也是关系型数据库面对web2.0力不从心的原因)。而对应的列存储则可以实现分布式存储,适合海量存储,典型代表是HBase。

3、文档型数据库:经典代表是mongoDB,其是关系型数据库和非关系型数据库的结合。

4、图形数据库:用于存放一个节点关系的数据库,例如描述不同人的关系,典型代表是neo4J。

用途

在解释redis的用途之前,先讲述一下数据库在生产环境中的运行模式:用户根据需求去请求服务器上的应用,应用再去后端数据库提取数据,再返回给用户。

举个实际的例子,在浏览器上访问百度官网,实际上是百度后端的数据库给我们返回官网页面的内容信息,但是如果有100万个人同时访问百度官网,那么后端的数据库压力会非常大,如果在应用和后端数据库中间再加一个缓存数据库,当第一个用户请求数据返回时,会先在缓存数据库保留一份,再返回给用户,第二个用户请求同样的内容时,会直接从缓存数据库中获取到数据,这样会很大程度上缓解后端服务器的压力。

用户(请求数据)–》应用(接收请求)–》后端数据库(搜素数据并返回给应用)–》应用(返回给用户)

用户–》应用–》缓存数据库–》后端数据库–》应用–》用户

具体的运行模式是,用户向应用请求数据,应用先在缓存数据库中找,如果有就直接返回,没有就去后端数据库搜索,找到了后先在缓存数据库中保留一份,再返回给用户。

这样也存在几个问题:

  1. 当高并发时,大量用户去请求数据,本质上是请求后端数据库变为了请求缓存数据库,这样还是存在崩溃的风险?
    用户请求缓存时,缓存数据库中存放的是对应的key-value值,而后端数据库还需要去检索搜寻,所以缓存的压力会小很多。
  2. 举个例子,后端数据库中记录张三的年龄为20,并且此数据已经记录在缓存数据库中,后续张三想要修改年龄,执行写操作时会跳过缓存数据库,直接对后端数据库执行,此时后端数据库中已经修改了年龄,但是另一个用户来请求张三的年龄时,是否会直接从缓存数据库获取到数据,但是这样获取到的数据是错误的。

针对上面的问题就需要提到redis缓存数据的分类:

实时同步数据: 要求缓存中的数据必须与后端服务器中的数据保持一致,只要后端的数据发生了变化,缓存中的数据立刻消失,用户下一次请求时,重新建立缓存数据。

阶段性同步数据: 为缓存中的数据添加了“生存时长”,当时长过期后,缓存中是数据会自动消失,下一次用户请求数据时,会请求到后端数据库,经过缓存数据库,再返回给用户。

如果每次第一个用户的请求会发送给后端服务器,这就会导致第一个用户的等待时间比其他用户长很多,在实际环境中为了避免这种情况,在服务正式上架对用户开放之前,会经过warmup(预热),目的就是将一些阶段性数据提前加载到缓存中,避免第一个用户的请求等待时间过长。

特性

能够做缓存数据库的产品有很多种,例如memched、MyBatis等,redis能在它们中脱颖而出是因为redis具备了其他产品没有的特性。

  1. 性能极高:redis读的速度能达到11w次/s,写的速度能达到8w次/s。之所以能有这么高的性能,是因为redis具备了以下几点。(1)redis所有的操作都是在内存中发送的。(2)redis使用C语言开发。(3)redis源码非常精细。
  2. 简单稳定:1.0至2.0版本大约有2万行,3.0版本增加了集群功能,大约有5万行。
  3. 持久化:redis内存中的数据可以进行持久化,有RDB和AOF两种方式。
  4. 高可用集群:redis提供了高可用的主从集群,可以确保系统的安全性。
  5. 丰富的数据类型:redis是一个key-value存储系统。支持存储的value类型很多,包括string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型)等。还有bitmap(用于大数据量的二值性统计)、hyperloglog(对数据量庞大的日志做去重统计)、geospatial(用于地理位置相关的计算)类型。
  6. 强大的功能:redis提供了数据过期功能、发布/订阅功能、简单事务功能,支持lua脚本扩展功能。
  7. 客户端语言广泛:redis提供了简单的TCP通信协议,编程语言可以方便的接入redis。
  8. 支持ACL权限控制:在redis6之前,对于权限的管理比较笨拙,在redis6引入了ACL模块,可以对不同的用户定制不同的用户权限。 ACL(Access Contro List,访问控制列表,是一种粒度的权限管理策略,可以针对任意用户和组进行权限控制。Linux、unix默认的是UGO[user,group,other]权限控制策略,属于粒度,举个例子,有一个文件属主属组都是张三,现在要针对李四用户对此文件的权限做配置,只能在other上设置,但是无法只针对李四一人设置规则,这就是粒度,而ACL可以只针对李四用户做限制,也就是粒度)。
  9. 支持多线程IO模型:redis6.0版本之前采用的是单线程模型,6.0版本后支持多线程模型。

IO模型

redis客户端提交的请求被redis处理的过程、redis处理客户端请求所用的处理架构,被称为redis的IO模型。不同版本的redis所采用的IO模型是不同的。

单线程模型

在redis3.0及其之前版本,都是采用的“纯粹的单线程模型”,即所有客户端的请求全部由一个线程处理。运行模型如下图所示:

在这里插入图片描述

客户端发起请求,通过socket套接字连接至事件分发器,事件分发器会将用户的请求进行排序放入到任务列表,再通过后续的主线程调用任务,分发给对应的事件处理器。

redis属于内存数据库,调用的数据都在内存中,所以不管是调用还是处理数据都非常快,单线程处理数据的能力能够满足一般的业务需求。

混合线程模型

由于redis属于内存数据库,与docker一样会涉及到持久化的问题,而持久化的任务并不是处理用户的请求,所以如果是单线程来处理,会占用资源,耽误处理用户请求,使用混合线程就可以避免此问题,主线程会复制出多个临时子线程,用于处理类似持久化的耗时的任务,处理结束后会自动消失。

在这里插入图片描述

多线程模型

内存的响应时间是100ns,redis理论上1秒可以处理 1s/100ns=109ns/100ns=107=1kw次,但是redis每秒能处理8w~11w次读写请求,对于性能有着很大的限制。不光是读写的限制,现在的cpu都是多核的,而单线程就意味着只会使用一个cpu来处理,对于硬件也是极大浪费。

而多线程结合了单线程的优势

在这里插入图片描述

可以发现多线程有多个事件分发器用来接收用户请求,方式类似于轮询,请求1分给分发器1,请求2给分发器2,请求3给分发器3,请求4给分发器1…

当事件分发器接收请求后,会交给后面的线程,再由线程解析用户请求并写入到任务队列中,最后由主线程处理。这样就避免了命令执行顺序的问题,主线程只需要处理命令即可。

但是严格意义上来说,这里的多线程也是一种混合线程,因为他分发出来的子线程,只用于处理客户端请求,实际上处理任务的还是只有一个线程,如果有任务挤压,也会影响到性能。

安装部署

部署redis需要先按照gcc和gcc -c++

[root@test2 ~]# yum -y install gcc gcc-c++

进入redis官网(redis.io)下载

[root@test2 ~]# wget https://download.redis.io/releases/redis-7.0.14.tar.gz 
[root@test2 ~]# tar -xf redis-7.0.14.tar.gz -C /usr/local/
[root@test2 ~]# cd /usr/local/
[root@test2 local]# ls
bin  etc  games  include  lib  lib64  libexec  nginx  redis-7.0.14  sbin  share  src
[root@test2 local]# mv redis-7.0.14 redis
[root@test2 local]# cd redis/
[root@test2 redis]# ls 
00-RELEASENOTES  CODE_OF_CONDUCT.md  COPYING  MANIFESTO  README.md    TLS.md  redis.conf  runtest-cluster    runtest-sentinel  src    utils
BUGS             CONTRIBUTING.md     INSTALL  Makefile   SECURITY.md  deps    runtest     runtest-moduleapi  sentinel.conf     tests
#编译并安装
[root@test2 redis]# make && make install


启停方式

运行redis有几种方式,直接运行、放在后台运行、以守护进程方式运行。

直接运行:redis前端命令行会被占用,用于输出运行日志

[root@test2 redis]# redis-server 
155070:C 24 Oct 2023 17:07:00.276 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
155070:C 24 Oct 2023 17:07:00.276 # Redis version=7.0.14, bits=64, commit=00000000, modified=0, pid=155070, just started
155070:C 24 Oct 2023 17:07:00.276 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
155070:M 24 Oct 2023 17:07:00.276 * Increased maximum number of open files to 10032 (it was originally set to 1024).
155070:M 24 Oct 2023 17:07:00.276 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 7.0.14 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 155070
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

155070:M 24 Oct 2023 17:07:00.276 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
155070:M 24 Oct 2023 17:07:00.276 # Server initialized
155070:M 24 Oct 2023 17:07:00.276 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. 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.
155070:M 24 Oct 2023 17:07:00.276 * Ready to accept connections

放在后台运行:

会加载redis的默认配置文件,并且会在运行nohup的当前目录下生成出一个日志文件

[root@test2 redis]# nohup redis-server &
[1] 246579
[root@test2 redis]# nohup: ignoring input and appending output to 'nohup.out'

[root@test2 redis]# ls | grep nohup.out 
nohup.out
[root@test2 redis]# 

以守护进程的方式运行

修改redis的配置文件redis.conf,使其通过守护进程的方式默认运行在后台,启动时需要跟上redis配置文件的路径

#将redis配置文件中的daemonize选项改为yes,允许以守护进程的方式运行

[root@test2 redis]# sed -i "s/daemonize no/daemonize yes/g" ./redis.conf 
[root@test2 redis]# cat redis.conf | grep daemonize | grep -v "#"
daemonize yes
[root@test2 redis]# pwd
/usr/local/redis
[root@test2 redis]# redis-server /usr/local/redis/redis.conf 
[root@test2 redis]# ps aux | grep redis
root      317149  0.0  0.5  60088 10040 ?        Ssl  17:42   0:00 redis-server 127.0.0.1:6379
root      317346  0.0  0.0   9208  1168 pts/0    R+   17:42   0:00 grep --color=auto redis
[root@test2 redis]# 
 

停止运行redis

[root@test2 redis]# redis-cli shutdown 
[1]+  Done                    nohup redis-server
[root@test2 redis]# ps aux | grep redis
root      308425  0.0  0.0   9208  1124 pts/0    R+   17:40   0:00 grep --color=auto redis
[root@test2 redis]# 

基础配置

在连接redis使用前还需要进行一些配置更改。

允许其他主机连接本机的redis,默认只允许本机连接redis

#找到redis.conf中bind 127.0.0.1这一行,将其注释。
[root@test2 redis]# vim redis.conf 
#bind 127.0.0.1 -::1

关闭redis保护模式

#找到protected-mode yes ,将其改为no
[root@test2 redis]# sed -i "s/protected-mode yes/protected-mode no/g" ./redis.conf 
[root@test2 redis]# cat ./redis.conf | grep "protected-mode " | grep -v "#"
protected-mode no
[root@test2 redis]# 

设置访问控制密码

#前面介绍redis时提到了ACL权限控制,可以更细粒度的控制访问,设置控制密码后,就需要先输入密码,才能进行读写执行等操作。
#修改redis.conf中的requirepass foobared,改为requirepass 密码
[root@test2 redis]# sed -i "s/# requirepass foobared/requirepass 123/g" ./redis.conf 
[root@test2 redis]# cat ./redis.conf | grep "requirepass " | grep -v "#"
requirepass 123
[root@test2 redis]# 

修改特殊命令的执行方式

#在redis中有一些特殊命令,会直接删除整个redis中的数据,或删除当权数据库的数据,如果被恶意执行,那么后果不堪设想,所以一般会将其设置为禁用。
#通过remane-command来限制使用
[root@test2 redis]# vim ./redis.conf
[root@test2 redis]# cat ./redis.conf | grep "rename-command flush" | grep -v "#"
rename-command flushall ""
rename-command flushdb ""
[root@test2 redis]# 
rename-command flushall ""
rename-command flushdb ""
#这里是直接禁用掉了这两个命令,如果需要使用,可以在双引号中设置,例如“myflushall”

客户端分类

redis客户端与mysql一样有多种类型:命令行客户端、图形界面客户端、Java代码客户端。

命令行客户端

使用redis-cil命令进入命令行客户端

#连接其他服务器上的redis
redis-cil -h 服务器IP -p 端口号 -a 密码
#如果访问的是本机,-h可以省略,如果端口号没有修改,-p可以省略,如果没有设置密码,-a可以省略。
[root@test2 redis]# redis-cli -a 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
AUTH failed: WRONGPASS invalid username-password pair or user is disabled.
127.0.0.1:6379> 

图形界面客户端

图形界面客户端类似于navicat主要用的有以下几个:

redisplus

redis desktop manage

Java api

配置文件详解

redis配置文件redis.conf是其核心内容,默认存放在redis的安装目录下,有两千多行,这些内容根据功能被划分为了很多部分。

基础说明

# Note on units: when memory size is needed, it is possible to specify
# it in the usual form of 1k 5GB 4M and so forth:
#
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same.

#redis在指定内存大小时,会忽略大小写的限制,但是要注意1k和1kb的区别

includes

################################## INCLUDES ###################################
                                 ............
#
# be emitted.  It is safe, therefore, to include wildcard files from empty
# directories.
#
# include /path/to/local.conf
# include /path/to/other.conf
# include /path/to/fragments/*.conf

#includes模块的用法是,可以使用同一个主配置文件,在不同情况下实现不同的效果。例如测试时,只需要在本地连接redis,也不需要密码,可以在另一个文本中写入这些设置,再在主配置文件的最后指定路径。

[root@test2 ~]# vim test.conf
[root@test2 ~]# cat test.conf 
daemonize no
port 6380
requirepass 1
[root@test2 ~]# 
#在主配置文件的最后指定测试配置文件路径
[root@test2 redis]# vim redis.conf 
[root@test2 redis]# tail -n 1 redis.conf 
include /root/test.conf
[root@test2 redis]# redis-server ./redis.conf 
1043675:C 25 Oct 2023 16:32:35.925 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1043675:C 25 Oct 2023 16:32:35.925 # Redis version=7.0.14, bits=64, commit=00000000, modified=0, pid=1043675, just started
1043675:C 25 Oct 2023 16:32:35.925 # Configuration loaded
1043675:M 25 Oct 2023 16:32:35.925 * Increased maximum number of open files to 10032 (it was originally set to 1024).
1043675:M 25 Oct 2023 16:32:35.926 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 7.0.14 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6380
 |    `-._   `._    /     _.-'    |     PID: 1043675
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                   

#启动redis后发现,改为前台运行,并且端口也变成了6380,因为主配置文件最后制定了测试文件的路径,includes会去匹配相同的配置,并以最后的文件内容为准。

modules

模块扩展,redis可以通过加载不同的第三方模块来增强、扩展redis的功能。

################################## MODULES #####################################

# Load modules at startup. If the server is not able to load modules
# it will abort. It is possible to use multiple loadmodule directives.
#
# loadmodule /path/to/my_module.so
# loadmodule /path/to/other_module.so

#这种第三方的模块redis用的较少,nginx中用的比较多

network

################################## NETWORK #####################################

                               ................
# Examples:
#
# bind 192.168.1.100 10.0.0.1     # listens on two specific IPv4 addresses
# bind 127.0.0.1 ::1              # listens on loopback IPv4 and IPv6
# bind * -::*                     # like the default, all available interfaces
                               .................
#bind 127.0.0.1 -::1
#这里前面有提到,取消注释后就是只允许本机访问,后面的“-::1”是ipv6格式的本地地址
                               .................
protected-mode no
#保护模式设置为关闭
                               .................
port 6379
#默认端口
                               .................
tcp-backlog 511
#tcp-backlog是一个tcp连接的队列,主要用于解决高并发场景下客户端慢连接的问题。这里设置的值就是队列的长度。该队列与TCP连接的三次握手有关。不同的Linux内核,backlog队列存放的元素(客户端连接)的类型是不同的。
#Linux内核2.2版本之前:该队列中存放的是已经完成第一次握手的所有客户端连接,包括已经完成三次握手的客户端连接,所以此时这个队列中存在两种连接状态,未完成三次握手的连接状态为SYN_RECEIVED,已完成三次握手的连接状态为ESTABLISHED。只有ESTABLISHED状态的连接才会被redis处理。
#Linux内核2.2版本之后:TCP系统中维护了两个队列,SYN_RECEIVED队列与ESTABLISHED队列,分别用于存放未完成三次握手的连接与已经完成三次握手的连接。此时的backlog就是ESTABLISHED队列。
#关于tcp队列的连接长度,除了redis中设定的值,在Linux的配置文件中也有设置。当redis和系统TCP最大连接数设置不一致时,以最小值为准。
#查看Linux当前的内核以及TCP队列连接最大值。
[root@test2 ~]# uname -a
Linux test2 4.18.0-358.el8.x86_64 #1 SMP Mon Jan 10 13:11:20 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
[root@test2 ~]# cat /proc/sys/net/core/somaxconn 
128
[root@test2 ~]# 
#修改Linux系统中TCP最大连接数
[root@test2 ~]# echo "net.core.somaxconn=2048" >>  /etc/sysctl.conf 
[root@test2 ~]# cat /etc/sysctl.conf | grep -v "#"
net.core.somaxconn=2048
[root@test2 ~]# sysctl -p
net.core.somaxconn = 2048
[root@test2 ~]# 

                               .................
timeout 0
#超时时长,如果客户端与服务端的连接空闲时间超过了阈值,也就是timeout后面的参数,那么就会自动关闭,三分钟就是3m,一小时就是1h,设置为0就是不超时,但是redis使用的tcp连接默认是2小时的超时时长,也就是说,即使timeout设置为0,redis也会在连接空闲2小时后断开。
                               .................
tcp-keepalive 300
#客户端与服务端在传输数据的过程中,如果客户端挂了,服务端也会继续传输数据,与其他应用不同,redis的心跳检测机制是通过服务端发起,主动去检测客户端是否存活,此处tcp-keepalived设置为300秒,意为当timeout为0时,每隔300秒检测一次客户端是否存活,如果第一次检测发现不存活,不会立即断开,会再等待300秒检测第二次,如果还是不存活,才会断开。

general

################################# GENERAL #####################################
							................ 
daemonize yes
#在后台以守护进程的模式运行
							................ 
# Note that on modern Linux systems "/run/redis.pid" is more conforming
# and should be used instead.
pidfile /var/run/redis_6379.pid
#用于指定pid文件存放路径,无论redis是否以守护进程的方式运行,pid都会写入到此路径文件中。配置文件中会提示,建议使用/run/redis.pid作为此字段的参数。
#需要注意的是,如果此处没有指定pid文件路径,不同的启动方式,pid文件的产生效果是不同的。
#在后台运行时,产生pid文件,路径未配置文件中指定的路径。在前台运行时不会产生pid文件。
							................ 
loglevel notice
#日志级别,默认未notice
							................
logfile ""
#日志文件默认会采用标准输出,前提是redis在前台运行,如果使用的是后台运行redis,那么日志会被发送到/dev/null。如果想指定日志文件的输出路径,需要将双引号改为对应路径。
							................
databases 16
#数据库数量,从0开始编号。

security

设置用户ACL权限和密码相关配置,常用的是requirepass属性。

################################## SECURITY ###################################
							................
requirepass 123
#设置redis密码

clients

################################### CLIENTS ####################################
# maxclients 10000
#此模块默认是注释的,表示redis最大并发连接数,但是在Linux中系统支持的可打开文件描述符是有上限的。
[root@test2 ~]# ulimit -n
1024
[root@test2 ~]# 
#默认为1024,也就是说,即使redis设置为10000,但是还是会被此处的1024限制,此处可以通过修改配置文件来扩大数值。
#如果同时连接数达到了设置的阈值,redis会关闭新连接,并返回提示已经达到了阈值。

memory management

用于配置相关可用内存,以及相关内容移除问题。

##############################MEMORY MANAGEMENT################################
							................
# maxmemory <bytes>
#设置redis可使用的内存上限,当redis内存达到上限时,会根据选择的逐出策略maxmemory policy尝试删除符合条件的key。如果不能按照逐出策略移除key,则会给需要更多内存的写操作返回error。但是对于只读的命令没有影响。

#逐出策略,redis支持的一共有8种
# volatile-lru -> Evict using approximated LRU, only keys with an expire set.
#针对设置了过期时间的key使用lru(最长时间未使用)算法
# allkeys-lru -> Evict any key using approximated LRU.
#对所有的key使用lru算法
# volatile-lfu -> Evict using approximated LFU, only keys with an expire set.
#对设置了过期时间的key使用lfu(最近最少使用)算法
# allkeys-lfu -> Evict any key using approximated LFU.
#对所有的key使用flu算法
# volatile-random -> Remove a random key having an expire set.
#对设置了过期时间的key使用random(随机删除)
# allkeys-random -> Remove a random key, any key.
#对所有的key使用random
# volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
#移除接近到期时间的key
# noeviction -> Don't evict anything, just return an error on write operations.
#不做任何删除动作,如果内存剩余空间不足,会返回error

# maxmemory-samples 5
#lru、lfu和ttl这些算法都是模糊匹配,目的就是为了节约内存,通过设置maxmemory-samples的值,可以设置挑选要删除的样本数量,例如设置为5,就会查找最近最少使用的5个key,再根据上面设置的具体逐出策略,进行删除。挑选样本使用的是lru算法,且不能被修改。

# maxmemory-eviction-tenacity 10
#移除容忍度,通过逐出策略晒先出的数据会根据容忍度的设定来决定溢出的速度,设置的越低,移除key的速度就越快。

threaded I/O

此模块用于配置redis对多线程io模型的支持。

################################ THREADED I/O #################################
							................
# io-threads 4
#多线程默认关闭,官方建议在机器cpu大于等于4核时开启。
							................

redis默认配置文件总共有两千多行,这里只挑选了几个常用的、具有代表性的模块进行介绍。

算法都是模糊匹配,目的就是为了节约内存,通过设置maxmemory-samples的值,可以设置挑选要删除的样本数量,例如设置为5,就会查找最近最少使用的5个key,再根据上面设置的具体逐出策略,进行删除。挑选样本使用的是lru算法,且不能被修改。

maxmemory-eviction-tenacity 10

#移除容忍度,通过逐出策略晒先出的数据会根据容忍度的设定来决定溢出的速度,设置的越低,移除key的速度就越快。

### threaded I/O

此模块用于配置redis对多线程io模型的支持。


################################ THREADED I/O #################################
							................
# io-threads 4
#多线程默认关闭,官方建议在机器cpu大于等于4核时开启。
							................

redis默认配置文件总共有两千多行,这里只挑选了几个常用的、具有代表性的模块进行介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值