MENU

Redis学习笔记

May 30, 2022 • Read: 532 • 杂谈阅读设置

服务端与客户端启动

# 启动服务端
redis-server.exe

# 启动本地客户端
redis-cli.exe

# 启动远程客户端
redis-cli.exe -h host -p port -a password

Key

# 创建key
SET key value
# 删除key
DEL key
# 序列化key
DUMP key
# 检查key是否存在
EXISTS key
# 设置key过期时间 秒|过期时间戳(秒)|毫秒为单位|过期时间戳(毫秒)
[EXPIPE|EXPIPEAT|PEXPIRE|PEXPIPEAT] key [seconds|timestamp|milliseconds|milliseconds-timestamp]
# 查找所有符合给定模式(pattern)的key e.g. [KEYS test]  [KEYS *]
KEYS pattern
# 将当前db的key移动到给定db
MOVE key db
# 移除key过期时间
PERSIST key
# 返回key的过期时间 毫秒|秒
[PTTL|TTL] key
# 从当前db随机返回一个key
RANDOMKEY
# 修改key名称 如果存在newkey 则会覆盖
RENAME key newkey
# 仅当newkey不存在时,将key改名为newkey
RENAMENX key newkey
# 迭代数据库中的数据库键
SCAN cursor [MATCH pattern][COUNT count]
# 返回key所存储的值的类型
TYPE key

基本数据结构

String、Hash、List、Set、ZSet(Sorted Set)、HyperLogLog(Redis 2.8.9+,用于基数(不重复元素个数)统计)、GEO(Redis 3.2+,存储地理位置信息)、Stream(Redis 5.0+,主要用于消息队列,实现消息的持久化和主备复制功能)

发布订阅

发布订阅可以分发消息,但是无法记录历史消息,无法消息持久化。如果网络端口、Redis宕机,则消息被丢弃

# 订阅客户端
SUBSCRIBE channel [channel ...]
# 发布客户端
PUBLISH channel message

事务

# 开始事务
MULTI
# 执行所有事务块 (命令一般放在MULTI和EXEC中间)
EXEC
# 取消事务
DISCARD
# 监视一个或多个key,如果key在事务执行前改动,则事务被打断
WATCH key [key...]
# 取消对所有key的监视
UNWATCH

其它

# 执行lua脚本
EVAL script numkeys key [key ...] arg [arg ...]
# 验证密码
AUTH password
# 切换指定数据
SELECT index
# 查看服务运行状态
PING
# 获取服务端信息
INFO


# 数据备份 在redis安装目录创建dump.rdb
SAVE
# CONFIG可以获取redis目录,数据恢复,将dump.rdb移动到redis安装目录并启动服务即可
CONFIG GET dir
# 创建redis备份文件
BGSAVE

# 设置密码
CONFIG set requirepass "password"

# 性能测试
redis-benchmark [option] [option value]

相关

  • 基本数据结构:String、Hash、List、Set、ZSet(Sorted Set)、HyperLogLog(Redis 2.8.9+,用于基数(不重复元素个数)统计)、GEO(Redis 3.2+,存储地理位置信息)、Stream(Redis 5.0+,主要用于消息队列,实现消息的持久化和主备复制功能)
  • 使用场景:计数器:利用redis中原子性的自增操作;缓存:减轻mysql压力;排行榜:利用zset实现;消息队列;会话缓存
  • 持久化:RDB持久化保存某个时间点的全部数据(只有一个文件便于保存,但是中间redis出故障会导致数据丢失);AOF持久化记录所有变更数据库状态的指令,以append的形式追加保存到AOF文件中(即便中途出故障,服务器当机,也可以通过redis-check-aof来解决数据一致性问题,数据量过大启动效率低)。
  • 哨兵模式:哨兵至少需要三个实例来保持自己的健壮性。

    • 集群监控:负责监控 redis master 和 slave 进程是否正常工作。
    • 消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。
    • 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。
    • 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。
  • 缓存穿透:

    • 缓存穿透指缓存和数据库都没有需要查询的数据,攻击者不断发送这种需要,导致数据库压力过大。
    • 解决方案:

      • 接口层增加数据校验,如上述案例,对id进行基础校验,对id为-1的请求进行拦截。
      • 从缓存和数据库都得不到的数据,在缓存中添加空数据,即key-value存放空的结构体。
      • 对并发读数据设置并发锁,降低并发性。
  • 缓存雪崩:

    • 缓存雪崩指的是缓存中有一大批数据到达过期时间而被删除,但是这批数据量巨大,查询全部走数据库,造成数据库压力过大。
    • 解决方案:

      • 缓存数据过期时间随机设置,防止同一时间大量数据过期现象发生。
      • 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存中
      • 设置热点数据永久不过期
  • 缓存击穿:

    • 缓存击穿指的是缓存中没有但是数据库中存在的数据,这时候由于并发用户特别多,同时都缓存没有读到数据,又同时去数据库中获取数据,引起数据库压力瞬间变大.
    • 解决方案:

      • 添加互斥锁。在并发的多请求中,只有一个线程能拿到锁并执行数据库查询操作。
      • 热点数据永不过期。