Redis
- Redis:No sql数据库,Not Only sql 不仅仅是数据库,和mysql相比,mysql是关系型数据库,在二维表中、文件中,Redis是非关系型数据库,以key-value的形式以内存的形式在内存中。
- 什么是Redis?
答:Redis是一个开源(BSD许可)的,内存中的数据结构存储系统,他可以作为数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串(string),散列(hash),列表(list),集合(set),有序集合(sorted set),事务(transactions)和不同级别的磁盘持久化(persistence),并通过Redis哨兵(Sentinel)自动区分(Cluster)提供高可用性(high availability)。它的读的速度是110000次/s,写的速度是81000次/s。 - Redis安装
1.把redis-6.0.6.tar.gz放到linux虚拟机中
2.解压文件
3.cd redis-6.0.6文件夹中,输入make命令,如果报错可以试试以下操作。
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
4.修改为后台运行
输入vim redis.conf 命令 ,修改protected-mode 为no ,修改daemonize yes即可
5.运行redis服务器
进入到src文件中 ./redis-server 即可
6.在windows中安装监控软件
修改redis 配置配置文件,将bind 127.0.0.1注释掉,在客户端连接 - Strings 字符串类型
1.set key value 设置指定的key值
2.get key 获取指定key的value值
3.getrange key fromIndex endIndex 获取指定key的范围的值
4.getset key value 替换新值,返回旧的值
5.mget key1 key2 key3 同时获取多个键的值
6.setex key seconds value 设置指定字段的过期时间(一般用于验证码)
7.setnx key value 设置key的值,如果有就无效,没有就创建
8.strlen key 返回key的值的长度
9.mset key1 value1 key2 value 2 同时创建多个键的值
10.incr key key的值+1
11.incrby key increment key的值增加increment
12.decr key key的值-1
13.decrby key decrement key的值减少decrement
14.append key value 在指定的value值进行拼接
15.del key key 删除指定的键
16.flush [sync|async] 清除数据库所有数据 - hash 哈希 适用于存储对象
1.hset key field value 向hash 中添加一组数据
2.hget key field 获取指定ky 中的指定属性的值
3.hmset key field value field value 向hash中添加多组数据
4.hmget key field field 一次获取多个key的值
5.hdel key field 删除指定key中field的属性值
6.hexists key field 判断哈希表中是否有指定的值
7.hgetall key 查询指定key的所有的 key-value
8.hincrby key increment 将数值型的数据类型进行按指定数值增长
9.hkeys key 返回所有属性
10.hvals key返回所有的值
11.hlen key 返回hash中的元素个数 - lists 列表
1.lpush key value1 value2 创建并添加一个元素到列表中
2.lrange key 0 -1 查所有元素,和栈结构很是相似
3.blpop key timeout 删除队列的第一个元素,如果没有将会返回时间
4.brpop key tiimeout 删除队列的最后一个元素,如果没有将会返回时间
5.brpoplpoush source destination timeout 将source的最后一个元素除去,并添加个destination元素
6.lindex key index 返回指定下标位置的数据
7.linsert key before|after 目标元素 value 添加到目标元素的前面或者后边
8.llen key 查看列表的元素个数
9.lpushx key value 在已存在的列表中添加一个元素,不存在添加不了
10.lrem key count value 删除指定元素
count > 0 从头查找,删除count个value相等的值
count < 0 从尾查找,删除count的绝对值个value相等的值
count = 0 删除所有与value相等的值
11.lset key index value 将指定索引位置的值进行替换
12.ltrim key start stop 保留指定区间的元素,区间外的都不要
13.rpop key 移除最后一个元素
14.rpush key 向列表尾部添加元素 - set无序不可重复
1.sadd key value1 value2 value3 添加key的值
2.smembers key 获取所有key的值
3.scard的key 查询set中的个数
4.sdiff key1 key2 查询两个key的值的不同数据,key1有的key2没有的,key1有的key2没有就为空
5.sinter key1 key2 返回交集部分,相同的部分
6.sismember key element判断集合中是否有指定元素
7.spop key count 随机删除指定key中的count 个数
8.srandmember key count 随即输出指定个数的数
9.srem key element1 element2 删除集合中的元素 - sorted set 有序的set集合,不可以重复,类似于java中的treeset
1.zadd key score value1 score value2 添加key的value值
2.zrange key 0 -1 获取集合中元素的个数
3.zcard key 返回集合的个数
4.zcount key min max 查询score的值在这个范围的个数
5.zincrby key score 的值value修改元素的排名
6.zrank key member 返回指定元素的索引
7.zscore key member 查询指定成员的分数
8.zrem key member member 删除指定成员 - redis的事务
特点:单条redis命令具备原子性,但是redis的事务不具备原子性,具有顺序性,一次性,互斥性。
1.multi 开启事务
2.exec 执行事务
3.discard 取消事务,类似于回滚,有相似的功能
4.watch key 设置监控得到值,类似于乐观锁。当watch监控的变量在执行事务的时候被其他事务干扰,那么当前事务在执行时候会取消操作,需要重新开启事务进行操作。
5.unwatch key 取消监控所有字段
注意:redis的编译时异常会取消整个redis的事务,redis的运行时异常会正常执行其他正确的指令,错误的不执行。 - Jedis:java代码连接redis尽心操作
只需要new Redis(“192.168.12.129”,“6739”);创建连接,其他用对象掉用方法即可。 - Redis配置文件
1.INCLUDE
#include /path/other.conf 可以包含其他文件
2.NERWORK
#bind xxx.xxx.xxx.xxx -::1 指定ip连接redis服务器
port 6379 当创建redis集群时候,可以修改
3.GENERAL 通用配置
daemonize yes 后台运行
pidfile /var/run/redis_6379.pid 进程ip文件
logfile “redis6379.log” 自行设置日志文件
databases 16 默认数据库个数
4.snapshotting快照
save 60 5 意思是60秒内执行了5次命令就持久化一次
dbfilename dump.rdb 默认redis数据库的名字
5.REPLICATION 主从复制 读写分离
6.SECURITY 设置密码
config set requirepass"123"
进入客户端auth "123"才能正常操作
7.APPEND ONLY MODE aof持久化以日志的形式做持久化操作,性能比rdb慢。
1)appendonly no 是否开启aof
2)appendfilename "appendonly.aof"aof文件名
3)aof运行机制:
appendfsync always :在每次执行命令的时候,执行一次持久化一次
appendfsync everysec:每秒拼接一次
appendfsync no :从不拼接
4)auto aof-rewire-min-size 64mb 开启重写功能 - redis持久化:将内存中的数据定时的,定期的写入到磁盘中
1.rdb:dump.rdb redis默认的持久化机制,
redis持久化触发机制:
1)修改redis.conf文件,开启持久化。
save 3600 1
save 300 10
save 60 5
2)输入save命令 手动持久化
3)输入flushcdb 手动持久化
4)输入flushall 手动持久化
2.aof
appendonly yes开启持久化
注意:如果我们修改了appendonly.aof文件,那么整个文件属于受损状态,关闭服务器之后,不得重新启动,所以要执行redis-check-aof --fix appendonly.aof修复整个受损的aof文件,这样才能开启服务器 - 总结:redis的持久化操作
1.redis默认是rdb持久化
2.redis可以同时开启两个持久化,rdb,aof但是会占用cpu,如果同时开启,优先加载的是aof,在加载rdb。如果出现强制断电操作,aof会失去1秒的数据,rdb会丢失最后一次操作,如果二次开启的话,反序列化操作,那么rdb比aof性能高,整体而言,rdb性能比aof好,适合处理大型文件,如果aof文件大于64mb,会触发重写机制。 - 持久化原理
redis 会自动向linux系统内核请求一个fork子线程,让整个子线程进行持久化,主线程该干什么就干什么,所以性能很快。 - 发布和订阅(先订阅在发布)
1.订阅者先订阅通道,subscribe myChat
2.发布者发送数据即可,publish myChat hello
3.取消订阅,unsubscribe
一个客户端可以订阅多个频道,发布者只能发送一个频道的内容 - 主从复制,读写分离—>哨兵
目的:为了减少服务器压力,提高查询效率,真实项目中读的操作往往大于写的操作。
案例:
1.创建3个配置文件(最好是部署在3台服务器上)
redis6379.config
redis6380.config
redis6381.config
2.修改配置文件
1)port 6379
2)filepid 6379.pid
3)日志 6379.log
4)持久化文件 dunmp6379.rdb
3.进入到redis客户端
4.输入info replication 查看当前redis服务器状态
5.slaveof host port 认主
6.slaveof no one 取消当前服务器的状态
当服务器不是特别多时候,如果主机意外宕机了,那么就需要程序员手动重新选择主机,并认主。服务器足够多了的话,手动很费时费力,redis为了对此问题进行处理,就提供了哨兵机制Sentinel。
7.哨兵
作用:在服务器集群中,主要是监控主机的状态,如果主机意外宕机,那么哨兵会以投票的方式选举,进行重新选择主机,并且修复好后,会自动变成从机,认主,无序程序员手动操作。
8.如何配置哨兵?
在sentinel.conf文件中根据需求修改sentinel monitor 名字 127.0.0.1 6380 1 - 雪崩,穿透,击穿
1.雪崩
同时有很多个请求,redis的缓存数据过期了,没有存储,这时候redis返回的都是null,然后就去请求mysql,请求的数量超过了本身承受的最高请求,导致mysql压力过大,mysql宕机,redis无效,这时就出现了雪崩
2.击穿
同时有多个请求,同时查找一个key,导致redis没有请求过来,很多请求就同时访问mysql的一条记录。多个请求,请求同一个位置,导致击穿。
3.穿透(恶意攻击)
多个请求,去请求null值,redis查询不到,就去mysql导致穿透,多个请求去多个位置,相当于用针去扎一张纸,不是同一个位置。扎成筛子就是穿透。