1.Redis简介
是一种可用来更合适地处理高并发、高可用、高扩展的问题的Nosql非关系型数据库。Redis可用作内存数据库(保存登录用户数据)和缓存服务器(保存缓存常用数据:功能分类等)使用。
2.Redis数据类型(value的类型)
2.1String类型
基本操作
127.0.0.1:6379> set test 123
OK
127.0.0.1:6379> get test
"123“
数值增减
127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> incr num
(integer) 3
2.2Hash类型
127.0.0.1:6379> hset user username zhangsan
(integer) 1
127.0.0.1:6379> hget user username
"zhangsan“
2.3List类型
127.0.0.1:6379> lpush list:1 1 2 3
(integer) 3
127.0.0.1:6379> rpush list:1 4 5 6
(integer) 3
2.4Set类型
数据是不重复且没有顺序
127.0.0.1:6379> sadd set a b c
(integer) 3
127.0.0.1:6379> sadd set a
(integer) 0
127.0.0.1:6379> srem set c d
(integer) 1
2.5Zset类型
127.0.0.1:6379> zadd scoreboard 80 zhangsan 89 lisi 94 wangwu
(integer) 3
127.0.0.1:6379> zadd scoreboard 97 lisi
(integer) 0
3.Redis事务
3.1概念
Redis的事务是通过MULTI,EXEC,DISCARD和WATCH这四个命令来完成的。
Redis的单个命令都是原子性的,所以这里确保事务性的对象是命令集合。
Redis将命令集合序列化并确保处于同一事务的命令集合连续且不被打断的执行。
Redis不支持回滚操作。
3.2事务命令
MULTI
用于标记事务块的开始。
Redis会将后续的命令逐个放入队列中,然后使用EXEC命令原子化地执行这个命令序列。
语法:multi
EXEC
在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态
语法:exec
DISCARD
清除所有先前在一个事务中放入队列的命令,然后恢复正常的连接状态。
语法:discard
WATCH
当某个事务需要按条件执行时,就要使用这个命令将给定的键设置为受监控的状态。
语法:watch key [key…]
注意事项:使用该命令可以实现redis的乐观锁。
UNWATCH
清除所有先前为一个事务监控的键。
语法:unwatch
4.Redis实现分布式锁
方式1(使用set命令实现):
/**
* 使用redis的set命令实现获取分布式锁
* @param lockKey 可以就是锁
* @param requestId 请求ID,保证同一性
* @param expireTime 过期时间,避免死锁
* @return
*/
public static boolean getLock(String lockKey,String requestId,int expireTime) {
//NX:保证互斥性
String result = jedis.set(lockKey, requestId, "NX", "EX", expireTime);
if("OK".equals(result)) {
return true;
}
return false;
}
方式2(使用setnx命令实现):
public static boolean getLock(String lockKey,String requestId,int expireTime) {
Long result = jedis.setnx(lockKey, requestId);
if(result == 1) {
jedis.expire(lockKey, expireTime);
return true;
}
return false;
}
5.Redis持久化方案
RDB方式(默认)
通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。
AOF方式
每次更改数据的时候, aof机制都会将命令记录到aof文件,但是实际上由于操作系统的缓存机制,数据并没有实时写入到硬盘,而是进入硬盘缓存。再通过硬盘缓存机制去刷新到保存到文件
6.Redis的主从复制
实现备份功能:
- Redis的主从同步,分为全量同步和增量同步。
- 只有从机第一次连接上主机是全量同步
- 断线重连有可能触发全量同步也有可能是增量同步(master判断runid是否一致)
- 除此之外的情况都是增量同步
7.Redis哨兵机制
Redis主从复制的缺点:没有办法对master进行动态选举,需要使用Sentinel机制完成动态选举(当主master挂掉之后,从机动态顶替挂掉的主机,成为新的主master)
8.Redis Cluster集群
redis cluster集群保证了高可用、高性能、高可扩展性。
9.13缓存穿透、缓存雪崩、热点缓存
缓存穿透:
redis不存在key对应的value,并且对该key并发请求量很大,就会对后端系统造成很大的压力
如何解决?
对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
缓存雪崩:
大量缓存集中在某一个时间段失效,高并发时,也会给后端系统(比如DB)带来很大压力
如何解决?
不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
热点缓存:
key可能会在某些时间点被超高并发地访问
如何解决?
使用redis的setnx互斥锁先进行判断,这样其他线程就处于等待状态,保证不会有大并发操作去操作数据库。