Redis笔记

我想学黑马新出的若依+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列表

通常用来存储和操作一组有顺序的数据

可以使用LPUSHRPUSH命令来将

元素添加

到列表的头部或尾部

想要获取列表内容需要使用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)

一个主节点可以有多个从节点,而每个从节点只能有一个主节点(一对多

数据的复制是单向的,只能由主节点到从节点

一般地,主节点负责写操作,从节点负责读操作 。主节点会将自己的数据变化通过异步的方式发送给从节点,从节点接收到主节点的数据之后更新自己的数据,这样就可以达到数据一致

默认的配置就是主节点,所以只需要修改从节点的配置

有两种修改的方式:

命令行执行命令、配置文件来修改

命令行修改

不常用

配置文件修改

虚拟机方式看https://blog.csdn.net/myy2012/article/details/135145076?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_baidulandingword%7ECtr-1-135145076-blog-131461267.235%5Ev43%5Epc_blog_bottom_relevance_base9&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_baidulandingword%7ECtr-1-135145076-blog-131461267.235%5Ev43%5Epc_blog_bottom_relevance_base9&utm_relevant_index=2

找到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

哨兵本身就是一个进行,自己也会有单节点故障问题,所以一般在实际的生产环境下,会使用三个哨兵节点来保证高可用,这三个哨兵节点会通过选举的方式来选出一个领导者,然后由领导者来监控其他节点,领导者挂了会重选=》保证哨兵节点的高可用

相关推荐
LuH112433 分钟前
【论文阅读笔记】Learning to sample
论文阅读·笔记·图形渲染·点云
一棵开花的树,枝芽无限靠近你2 小时前
【PPTist】组件结构设计、主题切换
前端·笔记·学习·编辑器
犬余3 小时前
设计模式之桥接模式:抽象与实现之间的分离艺术
笔记·学习·设计模式·桥接模式
DT辰白3 小时前
基于Redis的网关鉴权方案与性能优化
数据库·redis·缓存
数据爬坡ing3 小时前
小白考研历程:跌跌撞撞,起起伏伏,五个月备战历程!!!
大数据·笔记·考研·数据分析
咖肥猫3 小时前
【ue5学习笔记2】在场景放入一个物体的蓝图输入事件无效?
笔记·学习·ue5
木子七4 小时前
Redis-十大数据类型
redis
郭尘帅6664 小时前
Ajax学习笔记
笔记·学习·ajax
我叫啥都行5 小时前
计算机基础复习12.23
java·开发语言·笔记·后端·学习
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭6 小时前
聊聊volatile的实现原理?
java·jvm·redis