redis学习(复习时结合尚硅谷的笔记)

1.NOSQL数据库简介

问题:

当我们做集群,分布式操作,第一次登录

,nginx负载均衡,给我分配到服务器1,然后我登陆留下session。

第二次登录被nginx分配到服务器2。我的session在服务器1,

session不能实现同步。

解决方法:

把session数据存在NOSQL数据库中。

NOSQL优点1:用缓存数据库。增大IO效率。

NOSQL优点2:在内存中,速度快。

1.1 NOSQL数据库数据库概述

 这个数据库只能在内存中,支持的数据类型单一,只支持字符串。

1.2 数据库的存储形式

1.2.1 列数据库。

这种列式数据库。查平均值挺快。查id为3的人的具体信息慢。 

1.2.2 行式数据库

查单个人员信息快,平均数慢。 

2.Redis的概述与安装

还有主从同步,分布式。

 

2.1 redis相关知识

docker中安好之后,进入redis-cli客户端。

redis中有16个数据库。

 select 1,切换到1号库。

 什么是单线程加多路复用。

例子:1.2.3三个人要有买票需求,告诉黄牛,如果黄牛没拿到属于它们的票,那123就去干各自的事情。黄牛在火车站买票是单线程买票。如果黄牛买到上海的票,那就给1。

(代理)。

3.redis里五大数据类型

 3.1 key键操作(关键字)

K1,K2,K3三个key,后面lucy,mary,jack是value的值。

 添加键值对,set

 exists判断键是否存在,del删除,type查看类型。

返回值为1,存在。

后面慢慢轮到这个操作才删。

 

 

 append,返回总的字符串的长度。

setnx,如果这个key已经存在了,就不设这个键值对。

3.1.1 自增

让value里的数字增1

decr key ,让value里的值减一。

 

按步长增加或减少。 

因为redis是单线程操作。 

M,多重给,但一句话是一个指令。 

 

 3.2 Redis字符串

3.2.1 字符串的数据结构

 3.3 Redis List

底层实际上是双向链表。

 3.3.1 常用命令

一个key,很多的value。

 

 

 

 

lrem指令。从左面删n个value为 newv11的键值对。

 

3.3.2 数据结构

元素少的时候,紧挨着存储,分配的是一块连续的内存。

 

 3.4 Redis集合 Set

 

 smove操作后,相当于剪切,不是CV。

3.4.1 数据结构

3.5 Redis hash

套娃,两个map嵌套。

区别是,操作的时候可以多一个field限定条件。

3.5.1 数据结构

 3.6 有序集合 Zset

里面的元素有评分。

3.6.1指令

 

取出300-500的值。

500-200是降序。

 

3.6.2 数据结构

 3.6.3 跳跃表

 2.跳跃表。

3.6.4 数据类型太枯燥,不学了。查尚硅谷笔记资料

4.Jedis操作redis6

4.1环境搭建

创建一个maven项目,导入依赖。

利用这个jar包里的API脸上redis。

主机ip与端口号。

建一个类,测试是否连接。

 4.1.1 启动docker里的redis。

docker里启动redis。

docker start 容器的id。

容器的image叫redis,然后,以redis-cli的方式打开。

 docker exec -it redis redis-cli

4.1.2连接

连接成功输出为PONG

 4.1.3 测试,具体API,查jedisAPI使用。

测试能不能加数据之类的。

得到redis里所有的key。

4.2 案例验证码

设计思路、

整键值对,解决    手机号与其  输入的次数。

再整个键值对,解决 手机号与验证码的对应。

尚硅谷设计的稀碎,不学它这个代码。

4.3 redis整合springBoot

 配置文件里配置。

3.给写一个配置类。因为springBoot提供了redisTemplate。尚硅谷的太蠢了,没学它的配置类整合。

5.事务和锁机制

事务中的命令都会按序执行。

 5.1 事务命令

multi,让命令按顺序组队。

exec之后,这个事务就算完成了。discard命令,退出multi的组队过程。

5.2 事务的错误处理

1.里面如果组队阶段       出现了一个错命令并且报错

那exec这三个命令,都不会成功。然后回滚 

2. 如果组队阶段,命令是错的,但没报错。

exec这三个命令,没报错的错误命令不会被执行,其他的会被执行。

5.3 事务的冲突问题解决

5.3.1悲观锁

认为每次操作都不安全,都需要加锁。对资源上锁,操作完了才解锁。效率低。

5.3.2 乐观锁的介绍

相当于多线程问题,数据库里刚开始的数据    10000 ,打上版本号1.0。

两个线程的要对这个版本号的数据操作,

黄色的操作先一步提交,数据库里的数据变成2000,版本号变成 1.1.

蓝色的操作要操作的对象是1.0版本的数据。现在没有1.0了,这个操作报废。

5.3.3 乐观锁的使用

事务multi前,对要监听的键,用watch。如果在另一个终端exec了, 这个key的值变了。那这个事务就不会执行成功

5.4 Redis事务三大特性

5.5 秒杀案例

商品库存减一,秒杀成功者名单加1.

6.Redis持久化操作RDB 

6.1 RDB

一段时间做一次这个操作。

 6.2 RDB怎么执行(底层)

总结:fork创建一个完全一样的子进程,把数据先同步到临时文件里,如果这个临时文件没问题,就覆盖原来进程的.rdb文件。

不是直接把数据写在持久化文件里。 

 而是先把数据同步到一个临时区域,然后覆盖持久化文件。

那为什么不直接同步到.rdb文件呢?     因为:同步的过程可能会出现数据同步错误。

等临时区域里的数据没问题了,再同步到.rdb文件。

linux里的fork函数创建子进程。子进程就是为了同步的。

 6.3 dump.rdb文件

 硬盘满了,yes关闭写操作。

save字条

如果在20s,内有3个key发生变动,就进行持久化操作。

到了20s,就会持久化或者20s内,变化的key达到3个以上,就做持久化操作。

 6.3.1 RDB的优势

6.3.2 RDB的劣势

 最后一次准备用save私有化的时候,服务器可能会崩掉,部分数据损失。

6.4 RDB的备份

就特么对dump.rdb,复制粘贴一份到别的地方。啥时候需要用了,再把这个副本改个名,改成dump.rdb,放进redis的 /usr/local/redis/bin目录下,然后重启redis。

7.持久化操作AOF

7.1 AOF

 红色横线那里,找到文件里,appendonly在哪。

 7.2 备份

跟RDB的备份差不多。复制一份AOF文件。利用副本恢复。

7.3 AOF同步频率设置

 7.4 AOF文件过大Rewrite压缩

只保留恢复数据的最小指令集。

7.4.1 原理

两张图连在一起。

 

 7.4.2 重写流程

 7.5 AOF持久化的流程

 7.6 AOF的优势与劣势

 7.6 AOF和RDB什么时候用?

8.Redis主从复制

  应用写在master上,读的时候从应用上读。 

能实现:

1.主从分离

2.容灾快速恢复:比如一台从服务器挂了。不能读了,能根据策略切换到下一个服务器中。

8.1主从操作复制

ps命令查看redis启动的几个端口服务。 

写三个配置文件。pid是进程号。依次改写三个配置文件。

创建一个空的redis6379.conf。在里面引入redis.conf。

如果Redis有密码,这里得多加一句话。

masterauth 123456(密码)

 

通过这个文件启动redis。

 但目前者三个端口,还没有主从关系确定。

 再打开一个终端,连上6381。用info replication,查看role,都是master。

 

 8.1.1 主从配置

在你要变成从机的那里,执行slaveof。

这里的ip是主机的。并不是严格的127.0.0.1,看redis怎么配置ip访问的。

可以把slaveof写进配置文件,这样从机重启,开机仍然是从机。

8.2 从机与主机之前出现的状况的应对。

如果从机的配置文件上,没写slaveof,那么这个机重启就会失去从机的身份。

但之前从主机里之前同步的数据还在。

如果这个slaveof加入,那么它会把主机里的数据从头再复制一遍。

主服务器挂掉之后,依然是主服务器。

8.3 主从复制原理


8.4 薪火相传 

如果中间的节点寄了,下一层的也寄。

8.5 反客为主

 

 8.5.1哨兵模式(实现自动反客为主)

 自定义的目录下。新建一个文件,里面写上要监视的服务器。

后面的  1,意思是,至少有一个兵同意切换主机,才能切换。

启动哨兵。

哨兵模式下,主机挂掉了,从机上位。这个主机变成了新的皇帝的小弟。

优先级靠前的优先选举。

redis.config,在6.2版本中这个优先级更名为这样。 

8.5.2 哨兵选举优先级

1.选择优先级靠前的。

2.选择与主机同步数据最多的那个。

3.选runid最小的那个。

 

Java代码中怎么识别哪个是主哪个是从?

在jedis里识别哨兵。26379是哨兵的端口号。

private static JedisSentinelPool jedisSentinelPool=null;

public static  Jedis getJedisFromSentinel(){
if(jedisSentinelPool==null){
            Set<String> sentinelSet=new HashSet<>();
            sentinelSet.add("192.168.11.103:26379");

            JedisPoolConfig jedisPoolConfig =new JedisPoolConfig();
            jedisPoolConfig.setMaxTotal(10); //最大可用连接数
jedisPoolConfig.setMaxIdle(5); //最大闲置连接数
jedisPoolConfig.setMinIdle(5); //最小闲置连接数
jedisPoolConfig.setBlockWhenExhausted(true); //连接耗尽是否等待
jedisPoolConfig.setMaxWaitMillis(2000); //等待时间
jedisPoolConfig.setTestOnBorrow(true); //取连接的时候进行一下测试 ping pong

jedisSentinelPool=new JedisSentinelPool("mymaster",sentinelSet,jedisPoolConfig);
return jedisSentinelPool.getResource();

 8.6 主从缺陷

从机太多,导致同步变得迟缓。 

9.集群(后续在学),后续学了再更新

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值