一.redis使用
1.基础配置
-
配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--Jedis连接池的相关配置--> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal"> <value>200</value> </property> <property name="maxIdle"> <value>50</value> </property> <!--检查连接池连接可用性和稳定性--> <property name="testOnBorrow" value="true"/> <property name="testOnReturn" value="true"/> </bean> <bean id="jedisPool" class="redis.clients.jedis.JedisPool"> <constructor-arg name="poolConfig" ref="jedisPoolConfig" /> <constructor-arg name="host" value="127.0.0.1" /> <constructor-arg name="port" value="6379" type="int" /> </bean> </beans>
-
导入依赖
<!--redis--> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <jedis-version>2.9.0</jedis-version> </dependency>
2.代码实现
public List<Setmeal> findAll() { Jedis jedis = jedisPool.getResource(); String setMeal = jedis.get("setMeal"); //先判断redis中有没有这个key,有的话就去redis中查询 if (null ==setMeal){ //找mysql查询 List<Setmeal> setmealList = setMealDao.selectAll(); //将list集合转换为字符串格式 setMeal = JSON.toJSONString(setmealList); //将查询结果放到redis中 jedis.set("setMeal",setMeal); } List<Setmeal> setmealList1 = JSONObject.parseArray(setMeal, Setmeal.class); jedis.close(); return setmealList1; }
3.注意事项(List集合转json格式,存入redis中,以下都基于fastjson)
-
List集合转json格式,存入redis中
JSON.toJSONString(List对象); List转为json格式
-
json格式转为List
JSONObject.parseArray(setMeal, Setmeal.class); 将一个json格式转为List
4.JavaBean对象转为json格式
-
JavaBean对象转为json格式
JSON.toJSONString(JavaBean对象); 将一个JavaBean对象转为json格式
-
json格式转为JavaBean对象
-
JSON.parseObject(setMealById, new TypeReference<Setmeal>(){}); 将setMealById的json格式转为SetMeal的JavaBean对象
5.reids的数据结构
- 都是key==>value结构
- hash结构: 一个key:value(“name”,“张三”)😭“age”,“18”);
6.redis==>NOSQL(非关系型数据库)解决三高问题
- High Performance --高并发读写需求(上万条估计可以,写数据硬盘的IO顶不住)
- Huge Storage --海量数据的高效率存储和访问需求(从千万条数据中查询一条数据)
- High Scalability && High Availability --高可扩展性和高可用性的需求(对关系型数据库升级以及扩展,关系型数据库需要停机维护和数据迁移, 非关系型数据库只需要添加服务器节点即可)
7.Redis的数据类型
-
5种数据类型 key不要超过1024;不要太短,降低可读性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tpk6Q6uQ-1598533360217)(D:/作业/笔记/Redis支持的键值数据类型.png)]
-
字符串类型String
- 以二进制保存,不编码,不解码;存入字符串,整数,浮点类型都会以字符串写入; redis中String类型的Value最多可以容纳512M
- 常用命令 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dKhVrNVE-1598533360219)(D:/作业/笔记/String类型的常用命令png.png)]
-
哈希类型
- String类型的键; String的值Map容器 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BMxSPqyR-1598533360220)(D:/作业/笔记/哈希类型的存储结构.png)]
- 常用命令 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-53wf11JR-1598533360222)(D:/作业/笔记/String类型的常用命令png-1598455920641.png)]
- eg: hset xiaoming username xiaoming(存入一条key为小明的value为username:小明的Map)
-
列表类型 list
- 按照插入顺序排序的字符串链表,可以在链表的左边(left)或右边(right)添加元素
- 插入时,若该键不存在,redsi会为该键创建一个新链表
- 若这个键存在,则是向list添加元素
- list中可以包含最大元素数量是40亿个
- list中元素可重复,有序
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P4MVqh0U-1598533360227)(D:/作业/笔记/list结构的常用命令.png)]
-
集合类型 set
- set集合没有排序的字符集合
- 最大元素个数是40亿个 无序
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pRlHFBMp-1598533360228)(D:/作业/笔记/set集合的常用命令.png)]
-
有序集合zset
- 有序集合亦是无序不可重复
- 但是每个元素都会关联一个分数(score)
- 通过分数为集合中的成员进行从小到大拍讯
- 有序集合的成员是唯一的,但分数(score)是可以重复的,每个集合可以存储40多亿个成员
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iDSjJTWX-1598533360229)(D:/作业/笔记/zset有序集合.png)]
8.redis的通用命令
二.RDB持久化机制
1.优点
- 方便备份与恢复
- 只有一个dump.rdb文件,可以轻松的将文件压缩转到其他机制上,系统出现故障,可以进行恢复
- 性能最大化
- 持久化时,由子进程完成持久化,避免服务进程执行IO操作
- 启动效率高
- 与AOF比较,RDB效率高
2.缺点:
- 不能完全避免数据丢失
- 每隔一段时间进行持久化,可以根据.conf配置文件设置
- 一旦在持久化前系统宕机,数据会丢失
- 导致服务器暂停
- RDB是根据子进程来协助完成持久化工作,当数据量大时,可能会出现服务器停止服务几百毫秒,建议夜深人静进行持久化
三.AOF持久化机制
1.优点
- 格式清晰,易于理解的日志文件;所有持久化操作都是异步完成: 三种持久化操作(每秒同步;每修改一次同步一次;不同步)
2.缺点
- 文件比RDB大
- 效率比RDB慢
3.配置
-
开启AOF持久化
-
默认是关闭的
-
四.AOF重写
-
解决AOF文件体积膨胀;太多冗余的命令
- 创建一个新的AOF文件,保存数据库的状态是相同的,但是新的AOF文件不会浪费资源空间给冗余命令
-
实现原理
-
不需要对原AOF文件进行任何读取,写入,分析等操作,需要通过读取数据库状态来实现
-
通过读取数据库键现在的值,用一条命令去存储键值对,代替之前多个键值对的多个命令
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KyLYdnkJ-1598533360232)(D:/作业/笔记/image-20200827205033146.png)]
-
AOF重写的话就是用一条RPUSH list “C” “D” “E” “F” "G"代替前面的 6 条命令。
-
-
AOF重写触发的方式
- 重写概述: aof_rewrite函数可以创建新的AOF文件,但会进行大量的写入操作,因此调用这个函数时线程会长时间阻塞,所以放到子进程(后台)进行
- 手动触发: 用户通过调用bgrewriteaof手动触发
- 自动触发: 服务器周期性操作函数执行时,会检查以下条件是否满足,若全部满足,就自动执行AOF重写操作
- 条件1: 没有RDB/AOF 在执行,没有bgrewriteaof在进行
- 条件2: 当前的AOF文件大小大于redis.conf配置的 auto-aof-rewrite-min-size 大小
- 条件3: 当前AOF大小和最后一次重写后的大小之间的比率或者等于指定的增长百分比(在配置文件 auto-aof-rewrite-precentage 参数,不设置默认为100% )