miaodi
发布于 2021-03-22 / 860 阅读
0

Redis笔记

Redis笔记

写在前面:笔记为了让自己快速复习忘记的知识,所以写的很简。可能有些地方其他人看不懂,甚至作者本人也看不懂。

1.常用命令

地址:http://www.redis.cn/commands.html

1.1 系统

查找所有符合给定模式(pattern)的key:

keys pattern

查找当前数据库的key的数量:

dbsize
检查给定的key是否存在:

exists key
在key存在时删除key:

del key1 [key2...]
为给定key设置过期时间,单位为秒:

expire key second
以秒为单位,返回给定key的剩余生存时间(TTL , time to live) 不存在key返回-2 无过期时间的key返回-1:

ttl key

移除key的过期时间,key将持久保存:

persist key

返回key所存储的值的类型:

type key

查看redis设置:

config get xx

设置redis:

config set xxx xxx

1.2 String

设置/获取:

set key value

get key value

同时设置/获取多个:

MSET key value [key value ....]

MGET key [key ....]

递增数字/增加指定数字:

INCR key

INCRBY key increment

递减数字/减少指定数字:

DECR key

DECRBY key decrement

获取字符串长度:

STRLEN key

分布式锁相关:

​ 不存在时才设置:setnx key value

​ 同时设置属性与超时时间(后面跟NX或XX代表存在或不存在时才成功)set key value [Ex seconds][PX milliseconds][NX|XX]

1.3 List

​ 向列表左边添加元素

LPUSH key value [value ...]

​ 向列表右边添加元素

RPUSH key value [value ....]

​ 查看列表

LRANGE key start stop

​ 获取列表中元素的个数

LLEN key

​ 应用场景:

​ 点赞列表?评论区?

1.4 hash

结构类似:

Map<String,Map<Object,object>>

一次设置一个字段值:

HSET key field value

一次获取一个字段值:

HGET key field

一次设置多个字段值:

HMSET key field value [field value ...]

一次获取多个字段值:

HMGETkey field [field ....]

获取所有字段值:

hgetall key

获取某个key内的全部数量:

hlen

删除一个key:

hdel

1.5 set

​ 添加元素

SADD key member[member ...]

​ 删除元素

SREM key member [member ...]

​ 获取集合中的所有元素

SMEMBERS key

​ 判断元素是否在集合中

SISMEMBER key member

​ 获取集合中的元素个数

SCARD key

​ 从集合中随机弹出一个元素,元素不删除

SRANDMEMBER key [数字]

​ 从集合中随机弹出一个元素,出一个删一个

SPOP key[数字]

​ 集合运算

​ 集合的差集运算A-B

​ 属于A但不属于B的元素构成的集合:qq的可能认识的人,网易云推荐歌单

SDIFF key [key ...]

​ 集合的交集运算A∩B

​ 属于A同时也属于B的共同拥有的元素构成的集合:共同好友,共同关注,共同加入的群

SINTER key [key ...]

​ 集合的并集运算AUB

​ 属于A或者属于B的元素合并后的集合:

SUNION key [key ...]

1.6 zset

​ 向有序集合中加入一个元素和该元素的分数

​ 添加元素

ZADD key score member [score member ...]

​ 按照元素分数从小到大的顺序 返回索引从start到stop之间的所有元素

ZRANGE key start stop [WITHSCORES]

​ 获取元素的分数

ZSCORE key member

​ 删除元素

ZREM key member [member ...]

​ 获取指定分数范围的元素

ZRANGEBYsCORE key min max [WITHSCORES] [LIMIT offset count]

​ 增加某个元素的分数

ZINCRBY key increment member

​ 获取集合中元素的数量

ZCARD key

​ 获得指定分数范围内的元素个数

ZCOUNT key min max

​ 按照排名范围删除元素

ZREMRANGEBYRANK key start stop

​ 获取元素的排名

​ 从小到大ZRANK key member

​ 从大到小ZREVRANK key member

​ 应用场景:
​ 销量排行榜

​ 微博热搜等

2. 缓存淘汰

查看redis可以使用的最大内存:config get maxmemory

设置redis的最大占用内存:config set maxmemory xxx 后面可以跟单位,ex:100mb。0代表无限制。

当内存占满时,会执行缓存淘汰策略。

Redis提供的淘汰策略:

  • noeviction:内存满了直接报错(系统默认)

  • allkeys-lru:lru算法,所有key里面

  • volatile-lru:lru算法,仅限设置了过期时间的(常用)

  • allkeys-random: 随机删除任意数据

  • volatile-random: 随机删除设置了过期时间的key

  • volatile-ttl: 设置了过期时间的,从最快过期的key里面开始删除

查看当前的缓存淘汰策略:config get maxmemory-policy

设置新的缓存淘汰策略:config set maxmemory-policy volatile-lru

3. 集群

3.1 主从模式

主节点(master),从节点(slave)

特点:

  • 该模式下,master节点唯一,slave可以有多个。

  • master节点对外提供读写服务,slave节点实时同步master的数据,但是只提供读服务。

  • 若master节点宕机,slave节点不会晋升成master节点,但是依然可以提供读服务。

工作机制:

  • slave节点初始化时会向主节点传输sync命令,拿到rdb数据,master节点在sync命令之后进行的写操作会全部传送到slave节点。
  • master节点接收到的所有写操作会实时同步到slave节点

配置:

master节点需配置连接密码,其他配置不用改变

slave节点配置redis.conf:

replicaof <master-ip> <master-port>
masterauth <master-password>

3.2 哨兵模式(Sentinel)

特点:

  • 建立在主从模式的基础上

  • 当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master

  • 当master重新启动后,将做为slave接收新的master的同步数据

  • sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群

  • 多sentinel配置的时候,sentinel之间也会自动监控

  • 一个sentinel或sentinel集群可以管理多个主从Redis,多个sentinel也可以监控同一个redis

  • sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也挂了

工作机制:

  • 每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个 PING 命令
  • 如果一个实例距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被sentinel标记为主观下线。
  • 如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态
  • 当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线
  • 在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,slave发送 INFO 命令
  • 当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送 INFO 命令的频率会从 10 秒一次改为 1 秒一次
  • 若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除;若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除

配置:

每台哨兵节点配置相同,监听master节点即可:sentinel.conf

sentinel monitor mymaster <master-ip> <master-port> 2                 #判断master失效至少需要2个sentinel同意,建议设置为n/2+1,n为sentinel个数
sentinel auth-pass mymaster <master-password>
sentinel down-after-milliseconds mymaster 30000                 #判断master主观下线时间,默认30s

然后启动哨兵的进程。

3.3 集群模式(Cluster)

相当于横向扩容,解决单机redis容量有限的问题。

特点:

  • 所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用
  • 不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
  • 支持在线增加、删除节点
  • 客户端可以连接任何一个主节点进行读写
  • 最少需要6个节点,3主3从,3主节点为了投票。

配置:

  1. 修改redis.conf,打开cluster模式。6个节点配置相同:

    cluster-enabled yes
    cluster-config-file nodes-xxx.conf 
    
  2. 创建集群:redis-cli--cluster create 节点1:端口 节点2:端口 节点3:端口 节点4:端口 节点5:端口 节点6:端口 --cluster-replicas 1(--cluster-replicas 1 1个master节点配置1个从节点)

4. 持久化

4.1 RDB(Redis DataBase)

快照方式,根据自动配置或手动操作将内存中的数据存储在硬盘上。默认的文件名为dump.rdb。

触发机制:

  • save手动触发:阻塞其他所有命令,将数据备份,备份完成后继续工作。
  • bgsave手动触发:fork子线程进行数据备份,期间可以处理其他命令。(fork时会阻塞线程,但是时间很短)
  • 自动方式:redis.conf中设置策略。save m n:表示m秒内数据集存在n次修改时,自动触发bgsave。
    • 默认配置就有三条自动化配置:
      • save 900 1:900 秒内如果至少有 1 个 key 的值变化,则保存
      • save 300 10 :300 秒内如果至少有 10 个 key 的值变化,则保存
      • save 60 10000 :60 秒内如果至少有 10000 个 key 的值变化,则保存

优点:

  • 文件紧凑,全量备份,适合异地灾备
  • 恢复数据快

缺点:

  • 非实时。突然宕机会丢失数据。

4.2 AOF(Append Only File)

日志记录方式。客户端发来的每一条消息,都会记录到日志里。恢复数据时,重新执行记录的所有命令即可。

三种设置:

  • 每修改同步 always:同步持久化。每次数据变更立即记录日志,性能差但数据完整性比较好
  • 每秒同步 everysec:异步操作。每秒记录 如果一秒内宕机,有数据丢失
  • 不同步 no:从不同步

优点:

  • 保护数据不丢失(同步方式)

缺点:

  • 日志会不断增大,虽然有重写机制,依然会不断增长。
  • 恢复数据慢

4.3 总结

两者同时使用。根据业务,自行调整。

速度or数据完整性不可兼得。

5. 分布式锁

5.1 手动写

5.2 redisson