redis 命令

基本命令

redis-server // 启动服务
redis-cli // 客户端连接
select 2 // 选择db序号,默认有16个
dbsize // 查看db大小

字符串

set key value // 设置key-value值
get key // 获取值
keys * // 查看所有的key
exists key // 是否存在某个key
move key 1 // 移除某个key
EXPIRE key 10 // 设置key的过期时间(单位s)
append key "val" // 往某个key中追加字符串
strlen // 获取字符串的长度
INCR key // 自增1
INCRBY key 2 // 自动加2
DECR key // 自减-1
DECRBY key 2 // 自动减2
GETRANGE key 0 2 // 截取某个key这个字符串,闭区间
SETRANGE key 0 B // 替换某个字符串的值
SETEX key 20 2 // 设置某个key的过期时间和值
SETNX newkey 112 // 如果不存在才设置,在分布式锁里面经常使用
mset k1 v1 k2 v2 k3 v3 // 批量设置多个key的值
mget k1 k2 k3 // 批量获取多个key的值
msetnx k1 v1 k2 v2 // 如果不存在,批量设置,原子性操作
mset user:1:name bz1 user:1:age 2 // 设置user1对象的name和age,user:{id}:{filed}

列表

LPUSH list one // 将一个值插入到列表的头部
LPUSH list two
LPUSH list three
RPUSH list four // 将一个值插入到列表尾部
LRANGE list 0 -1 // 获取某个区间的值
LPOP list // 移除列表第一个值
RPOP list // 移除列表最后一个值
lindex list 1 // 通过下标获取list的某一个值
LLEN list // 列表的长度
LREM list 1 four // 移除列表中1个指定的值
LTRIM list 0 1 // 通过下标截取列表的数据,会修改list
LSET list 0 one // 更新操作,修改指定下标的值
LINSERT list before one three // 插值,将某一个具体的值插入到指定值的前面(或者后面 after)

Set

  • Set中的值不能重复
sadd myset "hello" // set集合中添加值
SMEMBERS myset // 查看set中的值
SISMEMBER myset hello // set中是否有指定值
SCARD myset // set集合中的个数
SREM myset hello // 删除set中的某个值
SRANDMEMBER myset // 随机抽选一个元素
spop myset // 随机删除一个key
SMOVE myset myset1 "b" // 把一个集合中的指定值移动到另一个集合
SDIFF set1 set2 // 差集
SINTER set1 set2 // 交集
SUNION set1 set2 // 并集

Hash(哈希)

  • Map集合
HSET myhash field1 aaa // 设置值
HMSET key1 a key2 b // 批量设置值
HGETALL myhash // 获取所有的值
HDEL myhash field1 // 删除指定字段
HLEN myhash // 获取key的个数
HEXISTS myhash key1 // 判断指定值是否存在
HKEYS myhash // 获取所有的key
HVALS myhash // 获取所有的values
HINCRBY myhash key3 1 // 加1
HSETNX myhash key4 "aaaaa" // 如果不存在,则可以设置,如果存在则不能设置
HSET myhash1 user:1:name "asd" // 设置值

Zset(有序集合)

ZADD zset1 1 1 //添加值,可以批量添加(位置index value)
ZRANGE zset1 0 -1 #// 查看所有值
ZRANGEBYSCORE zset1 -inf +inf // 升序排列
ZREVRANGE zset1 0 -1 // 降序排列
ZRANGEBYSCORE zset1 -inf +inf withscores // 通过位置排序
ZREM zset1 1 // 移除指定值
ZCARD zset1 // 获取有序集合中的个数
 ZCOUNT zset1 0 1 // 获取区间的数量,一个位置可以加多个值

事务

  • 本质:一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行
  • 一次性、顺序性、排他性
  • Redis单条命令是原子性的,但是事务不保证原子性
  • Redis事务没有隔离级别的概念
  • Redis的事务:
    • 开启事务(multi)
    • 命令入队(...)
    • 执行事务(exec)
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
3) "zset1"

编译型异常(命令有错),事务中所有的命令都不会被执行
运行时异常(1/0),错误命令抛出异常,其他命令可以正常执行

加锁

  • 使用watch可以当作Redis的乐观锁操作
127.0.0.1:6379> watch money # 加锁
OK
127.0.0.1:6379> multi # 提交事务
OK
127.0.0.1:6379(TX)> DECRBY money 20
QUEUED
127.0.0.1:6379(TX)> INCRBY money 10
QUEUED
127.0.0.1:6379(TX)> exec #执行事务
1) (integer) 80
2) (integer) 90
127.0.0.1:6379> unwatch # 解锁
OK
127.0.0.1:6379> get money
"90"

RDB

  • bgsave:主进程fork出子进程,共享主线程的所有内存数据。子进程读取主线程的内存数据,并把它们写入 RDB 文件
  • rdb保存的文件是dump.rdb
  • 默认15分钟备份1次

触发机制

  1. save规则满足的情况下,会自动触发rdb规则
  2. 执行flushall命令
  3. 退出redis

会自动生成dump.rdb文件

回复rdb文件

  • 只需要将rdb文件放到我们redis启动目录就可以,redis启动的时候会自动检查dump.rdb,灰度其中的数据
  • 查看需要存在的位置
vim redis.conf #打开配置文件
127.0.0.1:6379> config get dir
1) "dir"
2) "/Users/beizi" # 如果这个目录下存在dump.rdb文件,启动就会自动恢复其中的数据

优点

  1. 适合大规模的数据恢复!dump.rdb
  2. 对数据的完整性要求不高

缺点

  1. 需要一定的时间间隔进程操作,如果redis意外宕机了,这个最后一次修改的数据就没有了

AOF

  • 将我们的所有命令都记录下来,history,恢复的时候把这个文件都执行一遍
  • aof保存的是appendonly.aof文件
  • 默认是不开启的,需要手动进行配置,appendonly改成yes即开启配置
  • 如果aof文件有错误,这时候redis是启动失败,我们需要修复这个aof文件,redis提供了一个工具redis-check-aof --fix,如果文件正常,重启就可以恢复

优点

  1. 每一次修改都同步,文件的完整性会更好
  2. 每秒同步一次
  3. 从不同步,效率最高

缺点

  1. 相对于数据文件来说,aof远远大于rdb,修复速度比rdb慢
  2. aof运行效率比rdb慢,所以默认数据持久化是rdb

redis发布订阅

  • 一种消息通信模式,发送者发送消息,订阅者接收消息
  • 消息发送者(publish)
  • 频道(channel)
  • 消息订阅者(subscribe)
SUBSCRIBE channel1 # 订阅频道
PUBLISH channel1 123 # 发布消息

主从复制

  • 默认情况下,每一台redis服务器都是主节点,一般情况下只用配置从机就行
  • 主机可以写,从机不能写只能读
  • 主机断开连接,从机依旧是连接到主机,只是没有写操作了,主机如果重新连接,从机依旧可以读主机的数据
slaveof 127.0.0.1 6379 # 配置从机,认谁是主机

复制原理

  1. Slave启动成功连接到master后会发送一个sync同步命令
  2. Master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步
  3. 全量复制:slave服务在接受到数据库文件数据后,将其存盘并加载到内存中
  4. 增量复制:Master继续将新的所有手机到的修改命令依次串给slave,完成同步
  5. 但是只要是重新连接master,一次完全同步将被自动执行,我们的数据一定可以在从机中看到

哨兵模式

  • 自动将从库换成主库
  • 哨兵通过发送命令,等待Redis服务器响应,从而监控运行多个Redis实例
  • 如果主机挂了,多个哨兵会发起“投票”重新选择主机
  • 步骤
  1. 配置哨兵配置文件 sentinel.conf
sentinel monitor myredis 127.0.0.1 6379 1 # 配置
  1. 启动哨兵
redis-sentinel sentinel.conf # 启动

Redis缓存穿透、击穿和雪崩

缓存穿透的概念(查不到)

  • 用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是想持久层数据库查询,发现也没有,于是本次查询失败。当瀛湖很多的时候,缓存都没有命中,于是都去请求了持久层数据库,这会给持久层数据库造成很大的压力,这个时候就相当于出现了缓存穿透
解决方案
  1. 布隆过滤器
  • 布隆过滤器是一种数据结构,对所有可能查询的参数一hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查询压力
  1. 缓存空对象
  • 存在的问题,可能会有很多的的空值的键

缓存击穿的概念(量太大、缓存过期)

  • 指一个key非常热点,在不停的扛着大并发,大并发集中对着一个点进行访问,由于缓存过期,当这个key在失效的的瞬间,持续的大并发就穿破缓存,直接请求数据库,并且回写缓存,会导致数据库瞬间压力过大。
解决方案
  • 分布式锁

缓存雪崩的概念

  • 指某一个时间段,缓存集中过期失效,Redis宕机
解决方案
  1. Redis高可用
  2. 限流降级
  3. 数据预热
  • 在正式部署之前,先把可能的数据预先访问一次
posted @ 2023-04-17 16:43  北子_bro  阅读(23)  评论(0)    收藏  举报