将redis整合到项目查询中:(在service中)
- 1、缓存的简单设计:
- 连接缓存
- 查询缓存
- 缓存中没有,查询sql
- sql查询到的数据存入redis
- redis的整合步奏
- 设计数据存储策略
- 数据对象名key设计:数据对象id:对象属性(user(表):wz(主键id):password)
- 加入一个redis的工厂单例bean,
- 写一个reids工具类,用来将redis的池初始化到spring容器中
- 写一个spring整合redis的配置类:将redis的连接池创建到spring容器中
- 设计数据存储策略
- 缓存在高并发和安全压力下的问题:
- 缓存穿透:查询一个数据库中不存在的数据,比如商品详情,查询一个不存在的ID,每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成过大地压力。
- 解决方案:
- 1.当通过某一个key去查询数据的时候,如果对应在数据库中的数据都不存在,我们将此key对应的value设置为一个默认的值,比如“NULL”,并设置一个缓存的短暂的过期时间,这时在缓存失效之前,所有通过此key的访问都被缓存挡住了。后面如果此key对应的数据在DB中存在时,缓存失效之后,通过此key再去访问数据,就能拿到新的value了。
- 2.常见的则是采用布隆过滤器(可以用很小的内存保留很多的数据),将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。(布隆过滤器:实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。)
- 解决方案:
- 缓存雪崩:缓存中集体key失效,
- 解决:在原有的失效时间上加一个随机值,这样每一个缓存的失效时间的重复率降低,很难引起集体失效
- 缓存击穿:缓存的热点key失效,导致大量的sql访问db,
- 解决:使用redis数据库的分布式锁,解局mysql的压力问题
- 1、redis自带的分布式锁,set ex nx
- set nx :当key不存在的时候,才能成功。当多个请求同时请求redis的时候,只会有1个请求set成功,其他请求返回nil。等待过期时间结束,其他请求才能set
- 2、redisson框架(NIO):一个redis的juc的实现,既有jedis的功能,又有juc的lock功能的客户端实
- 将redis整合到项目查询中:(在service中)
- 1、缓存的简单设计:
- 连接缓存
- 查询缓存
- 缓存中没有,查询sql
- sql查询到的数据存入redis
- redis的整合步奏
- 设计数据存储策略
- 数据对象名key设计:数据对象id:对象属性(user(表):wz(主键id):password)
- 加入一个redis的工厂单例bean,
- 写一个reids工具类,用来将redis的池初始化到spring容器中
- 写一个spring整合redis的配置类:将redis的连接池创建到spring容器中
- 设计数据存储策略
- 缓存在高并发和安全压力下的问题:
- 缓存穿透:查询一个数据库中不存在的数据,比如商品详情,查询一个不存在的ID,每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成过大地压力。
- 解决方案:
- 1.当通过某一个key去查询数据的时候,如果对应在数据库中的数据都不存在,我们将此key对应的value设置为一个默认的值,比如“NULL”,并设置一个缓存的短暂的过期时间,这时在缓存失效之前,所有通过此key的访问都被缓存挡住了。后面如果此key对应的数据在DB中存在时,缓存失效之后,通过此key再去访问数据,就能拿到新的value了。
- 2.常见的则是采用布隆过滤器(可以用很小的内存保留很多的数据),将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。(布隆过滤器:实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。)
- 解决方案:
- 缓存雪崩:缓存中集体key失效,
- 解决:在原有的失效时间上加一个随机值,这样每一个缓存的失效时间的重复率降低,很难引起集体失效
- 缓存击穿:缓存的热点key失效,导致大量的sql访问db,
- 解决:使用redis数据库的分布式锁,解局mysql的压力问题
- 1、redis自带的分布式锁,set ex nx
- set nx :当key不存在的时候,才能成功。当多个请求同时请求redis的时候,只会有1个请求set成功,其他请求返回nil。等待过期时间结束,其他请求才能set
- 2、redisson框架(NIO):一个redis的juc的实现,既有jedis的功能,又有juc的lock功能的客户端实现
- 1、redis自带的分布式锁,set ex nx
- 解决:使用redis数据库的分布式锁,解局mysql的压力问题
- 缓存穿透:查询一个数据库中不存在的数据,比如商品详情,查询一个不存在的ID,每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成过大地压力。
- 1、redis自带的分布式锁,set ex nx
- 解决:使用redis数据库的分布式锁,解局mysql的压力问题
- 缓存穿透:查询一个数据库中不存在的数据,比如商品详情,查询一个不存在的ID,每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成过大地压力。