要先在linux中装一个C语言的编译环境
redis默认安装路径: usr/local/bin
然后把里面的配置文件复制一份出来(下面是复制到etc文件夹下) 做如下修改(设置成可以后台启动)
redis启动:
redis-server+配置文件路径
通过客户端 连接redis(usr/local/bin/redis-cli)
关闭redis:
第一种:直接 shutdown
第二种:先exit退出 再找到redis的进程号 杀死进程。
九宫格 打 merz
Redis常用五大数据类型:
首先先来说说 redis中的key的操作。
Redis新数据类型
如果活跃用户量很大 用Bitmaps可以 如果用户量很小 那用它并不合适。
jedis连接redis:
如果连接time out 超时, 一、检查配置文件那两处地方是否做了修改 二、检查linux防火墙是否关闭。
关闭linux防火墙:
在maven中导入jedis的依赖后,
可以通过jedis对象调用方法来操作redis数据库。
模拟手机验证码发送功能
1.一个手机号一天只能发三次
2.验证码有效时间两分钟
multi:开启事务 然后放数据 开始组队 exec:执行 当执行完之后 表示事务就结束了。
discard:表示放弃组队
失败的情况:
若组队过程中,某个命令出错了 若再执行 则都不会执行
若组队的时候没有失败 在执行的时候 有一个命令失败了 则只是这个命令不会执行 其余的命令正常执行。
第一种情况示例:
第二种情况示例:
事务冲突的解决机制:
RDB:
写时复制技术:同步之前,要先把数据放到一个临时数据文件中去,以防万一宕机,造成数据丢失。(也就是用临时数据文件 代替这个rdb文件。)建完之后 往里面放数据 数据放完之后 再替换这个内容。这个过程 就叫写时复制技术。 RDB底层就是这么做的。
在redis.conf配置文件中设置
RDB可能在最后一次造成数据丢失: 因为在你指定的一段时间内,要求有几个key更新了 它就做持久化。假如在最后一次 你的key更新的个数没有到你指定的那个个数 或者指定的这一段时间没有到 这时机器宕机了 而此时还没有进行持久化吧 所以就会造成这些数据的丢失。
AOF:
重写机制跟RDB底层实现原理差不多。
搭建最基本的一主两从:
新建目录 myredis 将 usr/bin/redis.conf拷贝到myredis中,然后在该文件夹中 分别建三个配置文件。
include:引用redis.conf中的内容。
照此,创建另外两个6380 6387配置文件 然后分别启动三个redis
例如: redis-server redis6379.conf
然后开启三个端口,后台连接。 redis -cli -p 6379
主从复制原理:
主从复制:常用三招(三种方式):
一主二仆:1.当从服务器挂掉了之后 再启动之后 从服务器并不能加到主机中来 需要从新给他加入才可以。2.而你在加入的时候 它会把主机中的数据从头开始复制。
当一个从机重启之后 它就自动变成主机了
当从机重新连上主机之后 从机是从头开始复制主机的数据。全复制完。
当主服务器挂掉之后 从服务器还是服务器 并不会上位,而主服务器重启之后,还是主服务器。
薪火相传:主从复制原理和一主二仆一样。
反客为主:当主服务器挂掉了 一台从服务器可以晋升为主服务器。
缺点:手动完成。
哨兵启动!:
告诉我们 如果主机挂掉了 会在下面的从机里面选一个作为主机
如果旧主机再次启动 则只能作为新主机的从机。
选举从机作为主机的规则:
新版本叫这个不叫slave-priority
如果在java中 怎么识别主 从?
new的时候 就指定这个名字
26379:就是这个 哨兵启动后 哨兵的这个端口号。
做好一份后,复制五个 做出六个配置文件 然后启动redis 连接客户端。
把六个redis合成一个集群。
生成集群环境,先进入src目录(必须在src目录下操作才行):
创建集群:
过程:
问你是否接受这种分配方式
这里 16384 是 16384个插槽 在后面会有解释。
集群方式连接:加上一个-c 端口号的话 用任何一个主服务器端口都是可以的。
分配基本原则(当然我们这里是模拟的 所以都用的一个IP):
针对于上面的 16384 的解释:
插槽就是为了把我们的数据 平均的分担到集群中的每个主机中区去。
举个例子:
这里我们添加了一个k1,k1根据计算 得到插槽的位置是12706。12706插槽在6381这个主机中 所以redis自动给我们切换到6381这个主机中去。
加多个值是不行的。
如果要加多个值 就是用分组的形式:
user就是组的名字 然后它在计算插槽的话 就是根据user这个组的名字去计算。 然后做添加
我们这里12706插槽中是有key的,但这里的12706不在6380这个主机下 所以返回没有
故障恢复:(就是如果集群中一个主机挂掉了 此时这个主机的从机会变为主机 而主机再次启动后 会变成从机。)
在java中 通过jedis操作redis集群:
注意:这里的端口号填集群中的哪一个主机都行 毕竟他会自动切换。
也可以写个set集合 里面放多个ip 和端口号 但因为我们集群是无中心化的 所以也无所谓。
redis的应用问题:
缓存穿透:
出现这个问题的原因(上述三点也算是原因 也是一个过程。):
缓存击穿:
雪崩问题:
数据库压力变大了 所以我们的应用程序它的响应时间就会变慢 应用访问就会变慢 所以造成redis里面会有大量的访问等待 最后造成数据库崩溃了 应用崩溃了 redis也崩溃了。
分布式锁:
可以利用setnx xxx 值 上锁 del xxx释放锁
还可以设置锁的过期时间 等锁过期了 再设置就可以了
在代码中 设置锁的过期时间:
解决方案:(加个UUID进行判断)
用LUA脚本解决。
Redis6新功能:
使用acl cat命令:
查看添加权限指令类别
加参数类型名可以查看类型下具体命令
使用acl whoami命令查看当前用户