文章目录
- 一、何为Redis
- 二、安装及使用
- 2.1安装步骤
- 2.2连接步骤
- 2.2.1本地连接
- 2.2.2外网连接
- 三、概念介绍
- 3.1RDB(Redis DataBase)
- 3.2AOF(Append Only File)
- 3.3主从复制
- 四、常用控制台命令
- 4.1key相关
- 4.2String相关
- 4.3list相关
- 4.4set相关
- 4.5hash相关
- 4.6zset相关
- 4.7bitmap
- 4.8其他
- 五、参数配置介绍
- 5.1基本配置
- 5.2RDB相关配置
- 5.3主从复制相关配置
- 5.4AOF相关配置
- 5.5Cluster集群相关配置
一、何为Redis
Redis是一个使用ANSI C编写,遵守BSD协议,基于内存运行并支持日志持久化的Key-Value的nosql数据库。其value支持String,Hash,List,Sets和Sorted Sets。
二、安装及使用
2.1安装步骤
1.下载地址:http://download.redis.io/releases/redis-6.0.6.tar.gz 2.安装c相关应用,防止编译redis报错,如果已经安装可以跳过。
yum install gcc
使用gcc -v命令查看gcc版本,如果低于5.3则还需要执行以下命令
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
3.解压:tar -xzvf redis-6.0.6.tar.gz。
4.编译:先cd redis-6.0.6,再make(如果发生错误执行make distclean找到错误再重新make)。
5.(可选)安装redis图形化管理工具:https://github.com/uglide/RedisDesktopManager/releases/tag/0.9.3
2.2连接步骤
2.2.1本地连接
1.将redis解压目录的redis.conf复制到/usr/local/bin目录
2.使用/usr/local/bin/redis-server /usr/local/bin/redis.conf启动redis
3.使用/usr/local/bin/redis-cli -h 127.0.0.1命令登录redis
2.2.2外网连接
1.将redis解压目录的redis.conf复制到/usr/local/bin目录
2.修改复制后的redis.conf,先使用ip addr命令获取主机内网ip,将bind 127.0.0.1修改为bind加刚刚查到的ip,并将protected-mode yes修改为protected-mode no。
3.也有一种不修改protected-mode的方法,就是将bind 127.0.0.1注释,不过该配置会让所有人都可以访问redis
4.使用/usr/local/bin/redis-server /usr/local/bin/redis.conf启动redis
5.关闭6379端口防火墙
三、概念介绍
3.1RDB(Redis DataBase)
redis的一种持久化策略。redis通过配置定时或者手动执行命令,创建一个与当前redis进程一模一样的子进程进行持久化操作,将内存中的数据存进一个临时文件中,持久化结束后替换上一次的rdb文件。当redis进程意外中断时可以依靠rdb文件还原数据。
常用相关配置:dbfilename,dir,save。
常用控制台命令:bgsave,save。
3.2AOF(Append Only File)
redis的一种持久化策略。redis将新增,变更,删除操作通过操作日志的形式写入文件,当redis进程意外中断时可以依靠产生的aof日志还原数据。
aof文件有两种格式:
第一种是以指令解析的方式储存的:
第二种是以RDB格式储存的,空间更小,在执行bgrewriteaof时产生。
3.3主从复制
主从复制,是指将一台redis服务器(master)的数据单向复制到其他redis服务器(slave)的过程。一个主节点可以有多个从节点,一个从节点只能有一个主节点。
redis3.0以后规定一共有16384个槽位,可以散列分布在所有主节点上,且主节点的个数必须超过3个。
四、常用控制台命令
中文翻译版doc链接:http://redisdoc.com/
4.1key相关
# 查看当前库下所有的key
keys *
# 查看key类型
type [key]
# 查看某个key是否存在
exists [key]
# 设置某个key在seconds秒后失效
expire [key] [seconds]
# 把某个key移动到db去
move [key] [db]
# 查看key还有多少秒过期,-2表示已过期,-1表示永不过期
ttl [key]
4.2String相关
string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M
# 增&改
set [key] [value]
# 查
get [key]
# 删
del [key]
# 如果key存在则把value拼在后面
append [key] [value]
# 查询key的长度
strlen [key]
# 将指定的key值加一,如为字符串则设置key为1
incr [key]
# 将指定的key值减一,如为字符串则设置key为-1
decr key 为指定key的值减一
# 为指定key的值加value
incrby [key] [value]
# 为指定key的值减value
decrby [key] [value]
4.3list相关
list为一个字符串链表
# 将一个或多个值放入链表头部
lpush [key] [value1] [value2]
# 将一个或多个值放入链表尾部
rpush [key] [value1] [value2] 将一个或多个值加入到列表底部
# 删除从start开始到end位置的值
lrange [key] [start] [end]
# 删除链表头部元素
lpop [key]
# 删除链表尾部元素
rpop [key]
# 通过索引获取链表中的元素
lindex [key] [index ]
# 获取链表长度
llen [key]
# 从头部开始删除num个值为value的元素
lrem [key] [num] [value]
# 删除从start开始到end位置的值
ltrim [key] [start]
4.4set相关
Set是string类型的无序,不能重复的集合。
# 向集合中添加一个或多个元素
sadd [key] [value1] [value2]
# 返回集合中所有元素
smembers [key]
# 判断value是否在key中
sismembers [key] [value]
# 获取集合中元素个数
scard [key]
# 删除集合中指定元素
srem [key] [value]
# 从集合中取出num个值
srandmember [key] [num]
# 随机删除集合中的元素
spop key
# 将集合key1中的value移动到key2中
smove [key1] [key2] [value]
# 差集,返回在key1中不在key2中的值
sdiff [key1] [key2]
# 交集,返回在key1和key2中都存在的值
sinter [key1] [key2]
# 并集
sunion [key1] [key2]
4.5hash相关
hash 是一个键值对集合,适合存储对象。
# 将key1对象的key2属性设置为value
hset [key1] [key2] [value]
# 获取key1对象的key2属性
hget [key1] [key2]
# 向哈希表key中添加多个属性
hmset [key] [key1] [value1] [key2] [value2] [key3] [value3]
# 获取哈希表key中多个属性
hmget [key] [key1] [key2] [key3]
# 获取哈希表key中所有的属性和值
hgetall [key]
# 删除哈希表key中一个或多个属性
hdel [key] [key1] [key2]
# 获取哈希表中属性数量
hlen [key]
# 查看哈希表中指定字段是否存在
hexits [key1] [key2]
# 获取哈希表中所有属性名
hkeys [key]
# 获取哈希表中所有属性值
hvals [key]
4.6zset相关
zset 和 set 一样也是string类型元素的集合,他通过score来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但score却可以重复但必须为数字。
# 向有序集合中添加一个或多个值,
zadd [key] [score] [value] [score2] [value2]
# 获取集合从下标start到end的所有值,end为-1时返回全部值
zrange [key] [start] [end]
# 获取集合分数从start到end的值
zrangebyscore [key] [start] [end]
# 根据score从集合获取key的值
zrem [key] [score]
# 获取集合中元素个数
zcard [key]
# 获取分数从start到end的元素个数
zcount [key] [start] [end]
# 获取集合中值为value排序后的下标
zrank [key] [value]
# 获取集合中值为value的score
zscore [key] [value]
4.7bitmap
bitmap本质是string,是一串连续的2进制数字,和string类型一样最大可以存储512M数据
setbit [key] [0/1]
# 获取位图第num位
getbit [key] [num]
# 计算给定字符串中,被设置为1的比特位的数量。
bitcount [key]
# 从start开始end结束第一个0/1的下标,start和end可以不填
bitpos [key] [0/1] [start] [end]
4.8其他
# 获取当前库key的数量
dbsize
# 打开aof持久化功能,重启失效
config set appendonly
# 在当前进程开始rdb持久化,由于redis是单线程的,会造成线程阻塞
save
# 复制当前线程一个完全一样的进程进行rdb持久化,几乎不会阻塞(调用复制进程函数时会阻塞,但是实际忽略不计)
bgsave
# 异步执行一个aof文件重写操作。重写会创建一个当前aof文件的体积优化版本。
bgrewriteaof
五、参数配置介绍
5.1基本配置
# 指定可以访问redis的ip,如果注释则公开外网访问。
bind 127.0.0.1
# 禁止外网访问redis,仅当bind参数存在和设置了密码时生效
protected-mode yes
# 指定Redis的端口
port 6379
# 此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度,
# 在高并发环境下你需要一个高backlog值来避免慢客户端连接问题,但是不能大于Linux系统定义的/proc/sys/net/core/somaxconn值
tcp-backlog 511
# 客户端闲置多长时间后自动关闭,单位秒,为0时等于关闭
timeout 0
# 设置多长时间检测死连接 单位为秒,如果设置为0,则不会进行检测
tcp-keepalive 300
# 是否以守护进程启动,设置为yes相当于挂在后台
daemonize no
# 当redis以守护进程启动时将自动生成该文件,如果在一台服务器启动多个redis需要修改此配置和相应的端口
pidfile /var/run/redis_6379.pid
# 设置日志的级别debug、verbose、notice、warning
loglevel notice
# 日志文件的位置,当指定为空字符串时,为标准输出,如果redis已守护进程模式运行,那么日志将会输出到 /dev/null 。
logfile ""
# 设置数据库的数目
databases 16
5.2RDB相关配置
# 当900秒内有1个更改,300秒内有10个更改以及60秒内有10000个更改时自动进行rdb持久化
# 如果想禁用RDB持久化的策略,只要不设置任何save指令,或者给save传入一个空字符串
save 900 1
save 300 10
save 60 1
# 默认情况下,如果 redis 最后一次的后台保存失败,redis 将停止接受写操作,这样以一种强硬的方式让用户知道数据不能正确的持久化到磁盘,
# 否则就会没人注意到灾难的发生。 如果后台保存进程重新启动工作了,redis 也将自动的允许写操作。
stop-writes-on-bgsave-error yes
# 是否开启LZF算法压缩
rdbcompression yes
# 存储快照时是否进行CBC64算法校验数据正确性
rdbchecksum yes
# rdb文件的名字
dbfilename dump.rdb
# dbfilename文件存放目录。默认/usr/local/bin生成在目录下
dir ./
# 如果为 yes(默认值) ,slave 仍然会应答客户端请求,但返回的数据可能是过时,或者数据可能是空的在第一次同步的时候
# 如果为 no ,在你执行除了 info 和 salveof 之外的其他命令时,slave 都将返回一个 "SYNC with master in progress" 的错误。
replica-serve-stale-data yes
replica-priority 100
# 设置Redis连接密码
requirepass foobared
# 设置同一时间最大客户端连接数,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,
# 如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxclients 10000
# 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,
# 当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。
# Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory <bytes>
# 当内存使用达到最大值时,redis使用的清除策略。有以下几种可以选择(明明有6种,官方配置文件里却说有5种可以选择?):
# 1)volatile-lru 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
# 2)allkeys-lru 利用LRU算法移除任何key
# 3)volatile-random 移除设置过过期时间的随机key
# 4)allkeys-random 移除随机key
# 5)volatile-ttl 移除即将过期的key(minor TTL)
# 6)noeviction 不移除任何key,只是返回一个写错误 。默认选项
maxmemory-policy noeviction
# LRU 和 minimal TTL 算法都不是精准的算法,但是相对精确的算法(为了节省内存),随意你可以选择样本大小进行检测。redis默认选择5个样本进行检测,你可以通过maxmemory-samples进行设置样本数。
maxmemory-samples 5
5.3主从复制相关配置
#设置slave是否是只读的
replica-read-only yes
# 主从数据复制是否使用无硬盘复制功能。
repl-diskless-sync no
# 设置主从数据复制使用无硬盘复制功能的延迟时间,单位秒。
repl-diskless-sync-delay 5
# 指定slave定期ping master的周期,默认10秒钟。
repl-ping-replica-period 10
# 设置主库批量数据传输时间或者ping回复时间间隔,默认值是60秒 。
repl-timeout 60
# 指定向slave同步数据时,是否禁用socket的NO_DELAY选项。
# 若配置为“yes”,则禁用NO_DELAY,则TCP协议栈会合并小包统一发送,这样可以减少主从节点间的包数量并节省带宽,但会增加数据同步到 slave的时间。
# 若配置为“no”,表明启用NO_DELAY,则TCP协议栈不会延迟小包的发送时机,这样数据同步的延时会减少,但需要更大的带宽。
# 通常情况下,应该配置为no以降低同步延时,但在主从节点间网络负载已经很高的情况下,可以配置为yes。
repl-disable-tcp-nodelay no
# 设置主从复制backlog容量大小。这个 backlog 是一个用来在 slaves 被断开连接时存放 slave 数据的 buffer,
# 所以当一个 slave 想要重新连接,通常不希望全部重新同步,只是部分同步就够了,仅仅传递 slave 在断开连接时丢失的这部分数据。
# 这个值越大,salve 可以断开连接的时间就越长。
repl-backlog-size 1mb
# 配置当master和slave失去联系多少秒之后,清空backlog释放空间。当配置成0时,表示永远不清空。
repl-backlog-ttl 3600
# 当master不能正常工作的时候,Redis Sentinel会从slaves中选出一个新的master,这个值越小,就越会被优先选中,如果为0意味着不会被选中,默认优先级为100。
5.4AOF相关配置
# 是否启用aof持久化方式
appendonly no
# 指定aof日志文件名
appendfilename "appendonly.aof"
# aof日志更新条件,共有3个可选值
# no:表示等操作系统进行数据缓存同步到磁盘(快,持久化没保证)
# always:同步持久化,每次发生数据变更时,立即记录到磁盘(慢,安全)
# everysec:表示每秒同步一次(默认值,很快,但可能会丢失一秒以内的数据)
appendfsync everysec
# "no" that is the safest pick from the point of view of durability.
# 指定是否在后台aof文件rewrite期间调用fsync,默认为no,表示要调用fsync(无论后台是否有子进程在刷盘)。
# Redis在后台写RDB文件或重写AOF文件期间会存在大量磁盘IO,此时,在某些linux系统中,调用fsync可能会阻塞。
# 如果应用系统无法忍受延迟,而可以容忍少量的数据丢失,则设置为yes。如果应用系统无法忍受数据丢失,则设置为no。
no-appendfsync-on-rewrite no
# 当AOF文件增长到一定大小的时候Redis能够调用 BGREWRITEAOF 对日志文件进行重写 。当AOF文件大小的增长率大于该配置项时自动开启重写。
auto-aof-rewrite-percentage 100
# 当AOF文件增长到一定大小的时候Redis能够调用 BGREWRITEAOF 对日志文件进行重写 。当AOF文件大小大于该配置项时自动开启重写
auto-aof-rewrite-min-size 64mb
# redis在启动时可以加载被截断的AOF文件,而不需要先执行redis-check-aof 工具。
aof-load-truncated yes
# 是否开启混合持久化
aof-use-rdb-preamble yes
5.5Cluster集群相关配置
# 一个Lua脚本最长的执行时间,单位为毫秒,如果为0或负数表示无限执行时间
lua-time-limit 5000
# 是否开启cluster集群模式 如果配置yes则开启集群功能,此redis实例作为集群的一个节点,否则,它是一个普通的单一的redis实例。
cluster-enabled yes
# 虽然此配置的名字叫"集群配置文件",但是此配置文件不能人工编辑,它是集群节点自动维护的文件,
# 主要用于记录集群中有哪些节点、他们的状态以及一些持久化参数等,方便在重启时恢复这些状态。通常是在收到请求之后这个文件就会被更新。
cluster-config-file nodes-6379.conf
# 这是集群中的节点能够失联的最大时间,超过这个时间,该节点就会被认为故障。如果主节点超过这个时间还是不可达,则用它的从节点将启动故障迁移,升级成主节点。
cluster-node-timeout 15000
# 如果设置成0,则无论从节点与主节点失联多久,从节点都会尝试升级成主节点。
# 如果设置成正数,则cluster-node-timeout乘以cluster-slave-validity-factor得到的时间,是从节点与主节点失联后,
# 此从节点数据有效的最长时间,超过这个时间,从节点不会启动故障迁移。
# 假设cluster-node-timeout=5,cluster-slave-validity-factor=10,则如果从节点跟主节点失联超过50秒,此从节点不能成为主节点。
# 注意,如果此参数配置为非0,将可能出现由于某主节点失联却没有从节点能顶上的情况,从而导致集群不能正常工作,
# 在这种情况下,只有等到原来的主节点重新回归到集群,集群才恢复运作。
cluster-replica-validity-factor 10
# master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数若被设为2,那么只有当一个主节点拥有2 个可工作的从节点时,它的一个从节点会尝试迁移。
# 不建议设置为0
# 想禁用可以设置一个非常大的值
# 如果小于0则启动失败
cluster-migration-barrier 1
# 表示当负责一个插槽的主库下线且没有相应的从库进行故障恢复时,是否整个集群不可用?
cluster-require-full-coverage yes