Redis的介绍与应用

该文章为本人在B站观看尚硅谷阳哥Redis实战所做的笔记

传统的ACID

A(Atomicity)原子性

C(Consistency)一致性

I(Isolation)独立性

D(Durability)持久性

Nosql数据库中CAP原理CAP+BASE

C:Consistency(强一致性)

A:Availability(可用性)

P:Partition tolerance(分区容错性)

: Nosql只能满足CAP中的两个,分区容错性是必要的(因为网络硬件肯定会出现延迟丢包等问题)

CA :传统的Oracle数据库

AP :大多数网站架构的选择

CP :Redis、Mongodb

BASE:(为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案)

基本可用(Basically Available)

软状态(Soft state)

最终一致(Eventually consistent)

简单来讲 :

1、分布式:不同的多台服务器上面部署不同的服务模块(工程),他们之间通过RPC/RMI之间通信和调用,对外提供服务和组内协作。

2、集群:不同的多台服务器上面部署相同的服务模块,通过分布式调度软件进行统一的调度,对外提供服务和访问。

Redis :REmote DIctionary Server(远程字典服务器)

安装:

1.获取redis资源

wget http://download.redis.io/releases/redis-4.0.8.tar.gz

2.解压

tar xzvf redis-4.0.8.tar.gz

3.安装

cd redis-4.0.8

make

cd src

make install PREFIX=/usr/local/redis

4.移动配置文件到安装目录下

cd …/

mkdir /usr/local/redis/etc

mv redis.conf /usr/local/redis/etc

5.配置redis为后台启动

vi /usr/local/redis/etc/redis.conf //将daemonize no 改成daemonize yes

6.启动redis

​ /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

7.测试启动是否成功

​ /usr/local/redis/bin/redis-cli -p 6379

​ 输入ping 出现 pong 启动成功

​ 输入 ps -ef|grep redis

8.命令

set k1 hello //创建键值对

select 7/8 切换数据库,redis共有16个库,0——15

Dbsize 查看当前数据库的key的数量

key* 查看所有的key值

keys ? 模糊查询

flushdb 清除当前库所有key值

flushall 清除所有库所有key值

Redis索引都是从零开始,默认端口为 6379

Exists key 判断是否存在某个key键

move key 库 把某个key键移动至另外的库

clear 清空控制台

ttl key 查看过期时间(-1是永久,-2已过期)

expire key 时间(时间单位为 秒 ) 给键定义过期时间

type key 查看键的类型

Redis的五大数据类型

String、Hash(哈希,类似java里的Map)、List(列表)、Set(集合)、Zset(sorted set: 有序集合)

String :

set / get / del key(删除键) /append key 值(拼接)/strlen key(计算长度)

incr/decr/incrby/decrby 一定要是数字才能进行加减

getrange(相当于between…and…)/setrange(范围内替换值)

setex(set with expire)键值秒/setnx(set if not exist)

mset/mget/msetnx(批量设置,获取,设置过期时间)

List :(列表)

注:pop出栈,push入栈

del key (删除列表)

lpush key 值(左进反出)(入栈)

rpush key 值(右进正出)

lrange key 0 -1(0 -1为全部输出,下标)

lpop/rpop key (刪除,l left,r right)(出栈)

lindex key 下标 (根据索引下标获得元素(从上到下))

llen key (计算列表的长度)

lrem key 个数 值(删除列表内某个值的个数)

ltrim key 开始下标 结束下标(截取指定范围内的值后再赋值给key)

rpoplpush 源列表 目的列表

lset key 下标 值(重置指定下标的值)

linsert key before/after 值1 值2(在列表中某个值前后插入值)

性能总结:

它是一个字符串链表,left、right都可以插入添加;

如果键不存在,创建新的链表;

如果键已存在,新增内容;

如果值全移除,对应的键也就消失了;

链表的操作头和尾效率极高,对于中间元素进行操作时效率惨淡.

Set :(集合)

sadd set名 键 键/smembers/sismember 键(新增/查询全部/查询是否存在key)

scard 集合名(获取集合里面的元素个数)

srem key value(删除集合中元素)

srandmember key 某个整数(随机查找几个值)

spop key (随机出栈,删除元素)

smove key1 key2 在key1里某个值 (将key1里的某个值赋给key2)

sdiff/sinter/sunion key1 key2(差集(在第一个里边,不在第二个)/交集/并集)

哈希(Hash) :KV模式不变,但V是一个键值对

hset KEY key value/hget KEY key/hmset/hgetall/hdel KEY key(创建单个对象/获取单个对象/创建多个对象/获取所有的对象/删除对象内的某个键)

hlen KEY (计算某个对象的值数)

hexists KEY key(判断对象里边的某个key是否存在,1存在,0不存在)

hkeys KEY /hvals KEY (输出对象所有的key值,输出对象所有的value值)

hincrby/hincrbyfloat KEY key value(增加值/增加含小数的值)

hsetnx KEY key value(存在返回0,不存在即插入键值对数据返回1)

有序集合Zset(sorted set) :(在set基础上,加一个score值)

zadd KEY key value key value(可添加多个键值对)

zrange KEY 0 -1/zrange KEY 0 -1 withscores(查看所有value/查看所有键值对)

zrangebyscore key 开始score 结束score( ‘(’ 是不包含 )(相当于between)

zrangebyscore key 开始score 结束score limit 开始index 长度(相当于分页查询)

zrem key 某score下对应的value值,作用是删除元素

zcard key (统计总数量)

zcount key score区间(统计范围内的值数量 )

zrank key value值(作用是获得下标值)

zscore key value值(获得分数(key))

zrevrank key values值(逆序获得下标值)

zrevrange key 0 -1/zrevrangebyscore key 开始score 结束score(逆序查看所有value/逆序查看某个区间)

Redis配置文件 redis.conf 介绍
Redis的持久化(RDB、AOF)

什么是redis的持久化? 答:RDB、AOF

RDB:

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里.

redis会单独创建(fork)一个子进程来进行持久化,会将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效,RDB的缺点是最后一次持久化后的数据可能丢失.

RDB保存的是dump.rdb文件.

Fork :Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程.

Snapshot快照 :RDB是整个内存的压缩过的Snapshot,RDB的数据结构,可以配置复合的快照触发条件,默认是 1分钟内改了1万次 或 5分钟内改了10次 或 15分钟内改了1次.

如果想要禁用RDB持久化的策略,只要不设置任何save指令,或者给save传入一个空字符串参数也可以.
如何触发RDB快照 配置文件中默认的快照配置 :

–冷拷贝后重新使用 :可以 cp dump.rdb dump_new.rdb(备份文件最好拷贝到另外一台服务器)

–命令save或者是bgsave都可以立马备份 dump.rdb 文件

​ save : save时只管保存,其他不管,全部阻塞

​ bgsave : Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。可以通过lastsave命令获取最后 一次成功执行快照的时间.

–执行 flushall 命令,也会产生dump.rdb文件,但里面是空的,无意义.

如何恢复 :

将备份文件(dump.rdb)移动到redis安装目录并启动服务即可

config get dir 获取目录

优势 :

适合大规模的数据恢复、对数据完整性和一致性要求不高

劣势 :

在一定间隔时间做一次备份,如果redis意外down掉(flushall),就会丢失最后一次快照后的所有修改

Fork时,内存中的数据被克隆一份,大致2倍的膨胀性需要考虑

如何停止 :

动态所有停止RDB保存规则的方法:redis-cli config set save “”

AOF :

是什么?

以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据。换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作.

如何打开aof持久化? appendonly no (默认是no,yes就打开aof持久化)

Aof保存的是 appendonly.aof文件

自动修复.aof文件不规范的语句: redis-check-aof --fix appendonly.aof

appendfsync :

always :同步持久化每次发生数据变更会被立即记录到磁盘,性能较差但数据完整性比较好

everysec :出厂默认推荐,异步操作,每秒记录,如果一秒内宕机,有数据丢失

no :

Rewrite :(重写)

是什么?

AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof

重写原理 :

AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename).遍历新进程的内存中的数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似.

触发机制 :

Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发.

No-appendfsync-on-rewrite :

重写时是否可以运用appendfsync,用默认no即可,保证数据安全性

Auto-aof-rewrite-min-size :

设置重写的基准值

Auto-aof-rewrite-percentage :

设置重写的基准值(百分比)

优势 :

每秒同步 :appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘,性能较差但数据完整性比较好

每修改同步 :appendfsync everysec 异步操作,每秒记录,如果一秒内宕机,有数据丢失

不同步 :appendfsync no 从不同步

劣势 :

相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb

Aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同

Which one?

RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储

AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.

只做缓存 :如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.

同时开启两种持久化方式 :当redis重启会优先载入AOF文件来恢复原始的数据,因为AOF文件保存的数据集要比RDB文件保存的数据集要完整.但是RDB更适合用于备份数据库(AOF在不断变化不好备份),快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段.

Redis的事务 :

是什么?

可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行执行而不会被其它命令插入,不需加塞.

常用命令 :

正常事务:开启事务MULTI 结束事务EXEC

放弃事务: 开启事务MULTI 放弃事务DISCARD

全体连坐:如果事务中有错误语句将会放弃事务

冤头债主:如果有不执行就不会发现的错误语句 事务将会成功执行,错误的语句不会成功()

watch监控:

​ 悲观锁:并发性极差,一致性极好.做更新会直接锁住整张表

​ 乐观锁:(策略:提交版本必须大于记录当前版本才能执行更新)做更新不会上锁,会判断版本

​ CAS(Cheak And Set):

​ watch指令类似乐观锁,事务提交时,如果key的值已被改变,整个事务队列都不会被执行

​ 通过watch命令在事务执行之前监控多个keys,倘若在watch之后有任何key的值发生了变化,exec命令执行的 事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败.

Redis事务命令 :

DISCARD:取消事务,放弃执行事务块内的所有命令

EXEC:执行所有事务块内的命令

MULTI:标记一个事务块的开始

UNWATCH:取消WATCH命令对所有key的监视

WATCH key[key…]:监视一个(或多个)key,如果在事务执行之前这个(或这些)被其他命令所改动,那么事务将会被打断.

事务三阶段 :

开启:以MULTI开始一个事务

入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面

执行:由EXEC命令触发事务

事务三特性 :

单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断.

没有隔离级别的概念:队列中的命令在事务没有提交之前都不会实际被执行,也就不存在"事务内的查询要看到事务里的更新,在事务外查询不能看到".

不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚.

Redis的发布订阅 :

是什么?

进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.

命令

先订阅后发布才能收到消息

1 可以一次性订阅多个,subscribe c1 c2 c3

2 消息发布,publish c2 消息内容

3 订阅多个,通配符 ,psubscribe new

4 收取消息,publish new1 消息内容

Redis的复制(Master/Slave) :

1.配从(库)不配主(库)

2.从库配置:slaveof 主库IP 主库端口

​ 每次与master断开之后,都需要重新连接,除非配置进redis.conf文件(从机挂掉需重连,主机挂掉从机 等待)

​ info replication 查看当前状况

3.修改配置文件

​ 拷贝多个redis.conf文件

​ 开启 daemonize yes (后台启动)

​ Pid 文件名字

​ 指定端口

​ Log文件名字(日志文件名)

​ Dump.rdb(.rdb文件名)

4.常见的三个情况:

  1. 一主二仆:正常的一个主机多个从机(Slaveof 新主库IP 新主库port)

  2. 薪火相传:上一个的Slave可以是下一个的Master,Slave可以接收其他Slaves的连接和同步请求,那么 该slave作为了链条中下一个的master,可以有效减轻master的写压力.

    中途变更转向:会清除之前的数据,重新建立拷贝最新的.

    Slaveof 新主库IP 新主库port

  3. 反客为主:Slaveof no one 使当前库停止与其他库的同步,转成主库(保留了数据).

    也就是原来的主库挂了,在从库执行这个命令使得从库变为主库.

复制原理:

Slave启动成功连接到master后会发送一个sync命令,Master接到命令后启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步.

全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中.

增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步但是只要是重新连接master,一次完全同步(全量复制)将被自动执行.

哨兵模式(sentinel) :

是什么?

能够通过后台监控主机是否故障,如果故障了根据投票数自动将从库转化为主库.

自定义sentinel.conf文件,文件名字不能错.(touch sentinel.conf)

配置哨兵,填写内容:sentinel monitor 被监控库名字() 127.0.0.1 6379 1

​ 最后一个数字1,表示主机挂掉后salve投票看谁成为新主机,得票数多的成为master.

启动哨兵模式:/usr/local/redis/bin/redis-sentinel /usr/local/redis/etc/sentinel.conf

如果原有的master挂了,重启后将会成为新master的从库

一组sentinel能同时监控多个Master.

复制的缺点 :

由于所有的写操作都是现在Master上操作,然后同步更新到Slave上,所有从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重.

Windows的IDEA连接虚拟机中CentOS7系统Redis

1.修改bind 两种方式
把bind 127.0.0.1改成---->bind 0.0.0.0 (也可以将bind 127.0.0.1注释掉)

2.protected-mode yes 改成---->protected-mode no

​ 按Esc 退出编辑 shfit + ‘:’ 输入wq 回车
3.关闭防火墙
systemctl stop firewalld.service #停止防火墙
​ systemctl disable firewalld.service #禁止防火墙开机启动
firewall-cmd --state #查看默认防火墙状态 防火墙状态显示 not running 就好了

  1. daemonize no 改成------> daemonize yes

​ linux查看ip地址 : ifconfig

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值