简介:
-
是一个高性能的 key-value数据库。
-
存在内存中
-
与其他 key-value 缓存产品有以下三个特点:
-
-
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
-
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
-
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
-
Redis优势:
-
高性能
-
丰富的数据类型
-
原子性
-
丰富的特性
redis能干嘛?
与传统数据库MySQL关系:
-
Redis是key-value数据库(NoSQL)的一种,MySQL是关系型数据库
-
Redis数据操作主要在内存,而MySQL主要存储在磁盘
-
Redis在某一场景使用中要明显优于MySQL,比如计数器,排行榜方面
-
Redis通常用于一些特定场景,需要与MySQL一起配合使用
注意:两者并不是相互替代和竞争关系,而是共用和配合
日常使用Linux装redis,使用Linux进行开发
-
Linux环境安装redis必须先具备gcc编译环境
-
什么是gcc:是Linux下的一个编译程序,是c程序的编译工具。
-
yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake yum -y install wget httpd-tools vim
-
在window上下载了redis后,使用xfile将其放到linux的 /opt 目录下
-
进入到 /opt 目录使用
tar-zxvf 你的redis压缩包
-
cd 到 解压后的 redis 目录
-
使用
make && make install
安装
-
会默认安装到
usr/local/bin
-
修改 redis7.conf 文件
-
让 redis 在后台启动
daemonize no 改为 daemonize yes
-
protected-mode yes 改为 protected-mode no
-
允许其他机器访问
注释 bind 127.0.0.1 -::1
-
设置redis访问密码
打开注释
requirepass 你的密码
-
-
运行redis服务器
redis-server /myredis/redis7.conf
出现如下报错:
67147:C 28 Oct 2023 20:46:34.584 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://githu
解决方法:
-
进入到 /etc/sysctl.conf 文件
-
添加
vm.overcommit_memory=1
-
使用命令:
vm.overcommit_memory=1
使配置文件生效
-
-
检查端口6379是否被占用:
ps -ef|grep redis|grep -v grep
-
启用redis
redis-cli -a 123456
-
测试
-
redis服务器关闭方法:
-
直接在端口号处 SHUTDOWN, 然后quit
-
远程关闭:
-
单实例:
redis-cli -a 123456 shutdown
-
多实例:
redis-cli -a 123456 -p 希望关闭的端口号 shutdown
-
-
redis10大数据类型
-
redis字符串(String
-
-
同时设置/获取多个键值
-
mset
-
mget
-
msetnx(可以理解为事务整体,成功则全成功,失败一个则全部失败)
-
-
获取指定区间范围内的值
-
getrange
-
setrange
-
-
数值增减(一定要是数字)
-
递增数字:INCR key
-
增加指定的整数:INCRBY Key increment(比如:INCRBY key1 5)
-
递减数值 DECR key
-
减少指定的整数 DECR key decrement
-
-
获取字符串长度和内容追加:
-
STRLEN key
-
APPEND key value
-
-
分布式锁
-
setnx key value
-
setex(set with expire)键秒值/setnx(set if not exist)
-
-
getset(先get再set)
-
-
redis列表(List)
-
是一个双端链表的结构容量是2的32次方-1大概40多个亿,主要功能有pop/push等,一般用在栈,消息队列等
-
lpush/rpush/lrange
-
lpop/rpop
-
按照索引下标获得元素(从上到下); lindex
-
获取列表中元素个数; llen
-
删除N个值等于v1的元素; lrem key 数字N给定值v1
-
截取指定范围的值后再赋值给key ;ltrim key 开始index 结束1index
-
rpoploush 源列表 目的列表 (将源列表的末尾值pop,然后将该值添加到目的列表的头)
-
lset key index value
-
linsert key before/after 已有值 插入的新值
-
-
redis哈希表(Hash)
-
KV模式不变,但是v是一个新的键值对 Map<String, Map<String, object>>
-
hset/hget/hmset/hmget/hgetall/hdel
-
hlen 获取某个key内的全部数量
-
hexists key 在key里面某个值的key
-
hkeys/hvals
-
hincrby/hincrbyfloat
-
hsetnx
-
-
redis集合(Set)
-
无序无重复
-
底层是哈希表实现
-
单值多value,且无重复
-
SADD key member[member ...] 添加元素
-
SMEMBERS key 遍历集合中所有元素
-
SISMEMBER key member 判断元素是否在集合中
-
SREM key member[member ...] 删除元素
-
scard 获取集合里面的元素
-
SRANDMEMBER key [数字] 从集合中随机展现设置的数字个数元素,元素不删除
-
SPOP key[数字] 弹出栈
-
SMOVE key1 key2 在key1已存在的某个值 将key1里已存在某个值付给key2
-
集合运算
-
差集 A-B:属于A但不属于B的元素构成的集合 SDIFF keyA [keyB]
-
集合的并集运算 A ∪ B:属于 A或者属于B的元素构成的集合:SUNION keyA keyB
-
集合的交集运算 A ∩ B:A,B共有部分
-
SINTER key[key ...]
-
SINTERCARD numkeys key[key ...] [LIMIT limit] (不返回结果集,而只返回结果的基数。返回由所有给定集合的交集产生的集合的基数)
-
-
-
-
-
redis有序集合(ZSet)
-
在set基础上,每个value值前加一个score分数值
-
添加元素:ZADD key score member [score member ...]
-
按照元素分数从小到大的顺序返回索引从start到stop之间所有元素:ZRANGE key start stop[WITHSCORES]
-
按照元素分数从大到小的顺序返回索引从start到stop之间所有元素:ZRERANGE key start stop[WITHSCORES]
-
获取指定分数范围的元素:ZRANGEBYSCORES key min max [WITHSCORES] [LIMIT offset count]
-
withscores
-
( 表示不包含
-
limit 作用是返回限制
-
-
ZSCORE key member 获取元素的分数
-
ZCARD key 获取集合中元素的数量
-
zrem key 某score下对应的value值,作用是删除元素
-
ZINCRBY key increment member 增加讴歌元素的分数,increment为增加分数值
-
ZCOUNT key min max 获得指定分数范围内的元素个数
-
ZMPOP 从键名列表中的第一个非空集排序集中弹出一个或者多个元素,他们是成员分数对
-
ZRANK key values值,获取下标
-
zrerank key values值, 逆序获得下标值
-
-
redis地理空间(GEO)
-
GEOADD 多个 经度、纬度、位置名称添加到指定的key中
-
出现中文乱码需要quit 在登录界面追加 --raw
-
redis-cli -a 123456 --raw
-
-
GEOPOS 从键里面返回所有给定位置元素的位置(经度和纬度)
-
GEOHASH 返回坐标的geohash表示
-
GEODIST 两个位置间的距离
-
GEORADIUS 以半径为中心查询xxx
-
GEORADIUSBYMEMBER
-
-
redis基数统计(HyperLogLog)
-
统计某个某个网站UV(UV:Unique Visitor,独立访客,一般理解为客户端ip => 进行去重考虑)
-
去重复统计功能的基数估计算法-HyperLogLog
-
PFADD key element[element ...] 添加指定元素
-
PFCOUNT key[key ...] 返回给定 HyperLogLog的基数估算值
-
PFMERGE destkey sourcekey [sourcekey ...] 合并多个HyperLogLog
-
-
redis位图(bitmap)
-
是由0和1状态表现的二进制位的bit数组
-
用String 类型作为底层数据结构实现的一种统计二值状态的数据类型,位图本质是数组
-
setbit key offset value: 解释 setbit 键 偏移位 只能0 或1 btmap偏移量是从0开始的
-
getbit key
-
strlen 统计字节数占用多少(1bit 扩容)
-
bitcount 全部索引里面1占多少
-
bitop
-
-
redis位域(bitfield)
-
将redis字符串看作是 一个由二进制位组成的数组 并且能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改。
-
作用:
-
位域修改
-
溢出控制
-
-
基本命令:
-
BITFIELD key [GET type offset]
-
BITFIELD key [SET type offset value]
-
BITFIELD key [INCRBY type offset increment]
-
溢出控制 OVERFLOW [WRAR|SAT|FAI
-
-
-
redis流(Stream)
-
就是redis版本的mq消息中间件
-
-
四个特殊符号:
-
- +: 最小和最大可能出现的id
-
$:表示只消费新的消息,当前流中最大的id,可用于将要来到的消息
-
>:用于 XREADGROUP命令,表示迄今还没有发送给组中使用者的信息,会更新消费组的最后ID
-
*:用于XADD命令中,让系统自动生成id
-
-
相关指令:
-
XADD:添加消息到队列末尾
-
消息id必须大于上个id
-
默认使用星号表示自动生成规矩
-
* 用于XADD命令中,让系统自动生成id
-
-
XRANGE:用于获取消息列表(可以指定范围),忽略删除的消息
-
start 表示开始值,-代表最小值
-
end 表示结束值,+代表最大值
-
count 表示最多获取多少个值
-
-
XREVRANGE
-
XDEL
-
XLEN 用于获取Stream队列的消息长度
-
XTRIM
-
用于对stream的长度进行截取,如超长会进行截取
-
MAXLEN 允许最大长度,对流进行修剪,限制长度
-
MINID 允许的最小id,从某个id值开始比该id值小将会被抛弃
-
-
XREAD
-
用于获取消息(阻塞/非阻塞),只会返回大于指定id的消息
-
非阻塞
-
阻塞
-
-
XGROUP CREATE 用于创建消费者组
-
XREADGROUP GROUP
-
">" 表示从第一条尚未被消费的消息开始读取
-
消费组groupA内的消费组consumer1从mystream消息队列中读取所有消息
-
但是,不同消费组的消费者可以消费同一条消息
-
XPENDING 查询每个消费组内所有消费者[已读取,但尚未确认] 的消息
-
XACK 像消息队列确认消息已经处理完成
-
-
-
-
redis 键位(key)
-
keys *:查看当前库所有的key
-
exists key:判断某个key是否存在
-
type key:查看你的key是什么类型
-
del key:删除指定的key数据
-
注意:
-
命令不区分大小写,而是key区分大小写
-
帮助命令 help @类型
-
flushdb:清除当前数据库
-
flushall:通杀全部数据库
-
注意:
-
命令不区分大小写,而是key区分大小写
-
帮助命令 help @类型
-
Redis持久化
-
持化双雄:
-
RDB (Redis DataBase)
-
如何恢复:
-
将备份文件(dump.rdb)移动到 redis 安装目录并启动服务即可
-
备份成功后故意用flushdb清空redis 看看是否可以恢复数据 => 结论:执行flushshell/flushdb命令也会产生dump.rdb文件,但里面是空的,无意义
-
物理恢复,一定服务和备份分机隔离
-
-
手动:Redis提供了两个命令来生产RDB文件,分别是save和bgsave
-
save:在主程序中执行会阻塞当前redis服务器,知道持久化工作完成执行save命令期间,Redis不能处理其他命令,线上禁止使用。
-
-
-
-
-
rdb修复文件,
redis-check-rdb
-
-
-
如何禁用快照:
-
动态所有停止RDB保存规则的方法:
redis-cli config set save ""
-
配置文件修改
-
-
总结:
-
AOF(Append Only File)
-
aof是什么:
-
默认情况下,redis是没有开启AOF的,开启AOF功能需要设置配置: appendonly yes
-
aof保存文件是appendonly.aof
-
工作流程:
-
-
三种写回策略:
-
Always:同步写回,每个命令执行完立刻同步地将日志写回磁盘
-
everysec:每秒写回,每个命令执行完,只是先把日志写到AOF文件的内存缓冲区,每隔一秒把缓冲区内容写入磁盘
-
no:操作系统控制的写回,每个写回命令执行完,只是先把日志写回到AOF文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
- 混合持化
-
纯缓存模式:
-
同时关闭RDB和AOF
-
save"" 禁用rdb,我们仍然可以使用命令 save,bgsave生成rdb文件
-
appendonly no 禁用aof,我们仍然可以使用命令 bgrewiteaof 生成aof文件
-
-
Redis事务
-
是什么
-
可以1次执行多个命令,本质是一组命令集合,一个事务中的所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入,不允许加塞
-
-
能干嘛
-
一个队列中,一次性、顺序性、排他性的执行一系列命令
-
-
和传统数据库比较:
使用:
-
常用命令:
-
正常执行:(MULTI, EXEC)
-
放弃事务:(MULTI, DISCARD)
-
全体连坐
-
冤有头债有主(类似于runtime error, redis不是完全的事务一致性,而且redis没有回滚)
-
watch监控 :
-
Redis使用Watch来提供乐观锁定,类似于CAS(check and set)
-
悲观锁
-
乐观锁
- CAS
-
-
watch:
-
-
总结:
-
开启:以MULTI开启一个事务
-
入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里
-
执行:由EXEC命令触发事务
-
Redis管道
-
是什么:批处理命令变种优化措施,类似于Redis的原生批命令(mget和mset)
-
小总结:
-
Pipeline与原生批量命令对比:
-
原生批量命令是原子性(mset等),pipeline是非原子性
-
原生批量命令一次只能执行一种命令,pipeline支持批量执行不同命令
-
原生批命令是服务端实现,而pipeline需要服务端和客户端共同完成
-
-
Pipeline与事务对比
Redis复制
是什么:
-
主从复制,master以写为主,Slave以读为主
-
当master数据发生变化的时候,自动将更新的数据异步同步到其他slave数据库
能干嘛
-
读写分离
-
容灾恢复
-
数据备份
-
水平扩容,支撑高并发
Redis哨兵
-
哨兵的作用
-
监控redis运行状态,包括master和slave
-
当master宕机后,自动将slave切换成新的master
-
-
能干嘛:
-
主从监控:监控主从redis库运行是否正常
-
消息通知:哨兵可以将故障转移的结果发送给客户端
-
故障转移:如果Master异常,则会进行主从切换,将其中一个Slave作为新的Master
-
配置中心:客户端通过连接哨兵来获取当前Redis服务的主节点地址
-
-
哨兵一般是集群存在,多数判断master宕机才进行选举
-
怎么使用:
-
配从库不配主库
-
权限细节:
-
master如果配置了 requirepass参数,需要密码登录
-
slave 就要配置 masterauth 来设置校验密码,否则的话master会拒绝slave的访问请求
-
-
基本操作命令
-
info replication 可以查看复制节点的主从关系和配置信息
-
replicaof 主库IP 主库端口
-
一般写入到redis.conf配置文件内
-
-
slaveof 主库IP 主库端口
-
slaveof no one
-
使当前数据库停止与其他数据库的同步,转成主数据库
-
-
-
-
缺点:
-
复制延时,信号衰减
-
master挂了,从机会等待
-
-
ODown客观下线
-
当主节点被判断为客观下线后,集群选出一个哨兵领导来做故障迁移
-
由领导哨兵开始推动故障切换流程并选出一个新master:
-
新主登基:
-
某个Slave被选为新master
-
-
群臣俯首:
-
旧主拜服
-
-
-
Redis集群
-
定义:由于数据量过大,单个master复制集团难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节点间共享数据的程序集。
-
集群可以支持多个Master
-
Springboot集成Redis
-
总体概述:jedis-lettuce-RedisTemplate三者的联系
-
集成Jedis:
-
是什么:
-
步骤:
-
建module
-
改POM
-
写YML
-
主启动
-
业务类
-
-
-
集成lettuce
-
能干嘛:
-
Redis集群支持多个Master,每个Master又可以挂载多个Slave
-
读写分离
-
支持数据的高可用
-
支持海量数据的读写存储操作
-
由于Cluster自带Sentinel的故障转移机制,内置了高可用的支持,无需再去使用哨兵功能
-
客户端与Redis的节点链接,不再需要连接集群中所有节点,只需要任意连接集群中的一个可用节点即可
-
槽位slot负责分配到各个物理服务节点,由对应的集群来负责维护节点、插槽和数据之间的关系
-
-
集群算法-分片-槽位slot
-
redis集群的槽位slot
-
-
redis集群的分片
-
优势:
-
方便扩容、缩容和数据查找
-
-
slot槽位映射,一般业界有三种解决方案:
-
哈希取余分区
-
优点
-
缺点
-
-
一致性哈希算法分区
-
是什么:分布式缓存数据 变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数不ok了
-
能干嘛:提出一致性Hash解决方案。目的是当服务器个数发生变化时,尽量减少影响客户端到服务器的映射关系
-
三大步骤:
-
算法构建一致性哈希环
-
服务器IP节点映射
-
key落到服务器的落键规则
-
-
一致性哈希算法容错性
-
一致性哈算算法的扩展性
-
缺点:Hash环的数据倾斜问题
-
-
哈希槽分区
-
为什么redis集群的最大槽数是16384个
-
Redis集群 不保证强一致性,这意味着在特定条件下,Redis集群可能会丢掉一些被系统收到的写入请求命令
-
-
集群环境案例步骤
-
-