Redis笔记

Nosql入门和概述

是什么?

NoSql——》”不仅仅是SQL“,泛指非关系型数据库,其产生是为了解决大规模数据集合多重种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。

例如:谷歌或FaceBook每天收集亿万比特的用户数据,这些数据存储不需要固定的模式,无需多余操作就可以横向扩展。

能干什么?

  • 易扩展:去掉了关系型数据库的关系型特性,数据之间无关系,这样就容易拓展。也无形之间,在架构的层面上带来了可扩展能力。
  • 大数据量高性能:NoSql具有非常高的读写性能,尤其在大数据量下,表现同样优秀。这得益于他的关系性,数据库的结构简单。一般MySql使用的Query Cache,在每次表更新后都会失效,大粒度性能不高。
  • 多样灵活的数据模型:NoSql无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系型数据库中,增加字段是一件很麻烦的事情,如果是非常大数据量的表,增加字段简直是噩梦。
  • NoSQL:代表着不仅仅是SQL,没有声明性查询语言,没有预定义的模式,键-值对存储,最终一致性(非ACID)

去哪里下?

Redis

怎么玩?

  • KV
  • Cache
  • Persistence

简介:

在关系型数据库中数据类型称为:Int,varchar

非关系型数据库中统称为:聚合型及其四个分类(KV键值、Bson(类似于Json格式)、列族、图形(表示复杂的关系,如QQ的关注、共同好友))

NoSQL数据库(分布性系统)中的CAP原理+BASE

CAP: Consistence(强一致性)、Availability(可用性)、Partition Toleronce(分区若错性)只能满足其中2个

CA:传统数据库

AP:大多数网站架构的选择(双11:服务器不崩是A、分布是P)

CP:Redis(保证与数据库的一致性)

BASE:是为了解决关系型数据库强一致性引起的问题引起可用性降低而提出的方案。(基本可用、软状态、最终一致,即用C换取AP)

什么时候用?

在大数据量的Web系统中,非常忌讳多个大表关联查询,以及复杂数据类型的报表查询,此时使用NoSQL

分布式和集群

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

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

Redis

是什么

远程字典服务,开源、支持多种语言、支持事务、集群。Redis是推荐在Linux上搭建的,基于Linux学习

特点

支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用

不仅仅支持简单的Key-Value,同时还提供list、set、zset、hash等数据结构的存储

支持数据备份,即maste-slave(主从复制)的数据备份

作用

  • 内存存储和持久化(rdb、aof):支持异步将内存中的数据写到磁盘,同时不影响继续服务
  • 效率高、可以用于高速缓存
  • 地图信息分析
  • 计时器、计数器(浏览量!incr
  • 发布、订阅消息系统(消息中间件)

Linux安装

步骤1:下载安装包

步骤2:解压到opt目录

步骤3:进入解压后文件,可以看到redis的配置文件

步骤4:安装yum install gcc -c++

步骤5:gcc的版本必须在centos6.x版本要4.8上,不够得升级https://blog.csdn.net/tao_627/article/details/50448924?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.baidujs&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.baidujs,,这里推荐用Centos7

make

make install

步骤6:redis的默认安装路径 usr/local/bin

步骤7:将resis配置文件在bin目录下创建一个自己的配置文件,复制一份(保证能恢复

mkdir myconfig

cp /opt/redis-5.0.8/redis.conf myconfig

cd myconfig

ls

步骤8:redis默认不是后台启动的,修改自己的配置文件vim redis.conf

daemonize yes

步骤9:启动redis服务,通过自己复制后的redis.conf启动

redis-server myconfig/redis.conf

步骤10:测试是否能连,用客户端

redis-cli -p 6379

步骤11:查看redis的进程是否开启

ps -ef | grep redis

步骤12:如何关闭redis服务

shutdown

exit

ps -ef | grep redis

数据类型

键Key

常用命令

命令作用使用
keys *查看当前库中的所有keykeys *
exists 【key】根据key的名字判断当前库是否存在exists k1
move 【key】 【db】将key移动到指定数据库中move k1 1
expire 【key】 【Second】给key设置过期时间,以秒数为单位expire k1 7
ttl 【key】查看还有多少秒过期,-1为永不过期,-2为已过期ttl k1
type 【key】查看key的类型

String

单值单value

常用命令

命令作用使用
set/get/del/append/strlen 【key】 【value】设置/获取/删除/拼接/计算长度append k1 nihao、strlen k1
incr/decr/incrby/decrby加/减,一定要是数字才能加减incrby k1 n(k1的值加n)
getrange/setrange获取指定范围的值/设置指定范围的值getrange k1 0 -1(显示全部)、setrange k1 0 xxx(从0为开始补充xxx)
setex(键秒值)/setnx()设置键的存活秒数、如果不存在则添加值setex k1 10 v1、setnx k1 v11
mset/mget/msetnx一次操作多个,原子性mset k1 v1 k2 v2,mget k1 k2,msetnx k1 v1 k3 v3

List

单值多value

常用命令

命令作用
lpush、rpush、lrange 【key】 【value】左进、右进、左边遍历查看
lpop、rpop左出(相对于List来说的栈顶,栈顶先出)、右出(相对于List来说的栈底,栈底先出)
lindex按照索引下标获取元素(从上到下)
llen长度
lrem key value1 value2删除N个value
Itrim key 开始index 结束index从开始index到结束index范围截取出来,赋值给原来的key,从栈顶开始
rpoplpush 源列表 目的列表从源列表的栈底出,加入到目的列表的栈顶
lset key index value给列表指定位置设置值,会覆盖
linsert key before/after 值1 值2在值1前/后插入值2

Set

单值多value,且value不重复

常用命令

命令作用使用
sadd、smembers、sismembersadd添加、smembers 遍历、sismember判断是否存在sadd set1 1,2,3、smembers set1、sismember set1 1
scard获取集合里的元素个数scard set1
srem key value删除集合中的元素srem set1 1
srandmember key n某个整数(随机出几个数)srandmember set1 2(随机出两个数)
spop key随机出栈spop set1
smove key1 key2 key1中的某个值将key1中的值移入到key2中smove set1 set2 5(将set1的5移入到set2中)
数学集合类 sdiff(差集)、sinter(交集)、sunion(并集)sdiff为set1中有set2中没有的、sinter为二者共同部分、sunion为二者和在一起但共同部分只保留一个sdiff set1 set2

Zset

有序的Set,在Set基础上,加一个score值,之前的set为k1 v1 v2 v3,现在Zset是k1 scroe1 v1 score2 v2

常用命令

命令作用实例
zadd、zrange(末尾加Withscores),zrevrange添加、遍历、逆序遍历zrang set1 0 -1 withscores
zrangebyscore key 开始score 结束score (“(”不包含,limit 截取结果分页)、zrevrange key 开始score 结束score显示指定分数范围、逆序输出zrangebyscore set1 60 (90 limit 2 2
zrem key 对应分数删除分数对应的元素zrem zset01 v5
zcrad、zcount key score范围、zrank key values值 、zrevrank key values值计算个数、计算指定范围个数、查看value对应下标、逆序获取下标值zrank zset1 v4

Hash

KV模式不变,但V是键值对

常用命令

命令作用实例
hset、hmset、hget、hmget、hgetall、hdel设置、获取、删除hmset customer id 11 name lin、hdel customer name
hlen获取长度hlen customer(显示4)
hexists key 在key里面的某个值的key判断是否存在Hexists customer id
hkeys、hvals所有的key、所有的valueHkeys customer
hincrby、hincrbyfloat key key n增加nhicrby customer age 2
hsetnx key key value添加键值对如果不存在hsetnx customer email 10086

Redis的配置文件内容

文件名:redis.conf

Unit(单位)

单位不区分大小写

Includes包含

引入其他的配置文件

General通用配置

daemonize ——是否以守护进程运行

pidfile——进程文件位置

dir ./——指定数据库存放位置

port——端口

Tcp-backlog——设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成3次握手队列+已经完成3次握手队列,在高并发的环境下需要设置一个高的backlog的值来避免慢客户端连接问题。注意Linux内核会将这个值减少/proc/sys/net/core/somaconn的值,所以需要确认增大somaconn和tcp_max_syn_backlog两个值来达到效果

timeout 0——设置断开时间,“0”为永不断开

Tcp-keepalive——网络检测时间,单位为秒,如果设置为 0 ,为不检测,一般设置60

Loglevel——日志级别,debug、verbose、notice、warning

Logfile——日志文件位置

Syslog-enabled——是否把日志输出到syslog中

Syslog-ident——syslog的日志标识

Syslog-facitiy——指定syslog设备,可以是user或local0-7

Databases——默认安装有16个库

Security安全

访问密码的查看、设置和取消

先开启redis客户端

redis -server /myconfigredis/redis.conf

redis -cli

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3xJ6yahK-1613904231342)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\image-20210218144523397.png)]

密码的查看

命令:config get requirepass,此时没有密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EYduvIJm-1613904231343)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\image-20210218144656389.png)]

密码的设置

命令:config set requirepass 密码

注意:此时ping需要密码验证,使用命令:auth 密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nvh5yNx7-1613904231344)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\image-20210218144926879.png)]

密码的取消

命令:config set requirepass “”

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QCCPGHiE-1613904231346)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\image-20210218145010764.png)]

limits限制

极限

maxclients——最多连的客户机数量

maxmemory——最大的内存

maxmemory-policy——过期策略

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SGNdlRxK-1613904231347)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\image-20210218145902673.png)]

maxmemory-samples——设置样本数量,选取样本数量在样本选取符合的移除

Snapshotting快照

save——保存

快照的使用

redis启动时会读取dump.rdb文件

备份:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ZC27bcS-1613904231348)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\image-20210218172809876.png)]

还原:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3AQ1nIi8-1613904231349)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\image-20210218172913182.png)]

stop-writes-on-bgsave-error——后台保存错误后前台停止写操作

rdbcompression——对与rdb文件是否开启压缩

rdbchecksum——rdb校验

dbfilename——转存的文件名

dir——redis启动时所在的目录

APPEND ONLY MODE追加

appendonly——是否开启aof持久化

appendfilename——aof的文件名称

appendfsyc——记录策略

  • Always:同步持久化,每次发生数据时会立即记录到磁盘,性能差但数据完整性较好
  • everysec:默认,每秒钟记录
  • No

No-appendfsyc-on-write——重写时是否可以运用appendfsysc,用默认no即可,保证数据安全性

auto-aof-rewrite-min-size——设置重写的基准值

auto-aof-rewrite-percentage——设置重写的基准值

Redis的持久化

​ 由于 Redis 是一个内存数据库,所谓内存数据库,就是将数据库中的内容保存在内存中,这与传统的MySQL,Oracle等关系型数据库直接将内容保存到硬盘中相比,内存数据库的读写效率比传统数据库要快的多(内存的读写效率远远大于硬盘的读写效率)。但是保存在内存中也随之带来了一个缺点,一旦断电或者宕机,那么内存数据库中的数据将会全部丢失。

为了解决这个缺点,Redis提供了将内存数据持久化到硬盘,以及用持久化文件来恢复数据库数据的功能。Redis 支持两种形式的持久化,一种是RDB快照(snapshotting),另外一种是AOF(append-only-file)。

RDB(Redis Database)

是什么?

RDB是Redis用来进行持久化的一种方式,是把当前内存中的数据集快照写入磁盘,也就是 Snapshot 快照(数据库中所有键值对数据)——damp.rdb文件。恢复时是将快照文件直接读到内存里。

RDB是整个内存压缩的snapshot快照,RDB的数据结构,可以配置复合的快照触发条件,默认

是1分钟内修改1万次或5分钟内修改10次或15分钟内改了1次

在redis.conf中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V1LvlPKB-1613904231349)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\image-20210218165004815.png)]

如何触发快照?
  • 创建一个配置文件中配置名相同的快照文件,使用cp 从备份机复制出来
  • 使用命令时savebgsave(异步进行,在进行快照操作同时响应客户端的请求)
  • 使用flushall,生成空白rdb文件,无意义
总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6HQXRAQx-1613904231350)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\image-20210218175606496.png)]

AOF(Append Only File)

是什么?

以日志的形式来记录每一个操作,不记录读操作,在redis重启时会读入该文件,按文件的内容从前到后执行恢复数据

如何启动?

redis.conf的APPEND ONLY MODE部分的appendonly 修改为yes(这也是恢复的方法)

遇到错误?

因宕机生成的appendonly.aof包含错误内容

两种方法:

  1. 进入appendonly.aof,将错误部分删除

  2. 使用命令,在redis-server同级目录下有一个为“redis-check-aof的程序”,使用该程序纠正错误

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yvtxPP2q-1613904231350)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\image-20210218233234879.png)]

Rewrite

是什么——由于aof使用文件追加,文件越来越大,故新增了重写机制,当aof文件大小超过所设定的阈值时,Redis就会启动aof文件的内容压缩,

重写原理——把文件压缩减小

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

总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yG4UL0um-1613904231351)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\image-20210218230856663.png)]

RDB和AOF总结

rdb是用指定时间间隔内按次数触发,aof是时间触发

如果rdb和aof文件同时存在,则此时redis先读取aof文件的内容

事务

是什么?

可以执行多个命令,本质是一组命令的集合,一个事务中的所有命令都会被序列化,按顺序地串行化执行且不允许其他命令插入

命令

multi——开启事务

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

exeu——执行

watch——监控,类似于乐观锁,获取乐观锁版本号使用:watch key1 ……,可监控多个key,如果key的值已被别的客户端改变,则整个队列都不会执行

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

unwatch——清理对所有key的监控,取消提交

锁机制

保证并发性和一致性

悲观锁——由于担心每一次修改数据时,都会有人修改数据,于是将整张表都锁起来,并发性差

乐观锁——不担心修改数据时,会有别人修改,采取在每一个数据后面加一个版本号等机制,保证高并发、且不锁整张表

两种错误
  • 事务中,有个语句语法错误执行报错,此时会直接显示出错误这种错误命令,整一组命令都不会执行
  • 事务中,有个语句语法正确,但执行时会报错,如incr v1(v1不为数字)此时不会直接显示错误这种错误命令,除了此语句不执行外,其他正确的语句都会执行

发布订阅

先订阅才能在发布后获取消息

发布发在指定频道中,订阅才能从指定频道中获取

subscribe——订阅指定频道,使用:subscribe c1 c2 ……

publish——发布消息在频道中,使用:publish c1 message

psubscribe——订阅多个,使用:psubscribe new*,订阅多个包含new的频道,“ * ”为通配符

使用:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rn0foKvV-1613904231352)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\image-20210220175215735.png)]

主从复制

是什么?

主从复制就是主机数据更新后根据配置和策略,自动备份到从机上的master/salver机制,Master以写为主,Salver以读为主。

可以用于读写分离、容灾恢复

使用

  1. 配从不配主,从机要配置,主机不需要配置
  2. 从库配置:命令:salveof 主库IP 主库端口
    • 每次与主机断开后都得重新连接,除非配置进配置文件中
    • Info replication

常用3招

  • 一主二仆

    • Info replication——查看redis的角色

    • salveof 主机IP 主机端口——变为从机

      注意:无论从机何时使用该命令,变为从机后,主机的内容全部都有,且从机不能继续写操作

    若主机断线,从机内容不变,直至主机重启

    若从机断线,内容消失,且不在是从机,除非使用命令或在主机配置文件中配置重新变为从机

  • 薪火相传

    • 使用:slaveof 从机IP 从机端口——变为从机的从机
  • 反客为主

    • 即原来的主机断线了,或者损坏了,选择一台从机变为主机,
      • 使用命令:slaveof no one,从机变为主机
      • 再其他从机上使用:slaveof 变为主机的ip地址 端口

修改配置文件细节操作

  1. 拷贝多个redis.conf文件
  2. 开启daemonize yes——使redis变为后台守护进程
  3. Pid文件名字
  4. 指定端口
  5. Log文件名字
  6. Dump.rdb名字

复制原理

salve启动成功连接到master后发送一个sync命令。

master接收到命令启动后台的存盘进程,同时收集所有收到的用于修改数据集的命令,在后台进程执行完毕之后,master将传送整个文件到salve,已完成一次完全的数据同步。

  • 全量复制:第一次从机从主机获取到数据库文件数据后,将其存盘并加载到内存中
  • 增量复制:每一个主机修改依次将收集的命令发送给从机,以完成同步

哨兵

一组sentinel能同时监控多个Master

使用:

  1. 编写配置文件sentinel.conf

    sentinel monitor 被监控的数据库名字(自己取) ip地址 端口 决定票数
    
  2. 运行哨兵

    redis-sentinel sentinel.conf的路径
    

注意:

监控的主机坏了,哨兵会自己选出下一个主机

若原来的主机回来了,原来的主机将变成从机

JRedis

Java去连接Redis的API工具

命令变方法

操作和命令行系统

JRedisPool

原因:需要多个JRedis实例,使用池子概念,不容易消耗内存

在这里插入图片描述

生成一个池的实例的方法

在这里插入图片描述

回收的方法:

在这里插入图片描述

使用:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值