服务端与客户端启动
# 启动服务端
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存放空的结构体。
- 对并发读数据设置并发锁,降低并发性。
缓存雪崩:
- 缓存雪崩指的是缓存中有一大批数据到达过期时间而被删除,但是这批数据量巨大,查询全部走数据库,造成数据库压力过大。
解决方案:
- 缓存数据过期时间随机设置,防止同一时间大量数据过期现象发生。
- 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存中
- 设置热点数据永久不过期
缓存击穿:
- 缓存击穿指的是缓存中没有但是数据库中存在的数据,这时候由于并发用户特别多,同时都缓存没有读到数据,又同时去数据库中获取数据,引起数据库压力瞬间变大.
解决方案:
- 添加互斥锁。在并发的多请求中,只有一个线程能拿到锁并执行数据库查询操作。
- 热点数据永不过期。