redis知识复习
- redis基础知识
- redis的认识
- 一. 非关系型数据库 与 传统数据库 的区别
- 二. 安装redis并设置自启动
- 三. 熟悉命令行客户端
- 四.熟悉图形化工具RDM
- redis的命令与数据结构
- 一. 数据结构介绍
- 二. redis通用命令(熟练掌握)
- redis的Java客户端
- 一. Jedis
- 二. SpringDataRedis
- 三. StringRedisTemplate(推荐)
- redis应用(未完结...)
- 处理登录验证
- 设计登录拦截
- 处理热点数据的查询工作
- 处理缓存穿透
- 处理缓存雪崩
- 处理缓存击穿
- 处理秒杀任务
redis基础知识
redis的认识
一. 非关系型数据库 与 传统数据库 的区别
背会这张表就行了
二. 安装redis并设置自启动
-
在Linux环境下 安装redis依赖
yum install -y gcc tcl
-
(/usr/local/src目录下) 下载对应的redis安装包(本次为v6.2.6,如果有之前下载过的redis,记得提前删除干净,以防配置环境等因素造成安装的异常)
wget https://download.redis.io/releases/redis-6.2.6.tar.gz
-
解压压缩包获得 redis程序安装包
tar -xvf redis-6.2.6.tar.gz
-
在该程序包目录下执行 编译安装命令(默认该步骤会将redis软件安装到/usr/local/bin目录下)
make && make install
-
执行redis服务命令 即可启动redis,该方式为前台启动方式(不友好,不推荐使用)
redis-server
-
修改配置文件,完成指定配置下的启动准备(记得对redis.conf做备份,以防修改失误)
cp redis.conf redis.conf.bck vi redis.conf ```![添加任意进程可访问](https://img-blog.csdnimg.cn/6538b2acabe1497a8e81542bce06c887.png) ![守护进程开启](https://img-blog.csdnimg.cn/595af5c274fb47dc8ca0bed7da2a5fb6.png) ![开启密码](https://img-blog.csdnimg.cn/decd86dfa5b244c195e9d7f4807801a0.png) ![日志记录](https://img-blog.csdnimg.cn/12f2e571d76a473fad37c77021f690f3.png) ```shell # 文本内部的修改(供复制粘贴) # 任意ip可访问 bind 0.0.0.0 # 守护进程打开,可后台运行 daemonize yes # 密码设置123321 requirepass 123321 # 打开日志记录,并命名 logfile "redis.log"
-
根据指令,完成指定配置文件下的启动
redis-server redis.conf
-
查看redis进程命令,以及杀死进程命令
ps -ef | grep redis kill -9 PID(PID为对应的进程序列号)
-
开机自启动(在 system系统文件夹中 新建一个配置类文件)
vi /etc/systemd/system/redis.service
配置类文件内容如下:
[Unit] Description=redis-server After=network.target [Service] Type=forking # 这行配置内容要根据redis的安装目录自定义路径 ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf PrivateTmp=true [Install] WantedBy=multi-user.target
重载系统服务,以便配置文件生效
systemctl daemon-reload
此时可以使用系统命令实现redis的启动、查看状态或关闭
systemctl start redis systemctl status redis systemctl stop redis
执行下面的命令,实现开机自启:
systemctl enable redis
查看此时,redis 服务的状态:
systemctl status redis
三. 熟悉命令行客户端
-
在/usr/local/bin/目录下,使用redis-cli实现连通redis
redis-cli -h 192.168.2.190 -p 6379 -a 123321 >ping
-
存取数据set/get,换库select [index]
四.熟悉图形化工具RDM
redis的命令与数据结构
一. 数据结构介绍
二. redis通用命令(熟练掌握)
# keys:查看所有key
keys *
# set:设置添加k-v mset:批量添加
set k1 v1
mset k1 v1 k2 v2 k3 v3
# del:删除
del k1
# exist 查看是否存在
exist k1
# expire:设置有效期时间,单位s,没有特殊设置则为-1表示永久有效
expire k1 20
# ttl:查看有效期剩余时间(-1表示永久,-2表示过期,正数表示剩余秒数)
ttl k1
String类型(可存string,int,float)
redis的key的格式:
层级存储:[项目名]:[业务名]:[类型]:[id],这种存储的方式,有一个好处,那就是在使用gui图形界面能看到层级结构
Hash类型
List类型(对比Java的双向链表)
list的总结:可以广泛模拟 栈(同一个方向先进后出) 队列(不同方向进出) 阻塞队列(一头取,一头放,需要设置等待时间)
Set类型(对比Java的hashset,相当于底层使用hashmap实现)
SortedSet类型(功能上类似TreeSet,底层数据结构不同)
redis的Java客户端
一. Jedis
单例使用流程
Jedis连接池用法
创建连接池对象,设置参数,完成连接池的创建,在使用过程中,与上述直接创建连接不同的是直接从连接池中获取一个连接,其他基本一致
// jedis = new Jedis("192.168.2.190",6379);
jedis = JedisConnectionFactory.getJedis(); //直接从连接池中获取一个
二. SpringDataRedis
使用流程(写pom,写yml,写测试用例,完成测试)
- 创建项目,引入依赖
-
完成配置文件的设置
-
注入装配,实施测试
redisTemplate的序列化操作存在的问题
基于可读性差的因素,可以自定义序列化方式,规避序列化造成的可读性问题
- 加依赖
<!--jackson序列化工具-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
- 自定义序列化方式(最好能理解!实际上由于该方式进行反序列化的必要操作时,会必定携带@class信息,造成占用内存产生大量冗余,并不推荐使用,后续会使用StringRedisTemplate操作key,value则手动进行序列化与反序列化操作)
/**
* redis反序列化自定义操作工具类
*/
@Configuration
public class RedisConfig {
/**
* @param redisConnectionFactory 引入工厂
* @return 返回经过处理的redisTemplate模板
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
// 创建RedisTemplate对象
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 设置连接工厂
template.setConnectionFactory(redisConnectionFactory);
// 创建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置key的序列化
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
// 设置value的序列化
template.setValueSerializer(jsonRedisSerializer);
template.setHashKeySerializer(jsonRedisSerializer);
// 返回RedisTemplate对象
return template;
}
}
三. StringRedisTemplate(推荐)
(基于内存占用问题,使用StringRedisTemplate来改善内存问题,StringRedisTemplate操作key,value则手动进行序列化与反序列化操作)
RedisTemplate与StringRedisTemplate处理后两者存取的数据对比:
redis应用(未完结…)
处理登录验证
设计登录拦截
处理热点数据的查询工作
处理缓存穿透
缓存穿透:浏览器不断发送未命中的请求,redis一直未命中,一直查询数据库,给数据库造成很大压力
实例:用户查询一个热点商铺/商品/文章信息,信息不存在,持续访问造成数据库压力
解决方案:
处理缓存雪崩
实例:用户分时段查询多个热点商铺/商品/文章信息,结果在某个时间节点该信息全部失效,导致该时间节点需要大量访问数据库造成数据库压力
解决方案:给redis中的缓存数据设置不同的TTL
处理缓存击穿
实例:多名用户在一个定时活动的时间节点访问某个热点商铺/商品/文章信息,结果造成缓存失效,结果造成访问数据库造成数据库的压力过大
- 使用互斥锁处理缓存击穿
- 使用【逻辑过期时间】处理缓存击穿