1. 安装&配置
1.1 安装
1. cd /usr/local/software
2. wget http://download.redis.io/releases/redis-5.0.3.tar.gz
3. tar -xzf redis-5.0.3.tar.gz -C /usr/local/
4. ln -s redis-5.0.3 redis
5. cd redis
6. make && make install
1.2 配置
cd redis
mkdir config
mkdir data
cp redis.conf config
配置文件
daemonize yes
port 6381
dir "/usr/local/redis/data"
logfile "6381.log"
启动:redis-server config/redis-6381.conf
2. API
2.1 通用API
keys [*, ja*, h-l, ph?] : 当前数据库的键, 一般不要在生成环境中使用, 时间复杂度=O(n)
dbsize : 当前数据库的大小
exists key : 判断一个key是否存在, 存在=1,不存在=0
del key [key ...] : 删除一个或多个key, 成功=1,失败=0
expire key second : 设置key的过期时间
ttl key : 查看key的过期时间, -2=key已经不存在了, -1=key存在并且没有过期时间
persist key : 去掉key的过期时间
type key : key的数据类型
2.2 字符串API - string
字符串键值结构 = key - value,value不能大于512MB,建议在100kb以内
应用场景 = 缓存、计数器、分布式锁 等
get key = 获取key对应的value
mget key1 key2 key3 ... = 批量获取key, 原子操作
set key value = 设置key-value, 不管key是否存在都设置
mset key1 value1 key2 value2 = 批量设置key-value
setnx key value = key不存在, 才设置
set key value xx = key存在, 才设置
del key = 删除key-value
incr key = key自增1, 如果key不存在, 自增后get(key)=1
decr key = key自减1, 如果key不存在, 自减后get(key)=-1
incrby key num = key自增num, 如果key不存在, 自增后get(key)=num
decrby key num = key自减num, 如果key不存在, 自减后get(key)=-num
getset key newvalue = 设置新值, 返回旧值
append key value = 将value追加到旧值上
strlen key = 返回字符串的长度(注意中文,'足球'=2)
getrange key start end = 获取字符串指定下标所有的值
setrange key index value = 设置指定下标所有对应的值
incrbyfloat key 3.5 = 增加key对应的值3.5
2.3 哈希API - hash
哈希键值结构 = key - value(field, value) field不能相同,value可以相同
hget key field = 获取hash key对应的field的value
hset key field value = 设置hash key对应的field的value
hdel key field = 删除hash key对应field的value
hexists key field = 判断hash key是否有field
hlen key = 获取hash key field的总数
hmget key field1 field1 ... fieldN = 批量获取hash key的一批field对应的值
hmset key field1 value1 ... fieldN valueN = 批量设置hash key的一批field value
hgetall key = 返回所有的key和value
hvals key = 返回所有的value
hkeys key = 返回所有的field
hsetnx key field value
hincrby key field intCounter
hincrbyfloat key field floatCounter
2.4 列表API - list
列表结构 = key - elements
特点 = 有序、可以重复、左右两边插入弹出
rpush key value1 value2 ... valueN = 从列表右端插入值(1-N个)
lpush key value1 value2 ... valueN = 从列表左端插入值(1-N个)
linsert key before|after value newValue = 在list指定的key 之前|之后 插入newValue
lpop key = 从list左边弹出一个item
rpop key = 从list右边弹出一个item
lrem key count value = 根据count值,从列表删除所有value相等的项
ltrim key start end = 按照索引范围修剪列表
lrange key start end = 获取列表指定范围所有的item
lindex key index = 获取列表指定索引的item
llen key = 获取列表长度
lset key index newValue = 设置列表指定索引值为newValue
blpop key timeout
brpop key timeout
2.5 集合API - set
集合结构 = key values
特点 = 无序、无重复、集合间操作
sadd key element = 向集合key添加element(如果element已经存在,添加失败)
srem key element = 删除element
scard key = 计算集合大小
sismember key element = 判断element是否在集合key中
srandmember key count = 从集合中随机挑选count个元素
spop key = 随机弹出一个元素
smembers key = 获取集合所有元素
2.6 有序集合API - zset
有序集合结构 = key - value(score, value)
特点 = 无重复元素、有序、element + score
zadd key score element = 添加score和element
zrem key element = 删除元素
zscore key element = 返回元素的分数
zincrby key increScore element = 添加或减少元素的分数
zcard key = 返回元素的总数
zrange key start end [] = 返回指定索引内的升序元素[分值]
3. 持久化
3.2 RDB
1. RDB简介 = RDB程序会将内存中的数据,以快照的方式进行持久化;
当符合一定条件,redis会自动持久化;
当redis重启的时候,RDB程序会重载rdb文件来还原数据库。
2. 触发RDB = save(同步|阻塞)、bgsave(异步|非阻塞)、自动
3. RDB缺点 = 耗时、耗性能、不可控-丢失数据
耗时 = save是同步-阻塞的,是O(n)的时间复杂度
耗性能 = bgsave 是异步-非阻塞的,但是会fork()新的进程消耗内存,copy-on-write策略;
再加上Disk I/O性能问题;
不可控-丢失数据 = 当自动触发RDB,并数据量很大的时候,这时宕机了,就会产生大量数据丢失
3.3 AOF
1. AOF简介
将所有对数据库写入命令保存到AOF文件中
2. AOF策略
always:命令写到硬盘缓冲区中,每条命令fsync刷到硬盘;
everysec:命令写到硬盘缓冲区中,每秒fsync刷到硬盘,默认选项;
no:命令写到硬盘缓冲区中,OS操作系统fsync刷到硬盘;
3. 优缺点
命令 |
always |
everysec |
no |
优点 |
不丢失数据 |
每秒一次fsync |
不用管 |
缺点 |
IO开销大 |
丢1s数据 |
不可控 |
4. AOF重写功能
作用:减少磁盘占用和加速恢复速度
AOF重写方式:bgrewriteaof、AOF重写配置
原生AOF |
AOF重写 |
set hello world |
set hello go |
set hello java |
|
set hello go |
|
5. AOF重写流程
6. AOF追加阻塞
6. RDB与AOF对比
命令 |
RDB |
AOF |
启动优先级 |
低 |
高 |
体积 |
小 |
大 |
恢复速度 |
快 |
慢 |
数据安全性 |
丢数据 |
根据策略决定 |
轻重 |
重 |
轻 |
4. 主从复制
4.1 作用
数据副本和扩展读性能
4.2 配置
1. 主节点
cp redis.conf redis-6379.conf
daemonize yes
pidfile /var/run/redis-6379.pid
port 6379
logfile "6379.log"
dbfilename dump-6379.rdb
dir /usr/local/redis/data
redis-cli -p 6379
info replication
redis-cli -p 6379 info server | grep run
2. 从节点
sed "s/6379/6380/g" redis-6379.conf > redis-6380.conf
daemonize yes
pidfile /var/run/redis-6380.pid
port 6380
logfile "6380.log"
dbfilename dump-6380.rdb
slaveof 127.0.0.1 6379
dir /usr/local/redis/data
redis-cli -p 6380 info replication
redis-cli -p 6380 info server | grep run
5. Sentinel-哨兵
5.1 安装配置
cat sentinel.conf | grep -v "#" | grep -v "^$"
cat sentinel.conf | grep -v "#" | grep -v "^$" > config/redis-sentinel-26379.conf
vim redis-sentinel-26379.conf
daemonize yes
dir /usr/local/redis/data
logfile "26379.log"
redis-sentinel redis-sentinel-26379.conf
redis-cli -p 26379
命令:ping、info
sed "s/26379/26380/g" redis-sentinel-26379.conf > redis-sentinel-26380.conf
6. 其他
6.1 数据结构和内部编码
redis 是单线程执行命令的
单线程为什么这么快:
1、纯内存-快
2、非阻塞IO
3. 避免线程切换和竞态消耗
单线程注意:
1. 一次只运行一条命令
2. 拒绝慢命令(keys,flushall,flushdb等)
慢查询 = 帮助找到系统瓶颈的命令
pipeline = 提高客户端的效率
6.2 启动流程
6.3 持久化图解