redis介绍
Redis、Mamcache/MongoDB对比
分布式数据库的CAP原理
redis的下载和安装
安装之后的操作
vim /opt/redis-5.0.4/redis.conf
#搜索daem
将daemonize no 改为 daemonize yes
#修改后启动文件,进入 /user/local/bin 目录下,执行
redis -sever /opt//redis-5.0.4/redis.conf
#其他操作
redis -cil shutdown #单实例关闭数据库
redis -cil -p 6379 shutdown #多实例关闭数据库
netstat -lntp |grep 6379 #常用操作,检测6379端口是否在监听
ps -ef |grep redis #检测后台程序是否存在
redis -cil #链接redis ,在/user/local/bin 目录下
ping # 输入ping,返回pong,说明交互是成功的
set k1 china #键值对的形式,存储数据
get k1 #使用ger获得数据
redis-benchmart #测试redis性能,crtl+c,执行退出redis,最好执行5s就关闭,在linux中执行此命令
dbsize # 查看数据库键的数量
flushdb #清空当前数据库
flushall # 清空所有数据库(16个都清空,慎用)
select index #切换数据库,index的范围是0-15,可用tab键补齐
key操作
exists key #判断某个key是否存在(tab键会自动补全),返回1说明在,返回0 说明不在move key db #移动(剪切、粘贴)键到几号库
ttl key #查看键还有多久过期(-1,永不过期,-1,已过期)
time to live #还能活多久
expire key #为键设置过期时间
type key #查看键的数据类型
数据类型
字符串命令 string
set key value #向key中存数据value,如果key已存在,新输入的value会覆盖原数据
get key #根据key取数据
del key #删除key数据
append key value #向key中追加value数据
strlen key #获得key的长度
# ----------------加减操作,操作的必须是数字类型------------
incr key #给key+1
decr key #给key-1
incrby key num # 给key+num
decrby key num # 给key-num
#----------------类似于between……and---------
getrange key index1 index2 #获取index1和index2范围内的数据(左右皆包括)
setrange key insex value#向key的insex位置上插入value
#----------------添加数据同时判断---------
set key n value #给key添加value的同时设置n秒的生命周期
setnx key value # 添加时判断key对应的是否有值,有的话添加失败
#------------------其他方式的添加或获取----------------------
mset key1 value1 key2 value2 #一次性添加多组数据
mget key1 key2 #一次性获取很多数据
msetnx key1 value1 key2 value2 #添加时,一次性判断多个key是否存在,只要有一个存在,就添加失败
getset key value # 添加的时候返回key原本对应的值,然后再将新值写入
列表 list
# ----------------给列表添加元素------------
lpush key list_value #向key中添加列表元素value,元素之间使用空格隔开,正序添加
rpush key list_value # 向key中添加列表元素value,元素之间使用空格隔开,倒序添加
lrange key 开始索引 结束索引 # 查看key列表指定索引下的元素,-1表示到结尾,一般从0号索引开始
# ----------------移除元素------------
lpop key # 正序移除key列表中的第一个元素
rpop key # 倒序移除key列表中的第一个元素
lrem key count value # 删除key中的count个value,返回信息为删除的个数
# ----------------下标查询和返回长度------------
lindex # 获取key列表中,第index个元素,正序查找
llen key # 获取指定元素的长度
ltrim key index1 index2 # 获得两个索引之间的数据,删除其他的元素,正序获得
# ----------------修改,链接,插入------------
rpoplpush key1 key2 # 将元素从key1中取出交给key2,左出右进§
lset key index value #在key列表,index的位置插入x
linsert key before/after index value
# 在key列表的index后/前,插入value
集合set
- set不允许重复
#-----------------添加/查看/判断------------
sadd key value #向set key中添加value,value重复时只添加一个
smembers key #查看set key中的数据
sismeber key value # 查看set key中是否存在value
#-----------------获得/删除/移除------------
scard key #查看set key中元素的个数
srem key value # 删除set key中,value这个元素
srandmember count # 从set key中随机获得count个元素
spop key # 随机移除set key中的元素
smove key1 key2 value # 随机从set key1中移动一个value到key2
#---------------数学集合类-----------------
sinter key1 key2 #查看set key1和key2的交集
sunion key1 key2#查看set key1和key2的并集
sdiff key1 key2#查看set key1中存在,key2中不存在的数据
哈希hash
#-------------操作元素属性--------------
hset key hkey hvalue # 向哈希key中,添加hkey:hvalue的键值对
hget key hkey #获取哈希key中,hkey的value
hmset key hkey1 hvalue1 hkey2 hvalue2……
# 向哈希key中,添加hkey:hvalue,hkey2:hvalue2的多个键值对
hmget key hkey1 hkey2#获取哈希key中,hkey1、hkey2的value
hgetall key # 获取哈希 key下面所有键的值
hdel key hkey# 删除哈希 key下面hkey的键值对
#----------获得/自增/哦安段-------------
hlen key # 获取哈希key中,元素的数量
hexists key hkey # 判断哈希key中,hkey的元素是否存在
hkeys key # 获取哈希key中所有的元素的键(k)
hvals key #获取哈希key中,所有元素的值(v)
hincrby key hkey int
# 向哈希 key的hkey对应的值中,增加int,hkey对应的值必须是数字,返回增加后的数字
hincrbyfloat key hkey float # 向哈希 key的hkey对应的值中,增加float,hkey对应的值必须是数字,返回增加后的数字
hsetnx key hkey value # 判断哈希key中,hkey对应的元素是不是value
#在redis中输入汉字时,显示时会转换成unicode
Zset 有序集合
- Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员
- 不同的是每个元素都会关联一个 double 类型的分数
- redis 正是通过分数来为集合中的成员进行从小到大的排序
- 有序集合的成员是唯一的,但分数(score)却可以重复
- 以下例子中,c2比c1大
#--------------------添加、查询和删除------------------
zadd key v1 c1 v2 c3…… #向有序集合key中,添加v,v2等多个元素,其对应的分数是c1和c2
zrange key index1 index2
# 查询有序集合key中,index1和index2之间的元素,0,-1表示全部,返回所有的元素,不返回分数
zrange key index1 index2 withscores
# 查询有序集合key中,index1和index2之间的元素,0,-1表示全部,返回所有的元素和分数
zrangebyscore key v1 v2
# 查询有序集合key中,分数1和分数2之间的元素(包含v1和v2)
zrangebyscore key v1 (v2
# 查询有序集合key中,分数v1和分数v2之间的元素(不包含v2)
zrangebyscore key (v1 (v2
# 查询有序集合key中,分数v1和分数v2之间的元素(不包含v1、v2)
zrangebyscore key v1 v2 limit index count
# 从有序集合key中,分数v1和分数v2之间,跳过2个元素,再取两个元素
zrem key v1 # 在有序集合key中,删除v1的元素
#-------------------范围和逆序----------------------
zcard key # 查看有序集合key中元素个数
zcount key c1 c2 # 查看有序集合key中,分数在c1和c2之间有多少个元素
zrank key v1 # 查看有序集合key中,v1的下标(下标是从0开始),从上到下,从左至右
zscore key v1 # 获取有序集合key中,v1对应的分数
zrevrank key v1 #获取有序集合key中,v1对应的逆序下标,从下到上,从右至左
zrevrange key index1 index2 # 逆序查询有序集合key中,index1和index2之间元素
zrevrangebyscore key c2 c1# 逆序查询有序集合key中,分数大于c1小于c2的元素
持久化
- 定义:在指定时间间隔内,将内存中的数据集的快照写入磁盘
- 自动备份
- 如何修改redis的自动备份策略?
- 使用shutdown关闭redis后,可以在/usr/local/bin目录下,看到dump.rdb自动保存
- 重新启动redis之后,在300s内保存10条数据,也会触发备份指令
- 存在备份的情况下,就可以将数据全部删除,再次shutdown关机
- 再次启动redis,就发现数据真的消失的,原因是:
- 如果说不在意重启之后,数据是否丢失,只是用缓存功能,就可以将上面截图中的倒数三行注释掉
- 如果要解决这个问题,就手动备份一个文件,关闭数据库之后,将之前备份的文件替换,重启数据库之后就有数据
- 立即备份,直接没有在退出redis之前,执行命令
save
即可
RDB相关的配置
- 下面是配置文件中的含义,路径: /opt/redis-5.0.4/redis.conf
- stop–writes-on-bgsave-error:进水口和出水口,出水口是否发生故障与否
-
- no:不管死活,就往死里怼
- rdbcompression:对存储在磁盘中的快照,是否启动LZF压缩算法,一般会启动,因为这点性能,多买一台电脑就搞定了
-
- yes:启动
- rdbchecksum:在存储快照之后,是否启动CRC64算法进行数据校验
- dbfilename:快照备份文件名字
- dir:快照备份文件保存的目录,默认为当前目录
- 优势和劣势:
-
- 优:适合大规模的数据恢复,对数据完整性和一致性要求不高
- 配置文件信息如下图(其中一个,剩余的自己找):
AOF相关的配置
开启AOF
# 在配置文件中,使用/appendonly搜索
appendonly yes
appendfilename appendonly.aof
- 2.重新启动redis,以新配置文件启动
- 3.链接redis,加数据,删库,退出
- 4.查看当前文件夹是否多了一个aof文件,查看文件中的内容,保存的都是写操作(自己输入的命令)
- 5.只要重新链接,数据就恢复成功后
共存
AOF 相关的配置
- appendonly:开启AOF模式
- appendfilename:AO F的文件名字,最好别改
- appendfsync:追写策略
-
- no:不追写
- no-appendfsync-on-rewrite:重写时,是否会运用Appendfsync追写策略,用默认no即可,保证数据安全性
-
- AOF采用文件追加的方式,文件会越来愈啊大,为了解决这个问题,增加了重写机制
- auto–aof-rewirite-percenttage:如果AOF的大小超过了原来的一倍,也就是100%,才进行压缩你
- auto–aof–rewrite–min-size:如果AOF的大小超过了64MB,菜重写压缩
总结
事务
定义和执行
- 可以一次执行多个命令,是一个命令组
- 一个事务中,所有命令都会序列化(排队),不会被插队
- 一个队列中,一次性,顺序性,排他行的执行一系列的命令
- 三特性:
- 三步走:
-
- 入队queued
-
- 执行exec
- 与关系型数据库相比:
- 事务的特征:
-
- 一起死:放弃之前的操作,回复到原来的值
- 一起死:放弃之前的操作,回复到原来的值
-
- 一句报错,全部取消,回复称原来的值
- 一句报错,全部取消,回复称原来的值
-
- 追究责任,谁的错找谁
- 追究责任,谁的错找谁
事务的监控(watch)
- 语法结构:
watch key
,key为输入数据的时候,设置的键 - 补充:
unwatch
,取消watch命令对所有key的操作,需要在exec之前执行 -
- 因为一旦执行了exec或者DISCARD命令,之前添加的监控就会失效
- 在执行事务之前,使用并发的方式修改了监控in的数据(另外一个窗口,也可以理解为线程)
- 再去执行事务的时候,会打断事务的执行,导致执行失败
- 整个过程相当于乐观锁,
事务的订阅
- 进程之间的一种通信模式,发送者发送消息,订阅者接受消息
- 订阅一个或者多个频道
- 效果:订阅某个频道或者作者之后,频道或作者下每新增一篇文章,订阅者都会收到通知
- 语法结构:
subscribe key1 key2 key3……
主从复制
一主二仆
vim /opt/redis-5.0.4/redis.conf
#然后搜索bind
/bind
#修改服务器地址为0.0.0.0,如下图
- 2.启动三台redis,并查看每台机器的角色,都是master
- 3.测试开始
- 命令示例图如下:
- 复制数据之后,主机和从机再次查看角色时,他的信息如下:
- 复制之后:
-
- 从机可自动从主机中复制主机中获取复制之前存储的数据
-
- 主机存储数据之后,从机也可立刻同步
-
- 从机死了,主机仍是master,小弟少了一个
主机的血脉相传
- 一个主机里淋上可以有多个从几,但是这样的话,主机会很累
- 我们可以使用java面向对象继承中的传递性来解决这个问题,减轻主机的负担
- 我们可以将其他的redis服务器加在从机上,形成树形结构,他就会复制从机的数据
- 例如下图:
- 关联之后,主机输入数据,从机1复制主机的数据,从机2复制从机1的数据
谋权篡位
- 1个主机,2个主机的跟随从机,如果主机挂掉了;
-
- 只能从从机中选择一个当主机,剩余的从机跟随新主机
- 手动将从机变为主机
slaveof no one
-
- 手动将另外一台主机的跟随变为新主机
- 手动将另外一台主机的跟随变为新主机
- 如果原本的主机重新启动,那么原本挂掉的主机就没有小弟了,只是身份是主机而已
redis复制的原理
-
master接收到命令之后,会启动后台存盘进程,同时会搜集所有修改的命令集,待在后台执行完毕之后,master会一次性将这个数据文件传送给slave,以完成后一次同步
-
redis朱总同步策略:
-
- 全同步结束之后,进行增量同步
哨兵模式
- 自动版的篡权夺位
- 场景:有个哨兵在巡逻,突然发现老大挂了,小弟们自动投票,从中小弟中选出新的老大
- Sentinel是Redis的高可用性解决方案:
-
- 并且在被监视的主服务器进入下线状态时,自动将下线主服务器的树下的某个从服务器升级为新的主服务器
- 设置方法:
-
- 三台服务器,1主2从
#sentinel monitor 被监控主机名(自定义) ip 端口号 票数
sentinel monitor redis141 192.168.204.141 6479 1
# 讲着计划写入sentinel.conf文件中即可
-
- 启动服务的顺序 主redis ——从redis ——Sentinel1/2/3
-
- 启动命令是:redis- sentinel sentinel.conf
- 主机shutdown,从机进行激烈的投票
- 查看最后权利的分配
- 如果之前挂掉的主机重启的话:
- 这种方式的缺点:
-
- 由于所有的写操作都是在master上进行的
-
- 当系统很繁忙的时候,延迟问题会加重
-
- slave机器数量增加,问题也会加重
原文地址:https://blog.csdn.net/weixin_43754879/article/details/128664809
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_13945.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。