Redis系列(一):Redis简介
一、Redis概述
Redis是一个开源(遵循BSD协议)Key-Value数据结构的内存存储系统,用作数据库、缓存和消息代理。它支持5种数据结构:字符串string、哈希hash、列表list、集合set和有序的集合sorted-set。Redis支持Lua脚本,哨兵机制和集群实现高可用。适用场景:缓存、投票、抽奖、分布式session、排行榜、计数、队列、发布订阅等;具体介绍见Redis官网。
二、Redis安装
① 下载地址:https://redis.io/download
② 安装gcc:yum install gcc
③ 把第一步下载好的redis‐5.0.2.tar.gz上传到服务器的/root/svr/packages目录或者直接 cd /root/svr/packages然后执行:wget http://download.redis.io/releases/redis-5.0.2.tar.gz
④ 执行 cp redis‐5.0.2.tar.gz ../
⑤ cd /root/svr 然后执行:tar -xvf redis‐5.0.2.tar.gz:
cd redis‐5.0.2:
⑥ 执行:make install PREFIX=/root/svr/redis-5.0.2
⑦ 启动redis 执行:bin/redis-server ../redis.conf (注意:如果要后台启动需要把redis.conf配置里面的daemonize改为yes)
⑧ 验证是否启动成功 ps -ef|grep redis
⑨ 进去redis客户端:bin/redis-cli
⑩ 退出客户端:quit
三、redis.conf主要配置详解
参数 | 解释 |
bind | 指定 Redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求 |
port | 监听端口,默认6379 |
timeout | 设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接 |
daemonize | 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes |
loglevel | log等级分为4级,debug, verbose, notice, 和 warning。生产环境下一般开启notice |
logfile | 配置log文件地址,默认使用标准输出,即打印在命令行终端的窗口上 |
save | save <seconds> <changes>比如save 60 10000意思60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化rdb) |
dbfilename | rdb文件的名称 |
dir | 数据目录,2种持久化rdb、aof文件就在这个目录 |
replicaof | replicaof <masterip> <masterport>:该配置是主从的配置表示该redis实例是masterip:masterport的从节点 |
masterauth | master连接密码 |
replica-serve-stale-data |
当slave跟master失去连接或者正在同步数据,slave有两种运行方式: 1) 如果replica-serve-stale-data设置为yes(默认设置),slave会继续响应客户端的请求。 2) 如果replica-serve-stale-data设置为no,除去指定的命令之外的任何请求都会返回一个错误”SYNC with master in progress” |
replica-read-only | 是否设置slave只读 |
repl-diskless-sync | 同步策略: 磁盘或socket,默认磁盘方式 |
repl-diskless-sync-delay | 如果非磁盘同步方式开启,可以配置同步延迟时间,以等待master产生子进程通过socket传输RDB数据给slave。默认值为5秒,设置为0秒则每次传输无延迟 |
repl-ping-replica-period | slave根据指定的时间间隔向master发送ping请求。默认10秒 |
repl-timeout | 同步的超时时间 |
repl-disable-tcp-nodelay | 是否在slave套接字发送SYNC之后禁用 TCP_NODELAY |
repl-backlog-size | 设置数据备份的backlog大小 |
repl-backlog-ttl | slave断开开始计时多少秒后,backlog缓冲将会释放 |
replica-priority | slave的优先级,当master挂了,优先级数字小的salve会优先考虑提升为master,0作为一个特殊的优先级,标识这个slave不能作为master |
requirepass | 客户端在处理任何命令时都要密码验证 |
rename-command | 命令重命名,可以给危险命令改变名字 |
maxclients | 设置最多同时连接的客户端数量,默认这个限制是10000个客户端。 |
maxmemory | 设置最大内存,一旦内存使用达到最大内存,redis会根据选定的回收策略(maxmemmory-policy)删除key |
maxmemory-policy |
最大内存策略:如果达到内存限制了,redis如何选择删除key: |
maxmemory-samples |
设置样本量的个数 |
appendonly |
是否开启AOF,如果开启那么在启动时Redis将加载AOF文件,它更能保证数据的可靠性,aof的文件内容就是RESP协议 |
appendfilename |
AOF文件名(默认:"appendonly.aof") |
appendfsync |
配置 Redis 多久才将数据 fsync 到磁盘一次 |
auto-aof-rewrite-percentage |
自动重写AOF文件。如果AOF日志文件增大到指定百分比,默认100。Redis能够通过 BGREWRITEAOF 自动重写AOF日志文件 |
auto-aof-rewrite-min-size |
自动重写AOF文件。如果AOF日志文件到达最小的指定大小,默认64mb |
aof-use-rdb-preamble |
Redis 4.0之后配置混合持久化,需要配置 aof-use-rdb-preamble yes |
lua-time-limit |
Lua脚本的最大执行时间,单位为毫秒 |
cluster-enabled |
是否开启集群 cluster-enabled yes |
cluster-config-file |
redis自动生成集群配置信息的文件名 |
cluster-node-timeout |
集群节点超时毫秒数。超时的节点将被视为不可用状态。 |
aof-rewrite-incremental-fsync |
当一个子进程重写AOF文件时,如果配置aof-rewrite-incremental-fsync yes,则文件每生成32M,数据会被同步 |
rdb-save-incremental-fsync |
当redis保存RDB文件时,如果启用了以下选项,每生成32MB数据,文件将被fsync到磁盘 |
四、Redis五种数据结构
1、String
1.1 字符串操作
SET key value //设置字符串键值对 MSET key value [key value ...] //批量设置字符串键值对 SETNX key value //设置字符串键值对,当key存在就不做处理直接返回0,否则跟set命令一样 GET key //获取一个字符串键值 MGET key [key ...] //批量获取字符串键值 DEL key [key ...] //删除一个键 EXPIRE key seconds //设置一个键的过期时间(秒)
1.2 原子操作
INCR key //将key中储存的数字值加1 DECR key //将key中储存的数字值减1 INCRBY key increment //将key所储存的值加上increment DECRBY key decrement //将key所储存的值减去decrement
2、Hash
2.1 常用操作
HSET key field value //设置哈希表key中的字段field的值设为value HSETNX key field value //设置哈希表key中的字段field的值设为value,当key存在不做处理,返回0,否则跟hset命令一样 HMSET key field value [field value ...] //批量设置哈希表key中的字段field的值设为value HGET key field //获取哈希表key对应的field字段的值 HMGET key field [field ...] //批量获取哈希表key中多个field字段的值 HDEL key field [field ...] //删除哈希表key中的field字段 HLEN key //返回哈希表key中field的数量 HGETALL key //返回哈希表key中所有的键值 HINCRBY key field increment //为哈希表key中field键的值加上增量increment
3、List
3.1 常用操作
LPUSH key value [value ...] //将一个或多个值value插入到key列表的表头(最左边) RPUSH key value [value ...] //将一个或多个值value插入到key列表的表尾(最右边) LPOP key //移除并返回key列表的头元素 RPOP key //移除并返回key列表的尾元素 LRANGE key start stop //返回列表key中指定区间内的元素,区间以偏移量start和stop指定 BLPOP key [key ...] timeout //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待 BRPOP key [key ...] timeout //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
4、Set
4.1 常用操作
SADD key member [member ...] //往集合key中存入元素,元素存在则忽略,key不存在则新建 SREM key member [member ...] //从集合key中删除元素 SMEMBERS key //获取集合key中所有元素 SCARD key //获取集合key的元素个数 SISMEMBER key member //判断member元素是否存在于集合key中 SRANDMEMBER key [count] //从集合key中选出count个元素,元素不从key中删除 SPOP key [count] //从集合key中选出count个元素,元素从key中删除
4.2 运算操作
SINTER key [key ...] //交集运算 SINTERSTORE destination key [key ..] //将交集结果存入新集合destination中 SUNION key [key ..] //并集运算 SUNIONSTORE destination key [key ...] //将并集结果存入新集合destination中 SDIFF key [key ...] //差集运算 SDIFFSTORE destination key [key ...] //将差集结果存入新集合destination中
5、Sorted-Set
5.1 常用操作
ZADD key score member [[score member]...] //往有序集合key中加入带分值元素 ZREM key member [member ...] //从有序集合key中删除元素 ZSCORE key member //返回有序集合key中元素member的分值 ZINCRBY key increment member //为有序集合key中元素member的分值加上increment ZCARD key //返回有序集合key中元素个数 ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start下标到stop下标的元素 ZREVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start下标到stop下标的元素
5.2 运算操作
ZUNIONSTORE destkey numkeys key [key ...] //并集计算
ZINTERSTORE destkey numkeys key [key ...] //交集计算
五、Redis核心原理
1、Redis单线程为什么还能这么快
Redis所有的数据都是在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗的问题。正因为Redis是单线程,所以要小心使用Redis指令,对于那些耗时的指令(比如keys),一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。
2、Redis单线程为何能处理那么多的并发客户端连接
Redis的IO多路复用:redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器。(IO多路复用在后续的netty系列里面详细讲解)
总结:Redis是一个Key-Value数据结构的内存存储系统,他支持5种数据结构,分别是String结构、Hash结构、List结构、Set结构、Sorted-Set结构;Redis支持Lua脚本,哨兵机制和集群实现高可用;介绍了安装Redis的步骤,详细的解释了redis.conf的主要配置,以及Redis的核心原理。