Redis总结
Nosql概述:
大数据时代,一般的数据库无法支撑
为什么要用NoSQL
用户的个人信息,社交网络,地理位置,用户自己产生的数据,用户的日志等等爆发式增长!
这时候我们需要使用NoSQL数据库,可以很好的处理以上情况
什么是NoSQL
NoSQL = Not Only SQL泛指非关系型数据库
NoSQL四大分类:
KV键值对:Redis memecache
文档型数据库(BSON):MongDB(一般必须掌握)
MongDB是一个基于分布式文件存储的数据库,C++编写。主要用来处理大量的文档。是一个介于关系型数据库和非关系型数据库中间的产品,是非关系型数据库中功能最丰富的,最想关系型数据库的
列存储数据库:HBase
图关系数据库:用来存关系的数据库,比如朋友圈社交网络等 Neo4j;
Redis
Windows安装
ping 测试连接
set key value存入数据
get key获取数据
Linux安装
1、下载安装包!https://redis.io
2、解压我们的安装包!程序放到opt目录:
3、进入redis解压后的文件:可以看到redis配置文件
4、yum install gcc -c++ 基本的环境命令安装,可能需要配置网络
5、make命令
6、默认安装路径:usr/local/bin
7、想要后台启动的话需要改一个配置文件:将解压后的配置文件复制到改目录下:mkdir ***创建一个目录,然后cp/opt/redis***/redis.conf ***,然后改成默认后台启动,vim redis.conf
8、启动redis服务
通过指定的配置文件去启动
使用redis -cli进行连接测试
9、查看redis进程是否开启
ps -ef|grep redis
redis基础知识:
redis一共有16个默认的数据库,可以通过select + 下标切换数据库 下标是从0开始
dbsize可以查看当前数据库的大小
set + key + value可以往数据库存值
get + key 获取对用的key值
keys + * 查看当前数据库所有的key
flushdb:清空当前数据库
flushall:清空所有数据库
redis是单线程的
redis是基于内存操作的,cpu并不是redis的性能瓶颈,redis的瓶颈是根据机器的内存还有网络带宽有关,所以既然能使用单线程就用单线程了
Redis单线程为什么还这么快?
核心:redis是将我们所有的数据都放到内存中的所用使用单线程去操作效率就很高,多线程(CPU上下文会切换:耗时),对于内存来说,如果没有上线文切换效率就是最高的!多次读写都是在一个cpu上的
Redis基本数据类型
Redis-key
exists + key:判断某个键是否存在
move + key + 1:移除某个key和value,1代表当前数据库
expire + key + time:设置某个key的过期时间
ttl + key:查看某个key还剩多少时间过期
type + key:可以查看当前key对应value是什么类型
String(字符串)
append + key + 字符串:往某个字符串后面追加
strlen + key:获取某个字符串的长度
incr + key:使当前key的value+1
incrby + key + 增长量:使当前key的value+增长量
decr + key:使当前key的value- 1
decrby + key + 增长量:使当前key的value-增长量
getrange + key + start + end:截取字符串包头包尾
setrange + key + offset + value:将某一个位置往后的字符串修改成value
List
列表,在redis里面我们可以吧list用成,栈,队列,阻塞队列!
所有的list命令是l开头的
lpush key 值:以list的形式存值
lrange key start stop:获取里面的值,里面的值是倒序最后存入的值是0
下标方式获取
Set(集合)其中的值是不能重复的,无序的
s开头都是set的命令
Hash
类似于map集合 key mapkey value
h开头的是hash的命令
ZSet
三种特殊数据类型
geospatial 地理位置
事务
redis单条命令是保存原子性的,但是事务不保证原子性!
redis事务没有隔离级别的概念!
所有的命令在事务中并没有直接执行,只有发起执行命令的时候才会执行!Exec
redis事务本质:一组命令的集合!一个事务中所有的命令都会被序列化,在事务执行过程中会按照顺序执行!
一次性 顺序性 排他性 执行一系列命令
Redis的事务
开启事务(Multi)
命令入队 ......
执行事务(Exec)
放弃事务 discard
当开启事务的时候出现错误
编译型异常:
运行时异常,因为redis不保证原子性,所以运行时出错,其他的依旧会执行,而mysql的话会回滚的操作
锁:Redis可以实现乐观锁
监控:watch
悲观锁:很悲观,认为什么时候都会出问题,无论做什么都要加锁
乐观锁:很乐观,认为什么时候都不会出问题,所以不会上锁,更新数据的时候来判断,再次期间是否有人修改过这个数据
Redis监视测试:
Jedis
2、编码测试
连接数据库:
Jedis jedis = new Jedis("localhost",6379);
System.out.println(jedis.ping());
JSONObject jsonObject = new JSONObject();
jsonObject.put("hello","word");
jsonObject.put("name","王飞");
String json = jsonObject.toString();
Transaction mutil = jedis.multi();
try {
mutil.set("user","王飞");
mutil.set("json",json);
mutil.exec();
}catch (Exception e){
mutil.discard();
e.printStackTrace();
}finally {
System.out.println(jedis.get("json"));
jedis.close();
}
等.......
springBoot整合Jedis
SpingBoot操作数据层:
Reids.conf详解
1、单位
并且配置文件对unit单位是大小写不敏感的
2、包含
就好比spring的配置文件import标签
3、网络
默认是只能在本机访问的,需要远程访问配置bind
4、通用GENERAL
5、快照
持久化,在规定的时间内执行了多少次操作,则会持久化到文件 rdb aof
redis是内存数据库没有持久化那么数据断电及失
6、REPLICATION复制,后面在主从复制的时候再补充
windows环境:
7、SECURITY安全
requirepass 设置密码,默认没有密码
8、限制CLIENTS
9、APPEND ONLY 模式 aof配置
RDB (Redis DataBase)
AOP(Append Only File)
就是把我们所有的命令都追加下来。
只需要将aop开启即可
重启redis就可以生效
如果aof文件有错误,redis是启动不起来的,这时候可以通过redis-check-aof去修复
Redis发布和订阅
redis主从复制
配置集群一般需要修改配置文件:
1、端口号
2、日志名
3、rdb文件名
4、后台运行对应的文件
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_replid:52807ccaf308df3b2a4036dce2cec711c67ebbb0
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
查看当前库的信息
配置从机
SLAVEOF 127.0.0.1 6379
这是通过命令配置
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:42
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:23c925b50d6abde4545668a7945b157907bd082e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:43
repl_backlog_histlen:0
这时候我们去看主机
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=70,lag=0
slave1:ip=127.0.0.1,port=6380,state=online,offset=70,lag=0
master_replid:23c925b50d6abde4545668a7945b157907bd082e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:70
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:70
配置文件配置是永久的
哨兵模式
基本模型
redis-sentinel:redis环境下支持,windows环境需要单独下载
2、启动哨兵
如果主机挂掉了,会从从机中选取一个主机出来,如果原来的主机回来了,那它只能归并到我们新的主机下成为从机
缓存穿透和雪崩
二、可以存一个空对象给缓存,这样对于高频率请求的话不会对持久层数据库造成很大的压力