Redis笔记

发布时间:2024年01月12日

Redis

Redis十大数据类型

命令手册 :https://redis.com.cn/commands.html

string

string是redis中最基本的数据类型,一个redis中字符出value最多可以是512M
在这里插入图片描述

list

底层是双端链表,最多可以包含2^32-1个元素
在这里插入图片描述

hash

每个hash最多可以存储2^32-1个元素
在这里插入图片描述

set

每个set最多可以存储2^32-1个元素
在这里插入图片描述

zset

  • 和zset一样都是string类型的几个,且不允许重复,不同的是每个元素都会关联一个double类型的分数(score),redis正是通过分数来为集合中的成员进行从小到大的排序
  • zset成员唯一,但是分数(score)可以重复
  • zset集合是通过哈希表实现的,所以添加、删除、查找的复杂度是O(1),最大可以存储2^32-1个元素
  • 其底层由压缩表和跳表组成
    在这里插入图片描述

GEO

在这里插入图片描述

HyperLogLog

  • 再输入元素的数量或者体积非常大时,计算技术所需的空间总是固定的,并且时很小的
  • 再redis中,每个HyperLogLog键只需要花费12kb内存,就可以计算接近2^64个不同元素的基数
  • 只会根据输入元素来计算基数,不会存储输入元素本身
  • 去重复后的真实个数
  • 但是有 0.81% 的误差,因为使用的哈希算法必然会有概率发生冲突
  • 其底层实现依然是string类型
    在这里插入图片描述
    UV:独立访客,一般理解为客户端ip

bitmap

  • 由0和1组成的二进制位的bit数组,只记录0和1
  • string类型作为底层数据结构实现的一种统计二值状态的数据结构
  • bitmap支持最大的位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿(就是2的32次方)的字节信息
#Bitmap的偏移量是从0开始计算的
setbit 键 偏移位 0或者1(只能) 

#获取
getbit 键 偏移量

#统计这个字节数占用了多少  不是字符串长度二十占据了几个字节,超过8位后自己按照8位一组一byte再扩容
strlen 键

#全部键里面含有1的有多少个
bitcount 键

#对一个或多个保存二进制位的字符串key进行位元操作,并将结果保存到destksy上
bitop and destkey key [key...]对一个或者多个key求逻辑并,并将结果保存到destkey
bitop or destkey key [key...]对一个或者多个key求逻辑或,并将结果保存到destkey
bitop xor destkey key [key...]对一个或者多个key求逻辑异或,并将结果保存到destkey
bitop not destkey key [key...]对给定key求逻辑菲,并将结果保存到destkey

bitfield

Stream

Redis持久化

RDB (Redis Database)

  • RDB持久性以指定的时间间隔执行数据集的时间点快照
  • 文件名 dump.rdb
  • 全量快照
  • 默认配置文件中配置的是save 900 1save 300 10save 60 10000 分别表示15分钟有一个修改、5分钟有10次修改、一分钟有10000次修改时,保存一次rdb快照
  • 手动生成rdb命令savebgsave(默认),使用save会阻塞redis主线程、bgsave是异步执行
  • RDB在内存中的加载速度比AOF快,但是RDB及时性不如AOF
  • 修复rdb文件:使用redis-check-rdb工具
  • 会触发rdb的情况:1、配置文件中快照配置;2、手动bgsave;3、执行flushall/flushab命令但是里面是空的;4、执行shutdown且没有开启AOF持久化时;5、主从复制时,主节点自动触发
  • 配置文件里设置save " "表示禁用RDB

AOF(Append Only File)

  • 以日志的形式记录每个写操作
  • 默认没开,配置文件appendonly yes 开启
  • 文件名 appendonly.aof
  • AOF缓冲区会根据同步文件的三种写回策略(Always(立刻回写)、everysec(每秒回写)、no(操作系统控制))将命令写入磁盘上的AOF文件,配置文件appendfsync everysec
  • AOF会将越来越大的命令进行重写,合并命令,手动合并命令bgrewriteaof
  • 修复aof文件:使用redis-check-aof工具
  • 文件大、aof比rdb慢

混合模式

  • 设置aof-use-rdb-preamble的值为yes,开始混合模式
  • rdb全量,aof增量

Redis事务

在这里插入图片描述

  • 一次执行多个命令,按顺序的串行化执行而不会被其他命令插入
  • 不保证原子性,也就是不保证所有命令同时成功或者失败

Redis管道

问题:如何优化频繁命令往返造成的性能瓶颈?
管道解释:一次性发送多条命令给服务端,服务端依次处理完毕后通过一条响应一次性将结果返回,减少通信次数降低往返花费的时间

cat cmd.txt | redis-cli -a 密码 --pipe

Redis发布订阅

略,功能参考mq

Redis复制(主从)

  • 一主二仆:主写从读

  • 在这里插入图片描述

  • 薪火相传:上一个slave可以是下一个slave的master,slave同样可以接受其他slaves的连接和同步

  • 在这里插入图片描述

  • 反客为主:slave变为master

  • 在这里插入图片描述

Redis哨兵

在这里插入图片描述

  • 哨兵监控后台master主机是否故障,如果故障了根据投票数自动将某个从库转为主库
  • 主观下线:单个哨兵自己主观检查到master的状态没有收到回复
  • 客观下线:多个哨兵认为下线,法定人数/法定票数
  • 选举出兵王(Raft算法),由兵王切换master

Redis集群

在这里插入图片描述

  • 有多个master,读写分离
  • Cluster自带Sentinel的故障转移机制,内置高可用,无需哨兵功能
  • 槽位slot复制分配各个物理服务节点,集群分配了16384个槽位,通过算法CRC16(key) mod 16384计算存入key的槽位在哪

Redis单线程 VS 多线程

单线程为什么快

  • 基于内存、数据结构专门设计大部分时间复杂度都是0(1)
  • redis性能瓶颈不在cpu,而是在于io和网络,故使用IO多路复用监听多个socket连接客户端
  • redis工作线程是单线程,持久化、异步删除、集群数据同步时由额外的线程执行的

BigKey相关问题

redis里禁用命令配置

rename-command 命令名字 ""

MoreKey(读取大量key)

SCAN 用于迭代当前数据库中数据键
SSCAN 用于迭代集合
HSCAN用于迭代哈希键中的键值对
ZSCAN用于迭代有序集合中的元素(包括元素成员和元素分值)

大key问题

  • value控制在10kb以内,hash、list、set、zset元素不要超过5000个
  • 非字符串的bigkey不要使用del删除,使用上述SCAN方式渐进式删除,同时要方式bigkey过期时间自动删除
  • 如何发现bigkey:1、redis-cli --bigkeys;2、MEMORY USAGE
  • 如何删除:string使用unlink删除,其他类型使用对应的SCAN命令渐进式删除

缓存双写一致性问题

  • 保证的是数据的最终一致性
  • 使用canal同步更新redis
  • 延迟双删
  • 更新redis过程加锁

分布式锁

  • 分布式锁的特性:独占性、高可用、防死锁、不乱抢、重入性
  • setnx
  • redisson框架中看门狗机制

缓存过期淘汰策略

redis内存配置

  • 在redis配置文件中 maxmemory 0 表示机器有多少就占用多少

内存淘汰

  • key过期后不是立即删除,而是惰性删除,下次访问后发现过期了就删除这个key,开启惰性删除lazyfree-lazy-eviction=yes
淘汰算法
  • LRU(最近最少使用)
  • LFU(最近最不常用)
文章来源:https://blog.csdn.net/weixin_43480202/article/details/133713703
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。