Redis常用操作整理

本文主要整理一些在以往开发中用到过及可能用到的功能,没有涉及的功能暂不做整理。

1.基本数据类型

1.1 String

  • GET、SET、DEL
  • SETNX、SET xx
  • MSET、MGET
  • GETSET、APPEND
  • STRLEN
  • INCR、DECR、INCRBY、DECRBY、INCRBYFLOAT
  • SETRANGE、GETRANGE

注意:

  1. 尽量使用MGET而不是GET,减少网络请求时间。
  2. 存在与数据库同步时,避免在直接在Redis计算。

1.2 Hash

  • HSET、HGET、HGETALL

1.3 List

  • LPUSH、RPUSH
  • LPOP、RPOP
  • LRANGE

注意:

  1. List是有序字符串集合,实际开发可用于排行榜之类功能,也可用于消息队列。
  2. List中可以出现重复数据。

1.4 Set

  • SADD、SPOP
  • SCARD、SMEMBERS

注意:

  1. Set是无需集合
  2. 集合成员是唯一的,不会出现重复数据

1.5 Sorted Set

  • ZADD
  • ZRANGE
  • ZREM
  • ZCARD
注意:
用于构造一个有序、但数据不重复的集合

2. PUB/SUB(发布/订阅)

  • SUBSCRIBE、UNSUBSCRIBE
  • PSUBSCRIBE、PUNSUBSCRIBE
  • PUBLISH

注意:

  1. Redis客户端可以订阅任意数量的频道。
  2. 客户端只能消费订阅之后发布的消息,一个消息可以被多个订阅者消费

3. 事务(Transactions)

  • MULTI
  • EXEC
  • DISCARD
  • WATCH key:监视 key,如果在事务执行之前 key 被其他命令所改动,那么事务将被打断。
  • UNWATCH:取消 WATCH 命令对所有 key 的监视;
注意:
Redis的事务不具备一致性,EXEC执行后,若事务中断,已经执行的部分不会回滚。

4. 慢查询

  • SLOWLOG GET
  • SLOWLOG LEN
  • SLOWLOG RESET

注意:

  1. 慢查询时间不包括命令队列时间
  2. 常用在请求超时,可通过慢查询日志看是否有级联阻塞

5. 管道(Pipeline)

注意:
Pipeline只能在单节点上执行

6. 地理位置(GEO)

  • GEO ADD key 经度 维度 标识 ...
  • GEOPOS key 标识
  • GEODIST key 标识1 标识2 距离单位
  • GEORADIUS

注意:

  1. 可用于摇一摇、同城约会之类的,可计算范围内的人
  2. 可用于范围内固定目标,比如饭店、滑雪场
  3. 使用GEORADIUS的排序,做实时距离相关的比赛功能

7. 数据持久化(RDB & AOF)

持久化方式有两种:RDB快照 和 AOF日志。

7.1 RDB

RDB快照有三种触发机制:

  1. save命令,执行同步快照
  2. bgsave命令,执行新线程,生成快照
  3. 自动触发,执行新线程,生成快照

一般使用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。

  1. always:每条命令都写入 AOF 文件中,保证不丢失;
  2. everysec:每秒将缓冲区数据写入一次,可能丢失1秒数据;
  3. 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

相关推荐