我想学黑马新出的若依+AI
需要备有这个前置知识: 非关系型数据库Redis
学习的是b站GeekHour的课程,链接如下:https://www.bilibili.com/video/BV1Jj411D7oG/?spm_id_from=333.337.search-card.all.click&vd_source=865f32e12aef524afb83863069b036aa
一、Redis简介
一个开源的基于内存的数据存储系统,可以用作数据库缓存和消息队列等各种场景,也是最热门的NoSql数据库之一
以前用Mysql 随着应用系统的访问量变大,导致性能下降(磁盘IO导致) 那若把数据存储在内存中就可以大大提高性能
redis使用方式包括三种类型:
第二种简单来说就是使用java或python这些编程语言通过编写代码的方式使用redis
redis优势:
性能高、数据类型丰富、简单易用,支持所有主流编程语言、支持数据持久化,主从复制,哨兵模式等高可用特性
二、安装配置
我是windows系统,可以通过下面三个方式来安装
这里我是在虚拟机中用docker拉取redis的
测试连接
三、String字符串
SET命令设置一个键值对
GET命令获得键对应的值(区分大小写)
DEL代表删除键
EXISTS判断键是否存在
KEYS * 查看有哪些键
KEYS *me查找所有以me结尾的键
FLUSHALL把所有数据库中的键都删除掉
redis中默认使用字符串来存储数据
我们可以把很多类型的数据都存储在redis中
其中的键和值都是用二进制的形式存储的 默认不支持中文
这里假如我们输入中文
可以看到中文换成了二进制形式
怎样正常显示中文呢?
退出当前redis的客户端 输入命令redis-cli --raw(表示以原始的形式显示内容)
可以用clear命令清空屏幕
如何设置带有过期时间的键值对?
使用TTL(time to leave)命令查看一个键的过期时间
显示-1即并未设置过期时间 -2表示已经过期
用EXPIRE命令设置一个过期时间
如下设置10s过期时间
再次GET可以看到没有输出了
除此之外,可以使用SETEX命令设置一个带有过期时间的键值对
SETNX命令 只有当键不勋在的时候才设置键的值(如果键已存在则不做任何动作)
四、List列表
通常用来存储和操作一组有顺序的数据
可以使用LPUSH 和RPUSH命令来将
元素添加
到列表的头部或尾部
想要获取列表内容需要使用LRANGE命令
LRANGE letter 0 -1 表示起始位置是0表示第一个元素 结束位置是-1表示最后一个元素
这样即可获得列表中的所有元素
此命令还可以一键添加多个元素
RPUSH同理就不进行演示了
同时
删除元素
有RPOP和LPOP命令返回被删除的元素
可以一次性删除多个元素 在命令后面加上删除的个数即可
删除多个元素
用LLEN命令
查看列表的长度
以上可以用来实现一个简单的消息队列
LPUSH先在头部添加一个元素 使用RPOP在列表尾部删除一个命令 =》一个简单的先进先出队列
LTRIM命令来
删除列表中指定范围以外的元素
即只保留start和stop之间的元素
以下我把letter队列中的元素全部清空 然后重新添加元素
删除索引1到3之外的元素
五、Set集合
其中的元素是不可重复的 且无序
其命令基本上以s开头
创建集合添加元素
SADD命令后面加上一个键表示集合的名称 然后就是集合的元素(可多个)
查看集合中的元素
SMEMBERS命令
注意不会有重复的元素
判断一个元素是否在集合中
SISMEMBER命令
删除集合中的元素
SREM命令
还有部分集合的运算
六、SortedSet有序集合
和集合的区别在于 有序集合的每一个元素都会关联一个浮点类型的分数(分数可以重复) 按照分数对集合中的元素进行从小到大的排序
相关命令都是以z开头的
向有序集合中添加一个元素
ZADD命令 每个元素都是一个分数和一个成员组成的
列出有序集合
ZRANGE命令跟LRANGE类似 只输出成员
若要输出成员的同时也输出分数 即在命令后面加上 WITHSCORES
查看某成员的分数
ZSCORE命令
查看某成员的排名
ZRANK命令 从小到大的index
but一般的排名都是从大到小的 这里就需要翻转
ZREVRANK命令
其他
七、Hash哈希
一个字符类型的字段和值的映射表 即键值对的集合 特别适合用来存储对象
相关命令都是以H开头
向哈希中添加一个键值对
HSET命令
获取哈希中的某个键值对
HGET命令
获取整个哈希中的所有键值对
HGETALL命令键值对是成对出现的
删除哈希中的键值对
HDEL命令
判断某个键值对是否存在
HEXISTS命令
获取哈希中的所有键
HKEYS命令
获取哈希中所有键值对的数量
HLEN命令
其他
八、发布订阅模式
将消息发送到指定的channel
PUBLISH命令
订阅channel
即可接收到频道的消息
SUBSCRIBE命令
How to use?
打开两个终端
在一个终端订阅 在另一个终端发布消息
订阅频道的终端可以有多个
局限性在于消息无法持久化、无法记录历史消息等=》用stream流解决这些问题
九、Stream消息队列
解决消息无法持久化
相关命令都以x开头
向Stream流中添加消息
XADD命令
这里的lxr表示消息的名字 *表示自动生成一个消息id 后面表示加入课程***
查看Stream中消息的数量
XLEN命令
查看Stream中的详细内容
XRANGE命令这里的开始和结束可以使用减号和加号表示所有的消息
删除消息
XDEL命令
XTRIM命令 MAXLEN 0 表示删除所有的消息
手工指定ID
需要自己保证ID的递增
格式为一个整数+一个短横线+一个整数
消费消息
生产者生产消息并用XADD加入消息队列里面,消费者需要从消息队列中读取消息以消费消息(处理消息)
XREAD命令
COUNT 2表示一次读取两条消息 BLOCK 1000表示如果没有消息的话就阻塞1000ms(1s)STREAMS后面加上消息队列的名称 0表示从头开始读取
阻塞的效果
获取从现在开始以后得最新的消息 将0换成$
可以创建一个消费者组在消费者组中添加消费者
创建消费者组
XGROUP命令
创建了一个名称为group1的消费者组
查看消费者组的信息
XINFO命令
返回了组的名称 消费者数量 待处理的消息树等
添加消费者
读取消息
XREADGROUP命令
右箭头表示读取最新的消息
其他
十、Geospatial地理空间
提供了一种存储地理位置信息的数据结构 同时支持对地理位置进行各种计算操作
比如计算两个位置之间的距离、获取某个地理位置的经纬度、查找附近的人等等
相关命令以GEO开头
添加某个位置的地理位置信息(经纬度)
GEOADD命令
获取某个地理位置的经纬度
GEOPOS命令
计算两个地理位置之间的距离
GEIDIST命令
默认的单位是m
如果换算成成km的话
搜索指定范围内的成员并返回
GEOSEARCH命令
范围可以以成员的位置或者以一个指定的经纬度为中心,按照圆形或者矩形的范围来搜索
查找距离上海1100km的城市
GEORADIUS和GEORADIUSBYMEMBER也可以实现 BYBOX表示矩形的范围
其他
十一、HyperLogLog
一种用来做基数统计的算法
不是redis特有的
如果集合中的每个元素都是唯一且不重复的 那么这个集合中的基数就是集合中元素的个数
其原理是使用随机算法来计算 通过牺牲一定的精确度 来换取更小的内存消耗(占用内存小but会有一定误差)
可以统计网站的搜索词
相关命令都以PF开头
添加一个元素
PFADD命令
查看基数
PFCOUNT命令
合并多个HyperLogLog
PFMERGE命令
把合并之后的结果放在result里面 取并集
其他
十二、Bitmap位图
字符串类型的扩展 可以使用一个String类型来模拟一个bit数组 数组的下标就是偏移量 值只有0和1 也支持一些位运算比如与或非、异或等
可以用来记录用户的签到情况 在线状态 有没有点过赞等
相关命令都以BIT开头
设置某个偏移量的值
SETBIT命令
把偏移量为0的位置设置为1 把偏移量1的位置设置为0
这样就设置了一个长度为2的位图
获取某个偏移量的值
GETBIT命令
但是像这样一位一位的设置非常麻烦 这里位图本质上就是一个字符串
所以我们可以
直接使用字符串的命令来设置它的值
SET命令
重新设置dianzan的值让其前4位都为1 后4位都为0
tips:我们可以使用一个十六进制来表示一个二进制的数 "\xF0"表示二进制的11110000 二进制的1111 = 16进制的0xF
统计某一个key的值里面有多少个bit是1
BITCOUNT命令
获取某个key里面第一个出现的0或者1的位置
BITPOS命令
后面还可以跟查找的范围
其他
十三、BitField位域
能够将很多小的整数存储到一个较大的位图中
能更加高效的使用内存
利用位域可以记录每个玩家在游戏中的一些关键信息,金钱、等级
初始化设置
BITFIELD命令
后面加上一个key表示id u8表示8位的无符号整数 #0表示第一个位置
返回等级set->get
设置第二个位置,查看内存情况
Tips:100转换成字符型存储就是d,(d的ascll码是100)
在原来的基础上增加
incrby
十四、事务
在一次请求中执行多个命令
在关系型数据库中,事务是原子性操作,要么全部执行成功,要么全部执行失败
而在redis中,事务并不能保证所有的命令都会执行成功,它的执行结果取决于事务中的命令
可以保证以下三点:
1.在发送exec命令之前,所有命令都会被放入一个队列中缓存起来,不会立即执行
2.在收到exec命令之后,事务开始执行,事务中的任何一个命令执行失败,其他的命令依然会被执行
3.在事务执行的过程中,其他客户端提交的命令请求并不会插入到事务的执行命令序列当中
TX表示已经进入事务模式 提示QUEUE表示命令已经被放入队列中
此时在外面再打开一个终端用GET是获取不到值的,因为事务还没有执行
最后通过exec命令来执行事务
事务执行结束 即可获取到值
返回错误并不会影响执行成功的值
十五、持久化
因为redis是一个基于内存的数据库,如果没有持久化,一旦服务器断电或者重启,那么之前的所有数据都会丢失
两种方式
RDB(Redis Database)方式
指在指定时间间隔内,将内存中的数据快照写入磁盘,它是某一个时间点上数据的完整副本,可以通过配置文件中的save参数来配置 后面的参数是时间和修改次数的组合(配置文件自动触发快照)
在命令行终端输入save命令(save命令手动触发快照)
缺点:如果服务器在快照之后宕机了,那么最后一次快照之后的所有修改内容都会丢失掉,所以RDB更适合用来做备份
可以在每天凌晨的时候通过crontab来执行一次save命令,然后将快照文件备份到其他地方,这样就可以保证数据的安全了
由于生产环境中,为redis开辟的内存区域比较大,内存中的数据同步到硬盘的这个过程需要持续较长的时间,这段时间内redis都是处于一个阻塞的状态,不能接受任何请求->bgsave命令
bgsave命令
会单独创建一个子进程来负责将内存中的数据写入到硬盘中,这样的话主进程就可以继续处理请求了,还是会有一定的性能损耗,因为fork一个子进程还是需要时间的,这段时间内redis还是不能处理任何请求
为了做到秒级的快照,提出了下面的方式
AOF(Append Only File)方式
指追加文件,原理是在执行写命令的时候,不仅会将命令写入内存中,还会将命令写入到一个追加的文件中即AOF文件,它会以日志的形式来记录每一个写操作
只需要在配置文件中将appendonly这个参数的值改成yes即可
十六、主从复制
指将一台redis服务器的数据复制到另一台redis服务器,也叫主节点(master)和从节点(slave)
一个主节点可以有多个从节点,而每个从节点只能有一个主节点(一对多)
数据的复制是单向的,只能由主节点到从节点
一般地,主节点负责写操作,从节点负责读操作 。主节点会将自己的数据变化通过异步的方式发送给从节点,从节点接收到主节点的数据之后更新自己的数据,这样就可以达到数据一致
默认的配置就是主节点,所以只需要修改从节点的配置
有两种修改的方式:
命令行执行命令、配置文件来修改
命令行修改
不常用
配置文件修改
找到redis.conf文件,将其复制到根目录下 cp redis.conf ~
回到根目录再复制给一个6380的文件作为从节点的配置文件 cp redis.conf redis-6380.conf
进入redis-6380.conf文件,改动以下几个地方:
1.端口号port改为6380
2.将pidfile的配置项也改为6380
3.dbfilename后面的文件名也加上端口号dump-6380.rdb 这个就是持久化文件
4.找到replicaof 用来指定主节点 将注释取消 replicaof 127.0.0.1 6379
重新启动 redis-server redis-6380.conf
主节点的数据变化会自动同步到从节点上
将配置文件6380整体替换6381
十七、哨兵模式
主机宕机了,还是需要手工把另一台从节点提升为主节点,需要人工干预则不能实现高可用
哨兵模式实现自动的故障转移
哨兵会以一个独立的进程运行在redis集群中,用来监控redis集群中的各个节点是否运行正常
主要执行下面几个功能:
1.监控,通过不断的发送命令来检查redis节点是否正常
2.通知,如果发现某个节点出了问题,那么哨兵就会通过发布订阅模式来通知其他节点
3.自动故障转移,当主节点不能正常工作的时候,哨兵会将一个从节点升级为一个新的主节点,然后再将其他的从节点指向新的主节点
在redis集群中添加一个哨兵节点
redis-sentinel命令启动哨兵节点
需要添加一个配置文件sentinel.conf
在配置文件下面添加:
sentinel monitor master 127.0.0.1 6379(监控的主节点) 1(表示只要有一个哨兵同意就可以进行故障转移了)
接下来直接使用上面的命令启动哨兵节点 redis-sentinel sentinel.conf
模拟主节点宕机直接ctrl+c退出6379服务端
可以看到进行了故障转移
可以打开其他的端口的终端进行查看身份 redis-cli -p 6381; info replication
哨兵本身就是一个进行,自己也会有单节点故障问题,所以一般在实际的生产环境下,会使用三个哨兵节点来保证高可用,这三个哨兵节点会通过选举的方式来选出一个领导者,然后由领导者来监控其他节点,领导者挂了会重选=》保证哨兵节点的高可用