Redis安装流程:
先安装gcc
使用yum install gcc
解压Redis压缩包,tar -zxvf '压缩包名'
进入到解压过后的Redis中,输入'make'编译成c编译环境
使用'make install',进行最终安装
最终Redis相关文件安装到 /usr/local/bin
Redis相关配置文件的说明:
将Redis改为后台模式:
进入到redis.conf,将no改为yes
使用后台模式启动Redis
连接Redis
关闭Redis:
1.终端中关闭 shutdown
2.单列关闭 redis-cli shutdown
exit 退出Redis
Redis配置文件详解:
redis只支持byte,并且其中的大小如下
只能通过本地进行访问,注释了所有人就都可以访问
开启保护模式,不支持远程访问,改为no支持远程访问
相当于屏幕保护,一段时间不使用,如果再想使用就不行了,单位秒
把Redis的进程号存放在这个文件中
Redis的日志级别
设置日志输出的文件路径
基本知识说明
Redis中 有16个数据库,默认使用的第0个,使用select切换数据库。
dbsize:获取到当前数据库的空间大小
keys * :查看所有的key
flushdb:清空当前数据库
flushall:清空所有数据库
exists 'key': 判断key是否存在
type 'key':查看key的类型
del 'key': 删除指定的key
unlink 'key':根据value选择非阻塞删除,不会立马删除,会异步删除
expire 'key' m:为key设置过期时间,以毫秒为单位,ttl 'key'查看还有多久过期,-1表示永不过期,-2表示已过期
Reids是单线程的
Redis是基于内存操作的,cpu不是Redis的瓶颈,Redis的瓶颈是根据机器的内存和网络的带宽
Redis有两种启动方式:
1.前台启动
2.后台启动
进入redis.conf文件,将daemonize no改为yes
redis-server /redis.conf 启动redis服务
redis-cli 通过客户端链接redis
关闭Redis
1.单例关闭
redis-cli shutdown
2.进入终端关闭(在客户端关闭)
shutdown
redis是 单线程+多路IO复用
常用数据类型
sring:
是以键值对方式存储。
string是二进制安全的。意味着可以包含任何数据
一个redis中字符串value最多可以是512M。
apend 'kay': 追加字符
strlen 'key':获取到key的长度
setnx 'key':只有当key不存在是,才能设置成功
incr 'key':将key中存储的数字值加1。只能对数字值成功,如果为空,新增值为1
decr 'key':将key中存储的数字值减1。
incrby/decrby 'key':将key中存储的数组值加多少和减多少。
mset 'key' ....:同时设置多个键值对
mget 'key'.....:同时获取多个键值对
msetnx 'key' ....:同时设置多个键值对,其中有一个存在,就都不成功
getrange 'key' x x:获取某个key的value索引之间的值,前包,后包
setrange 'key' x x:修改某个key的value索引开始的值
setex 'key' 'time' 'value':设置键值对,并且设置过期时间
getset 'key' 'value':设置新值同时获取旧值
string中value的底层结构,类似于arrayList
列表(List)
单键多值,按照插入顺序排序,你可以添加一个元素到列表的头部或尾部,底层实际是双向链表。
lpush/rpush 'key' 'value' ...:从左边或右边插入一个或多个值
lpop/rpop key:从左边或右边吐出一个值
lrange key x x:按照索引获取到值
rpoplpush k1 k2:从k1列表右边吐出一个值,插到列表k2的左边
set
是string类型的无序集合,底层是一个value为null的hash表。
hash
是一个键值对集合
是一个string类型的field和value的映射表。特别适合存储对象,类似于Map<string,object>,object中存field属性。
hash类型对应的数据结构是两种,ziplist(压缩列表) 、hashtable(哈希表),当field-value长度较短且数量较少时,使用ziplist,否则使用hashtable。
zset
Redis的发布和订阅
是一种消息通信模式。
subscribe 频道: 订阅一个频道
publish 频道 内容:向频道中发送内容
Redis6的新数据类型
bitmaps:
本身不是一种数据类型,实际上就是字符串
它可以对字符串的位进行操作
hyperloglog:
计数操作,重复的数据不会添加成功
Geospatial:
里面存储城市的经度纬度
提供了经度纬度的设置,查询,范围查询,距离查询,等常规操作。
Jedis
使用java对Redis进行一系列操作,类似于JDBC
需要使用Jedis得jar包
使用前的条件:
1.将 /etc/reids.conf文件中的bind注释掉
2.protected保护后面的值改为no
3.将防火墙关闭systemctl stop firewalld
事务和锁机制
Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化,按顺序执行。事务在执行的过程中,不会被其他客户端发送来的命令请求打断。
主要作用是串联多个命令防止别的命令插队。
使用multi过后,使用的所有命令都会被添加到一个队列中,不会被执行,这个过程是组队阶段。
直到输入exec过后,才开始执行之前输入到队列中的命令,这个过程叫执行阶段。
组队阶段,不想这个事务执行的时候使用discard。
组队阶段当有命令发生异常,执行时所有队列都会被取消。
执行阶段某个命令发生错误,那么那个发送错误的命令不会执行,而其他命令正常执行。
悲观锁:
顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿着数据就会block直到它拿到锁。
乐观锁:
增加一个字段version,每次更新数据的时候,判断这个版本是否和数据库中的版本一样,一样才可以进行更新,version会和数据同步更新。
在执行multi之前,先执行watch 'key',可以监视一个或多个key,如果在事物执行之前这个key被其他命令所改动,那么事物就会被打断。watch是乐观锁机制。
unwatch:取消watch命令对所有可以的监视。如果在执行watch命令之后,exec命令或discard命令先被执行了的话,那么就不需要再执行unwatch了。
Redis事物的三大特性
单独的隔离操作:
事物中的所有命令都会被序列化、按顺序地执行。事物在执行过程中,不会被其他客户端发送来的命令请求所打断。
没有隔离级别的概念:
队列中的命令没有提交之前都不会实际被执行,因为事物提交前任何指令都不会被实际执行。
不保证原子性:
事物中如果有一条命令执行失败,其后的命令依然会被执行,没有回滚。
持久化操作:
RDB:
在指定的时间间隔内将内存中的数据集快照写入磁盘。
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。
缺点:最后一次持久化后的数据可能丢失。
RDB的备份:
AOF(Append Only File):
默认不开启。
以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来,只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构造数据。
开启AOF需要的操作:
进入redis.conf文件,将no修改为yes。
appendonly.aof表示创建的日志的名字。生成的地方为启动redis的路径下。
AOF和RDB同时开启,系统默认取AOF的数据。
redis-check --fix “文件名” 修复文件
AOF同步频率的设置:
appendfsync always
始终同步,每次Redis的写入都会立刻记入日志;性能较差但数据完整性比较好
appendfsync everysec
每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。
appendfsync no
redis不主动进行同步,把同步时机交给操作系统。
主从复制:
主机进行写操作,从机进行读操作。
实现主从的操作步骤: 需要关闭AOF
info replication 查看当前主机运行状态
slaveof 主服务器ip: 设置谁是本机的主服务器
主从复制原理:
从机只会在第一次连接的时候向主机发送请求,其他时候都是主机向从机发送数据。
一主二仆:
当从机重启过后,需要重新设置关系,重新设置关系过后他会把主机上的数据拷贝到从机上。
主机宕机过后,从机还是会显示与主机之间的关系。主机重新启动过后还会有原来的从机。
薪火相传:
类似于链表,不能跨级联系。主机管理从机,从机管理从机下的从机。
反客为主:
slaveof no one 将从机变为主机
当一个主机(master)宕机后,后面的从机(slave)可以立刻升为master,其后面的slve不用做任何修改。
哨兵模式:
会检测主机是否宕机,如果主机宕机会自动让某个从机变为主机。
启动哨兵模式, sentinel.conf为哨兵模式的配置文件
reids.conf文件中这个代表优先级,越小优先级越高。代表主服务器宕机时优先选择谁
集群
搭建步骤:
1. 创建6个redis.conf文件
2.其中分别添加内容(改include地址,改端口号)
3.进入到安装Redis目录,/opt/redis/src/
并在控制台输入命令
4.这样就可以依次启动Redis了
redis-server redis6379.conf
5.登录集群
redis-cli -c -p 端口号
缓存穿透:
缓存击穿:
缓存雪崩:
分布式:
解决分布式问题的方法:
1.使用setnx上锁,通过del释放锁;
防止锁一直没有被释放,设置一个过期时间,自动释放。
防止上锁过后突然发生异常,没有设置上过期时间,可以同时设置过期时间:
set 'key' 'value' nx ex '过期时间'
为防止释放错锁,可以把vluer值设置为一个UUID,每次释放锁前会先进行判断,U会判断当前线程的UUID和取出来的UUID是否相同,相同就释放锁,不相同就不释放。
通过lua脚本释放锁,保证原子性。
确保分布式锁可用,至少满足四个条件:
1.互斥性:在任意时刻,只有一个客户端能持有锁。
2.不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他用户能加锁。
3.加锁和解锁必须保证是同一个客户端,客户端自己不能把别人加的锁给解了。
4.加锁和解锁必须具有原子性。
Redis6的新特性:
ACl:
可以给用户设置一些权限,把用户的权限更加细腻化。
IO多线程:
Redis多线程部分只是用来处理网络数据的读写和协议的解析,执行命令依然是单线程。
IO 多线程其实指客户端交互部分的网络IO交互处理模块多线程,而非执行命令多线程。
默认是没有开启的,需要进配置文件设置:
io-threads-do-reads yes
io-thrreaads 4
笔记来自于尚硅谷视频所得