redis基础知识
端口:6379
redis很小,只有5M,推荐Linux部署
redis不区分大小写
总共有16个数据库,为:DB 0~DB 15;默认使用的第0个
可用作数据库,高速缓存和消息队列代理。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
redis可以直接表示对象
redis通用命令
select n:切换到DB n
dbsize:可以查看当前数据库的大小,与key数量相关。
flushdb:清空当前数据库中的键值对。
flushall:清空所有数据库的键值对。
单线程却很快的redis
Redis是单线程的,Redis是基于内存操作的。对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上的,在内存存储数据情况下,单线程就是最佳的方案。所以Redis的性能瓶颈不是CPU,而是机器内存和网络带宽。
数据类型
String,list,set,sorted list,hash
事务与锁的操作
事务特点
单句原子性;整段如果是语法有误(如命令写错),则返回。如果是语义有误(如字符型+1),则执行段内其余语句
顺序性:按照先后入队列顺序执行
排他性:事务一旦执行就会一直占着线程,不可被其它客户端请求打断,但是单单开启事务是可以打断的,必须要执行事务
事务操作
multi #开始事务
众多命令
exec #正常结束输入并开始执行
multi #开始事务
众多命令
discard #结束输入并清空之前语句
事务操作之watch实现乐观锁
watch使用CAS实现了乐观锁
具体实例如下:
进程1
watch money
multi
decrby money 10
incrby out 10
进程2
decrby money 10
incrby out 10
进程1
exec
进程1只能取消事务,因为watch已经存储了money进入事务前的状态,当进程1操作money,会尝试CAS置换money,由于线程2更改了状态,所以置换失败。如果想要成功执行事务,就得告知锁新的状态,即先unwatch在watch
Java配置Redis
fastjson和Jedis为什么需要一起导入
Jedis.java为什么可以连接数据库
SpringBoot整合redis
1 选择和springboot版本一致的redis启动器(默认springboot版本在spring-boot-starter-web)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.3.7.RELEASE</version>
</dependency>
2 连接redis和程序
SpringBoot2.0后,lettuce替换了jedis,连接redis和Java程序。
因为jedis是线程不安全的,每个jedis实例仅为一条线程服务,除非是用pool
而lettuce是基于Netty的,可以在线程间传递
3 从SpringBoot寻找Template及完成配置
redis替换Template
redis不序列化会乱码
自定义Template
重写泛型,重写各种数据类型的序列化,自动装配时@Qualified指明使用的Template
持久化
RDB执行过程
RDB触发条件
RDB优缺点
雪崩,穿透
雪崩是指缓存承载不住,崩掉导致服务器崩。穿透是指缓存经常不命中,导致服务器崩