【Redis】使用教程

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重写流程

【Redis】使用教程_第1张图片

6. AOF追加阻塞

【Redis】使用教程_第2张图片

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"
# save 900 1
# save 300 10
# save 60 10000
dbfilename dump-6379.rdb
dir /usr/local/redis/data

redis-cli -p 6379
info replication # 查看主节点状态
redis-cli -p 6379 info server | grep run # 查看run-id

2. 从节点

sed "s/6379/6380/g" redis-6379.conf > redis-6380.conf # 全局替换6379-->6380,并生成新文件redis-6380.conf
daemonize yes
pidfile /var/run/redis-6380.pid
port 6380
logfile "6380.log"
# save 900 1
# save 300 10
# save 60 10000
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 # 查看run-id

5. Sentinel-哨兵

5.1 安装配置

cat sentinel.conf | grep -v "#" | grep -v "^$" # 取消注释和空行,只看最简配置信息
cat sentinel.conf | grep -v "#" | grep -v "^$" > config/redis-sentinel-26379.conf # 将最简配置写入新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 # 连接到sentinel
命令: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 = 提高客户端的效率

【Redis】使用教程_第3张图片
【Redis】使用教程_第4张图片

6.2 启动流程

【Redis】使用教程_第5张图片

6.3 持久化图解

【Redis】使用教程_第6张图片

你可能感兴趣的:(中间件)