本文主要整理一些在以往开发中用到过及可能用到的功能,没有涉及的功能暂不做整理。
1.基本数据类型
1.1 String
- GET、SET、DEL
- SETNX、SET xx
- MSET、MGET
- GETSET、APPEND
- STRLEN
- INCR、DECR、INCRBY、DECRBY、INCRBYFLOAT
- SETRANGE、GETRANGE
注意:
- 尽量使用MGET而不是GET,减少网络请求时间。
- 存在与数据库同步时,避免在直接在Redis计算。
1.2 Hash
- HSET、HGET、HGETALL
1.3 List
- LPUSH、RPUSH
- LPOP、RPOP
- LRANGE
注意:
- List是有序字符串集合,实际开发可用于排行榜之类功能,也可用于消息队列。
- List中可以出现重复数据。
1.4 Set
- SADD、SPOP
- SCARD、SMEMBERS
注意:
- Set是无需集合
- 集合成员是唯一的,不会出现重复数据
1.5 Sorted Set
- ZADD
- ZRANGE
- ZREM
- ZCARD
注意:
用于构造一个有序、但数据不重复的集合
2. PUB/SUB(发布/订阅)
- SUBSCRIBE、UNSUBSCRIBE
- PSUBSCRIBE、PUNSUBSCRIBE
- PUBLISH
注意:
- Redis客户端可以订阅任意数量的频道。
- 客户端只能消费订阅之后发布的消息,一个消息可以被多个订阅者消费
3. 事务(Transactions)
- MULTI
- EXEC
- DISCARD
- WATCH key:监视 key,如果在事务执行之前 key 被其他命令所改动,那么事务将被打断。
- UNWATCH:取消 WATCH 命令对所有 key 的监视;
注意:
Redis的事务不具备一致性,EXEC执行后,若事务中断,已经执行的部分不会回滚。
4. 慢查询
- SLOWLOG GET
- SLOWLOG LEN
- SLOWLOG RESET
注意:
- 慢查询时间不包括命令队列时间
- 常用在请求超时,可通过慢查询日志看是否有级联阻塞
5. 管道(Pipeline)
注意:
Pipeline只能在单节点上执行
6. 地理位置(GEO)
- GEO ADD key 经度 维度 标识 …
- GEOPOS key 标识
- GEODIST key 标识1 标识2 距离单位
- GEORADIUS
注意:
- 可用于摇一摇、同城约会之类的,可计算范围内的人
- 可用于范围内固定目标,比如饭店、滑雪场
- 使用GEORADIUS的排序,做实时距离相关的比赛功能
7. 数据持久化(RDB & AOF)
持久化方式有两种:RDB快照 和 AOF日志。
7.1 RDB
RDB快照有三种触发机制:
- save命令,执行同步快照
- bgsave命令,执行新线程,生成快照
- 自动触发,执行新线程,生成快照
一般使用bgsave或自动快照。自动快照配置如下:
# /etc/redis.conf
// RDB
// 每500秒有超过100次key被修改就执行快照
save 500 100
- Redis 调用 fork() 进程,同时拥有父进程和子进程;
- 子进程将数据都写到一个临时 RDB 文件之中;
- 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换旧的 RDB 文件;
生产环境中,RDB适合冷备份,其他适合建议使用AOF。
7.2 AOF
AOF 三种策略分别是 always 、everysec 和 no。
- always:每条命令都写入 AOF 文件中,保证不丢失;
- everysec:每秒将缓冲区数据写入一次,可能丢失1秒数据;
- no:操作系统决定什么时候写入;
注意:
在写入的时候,AOF会压缩命令。
AOF重写
auto-aof-rewrite-min-size
:配置最小尺寸,超过就进行重写。auto-aof-rewrite-percentage
:指当前AOF文件比上次重写的增长比例大小。
AOF 重写即 AOF 文件在一定大小之后,重新将整个内存写到 AOF 文件当中,以反映最新的状态(相当于 bgsave)。这样就避免了 AOF 文件过大而实际内存数据小的问题(频繁修改数据问题)。
# AOF 配置如下
# 默认是 no
appendonly yes
# 设置 AOF 名字
appendfilename "aof-${ip}-${port}.aof"
# 每秒同步
appendfsync everysec
# AOF文件目录
dir /diskpath
# 重写AOF时是否持续记录新的AOF日志
# 设置为 no,不会丢数据,但可能造成线程阻塞
# 设置为 yes,有可能丢数据,但不会造成阻塞和系统延迟
no-appendfsync-on-rewrite yes
7.3 数据持久化常见问题
环境开销
- fork进程消耗大量内存;
- AOF和RDB生成,属于CPU密集型,不与CPU密集型业务一起部署;
- AOF和RDB写入会占用硬盘,使用iotop分析硬盘状态;不和数据库、消息队列等一起部署;使用SSD硬盘。
AOF追加阻塞
# 查看阻塞次数
# 如阻塞较多,要调整业务实现或者调整AOF策略
redis-cli info resistence