Redis详解-SpringBoot整合Redis,RedisTemplate和注解两种
⽅式的使⽤
本⽂主要讲 Redis 的使⽤,如何与 SpringBoot 项⽬整合,如何使⽤注解⽅式和 RedisTemplate ⽅式实现缓存。最后会给⼀个⽤ Redis 实现分布式锁,⽤在秒杀系统中的案例。
⼀、NoSQL 概述
什么是 NoSQL ?
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是”,泛指⾮关系型的数据库。
为什么需要 NoSQL ?
随着互联⽹⽹站的兴起,传统的关系数据库在应付web2.0⽹站,特别是超⼤规模和⾼并发的类型的web2.0纯站已经显得⼒不从⼼,暴露了很多难以克服的问题,⽽⾮关系型的数据库则由于其本⾝的特点得到了⾮常迅速的发展。NoSQL数据库的产⽣就是为了解决⼤规模数据集合多重数据种类带来的挑战,尤其是⼤数据应⽤难题。 -- 百度百科
NoSQL 数据库的四⼤分类
键值(key-value)存储
列存储
⽂档数据库
图形数据库
分类相关产品典型应⽤数据模型优点缺点
键值(key-value)Tokyo、 Cabinet/Tyrant、
Redis、Voldemort、Berkeley
DB
内容缓存,主要⽤于处理
⼤量数据的⾼访问负载
⼀系列键值对快速查询存储的数据缺少结构化
列存储数据库Cassandra, HBase, Riak分布式的⽂件系统
以列簇式存储,将
同⼀列数据存在⼀
起
查速度快,可扩展性
强,更容易进⾏分布式
扩展
功能相对局限
⽂档数据库CouchDB, MongoDB Web应⽤(与Key-
Value类似,value是结
构化的)
⼀系列键值对数据结构要求不严格
查询性能不⾼,⽽且缺乏统⼀
的查询语法
图形(Graph)数据库Neo4J, InfoGrid, Infinite
Graph
社交⽹络,推荐系统等。
专注于构建关系图谱
图结构利⽤图结构相关算法
需要对整个图做计算才能得出
结果,不容易做分布式集⽅
案
NoSQL 的特点
易扩展
灵活的数据模型
⼤数据量,⾼性能
⾼可⽤
⼆、Redis 概述Redis的应⽤场景
缓存
任务队列
⽹站访问统计
应⽤排⾏榜
数据过期处理
分布式集架构中的 session 分离
Redis 安装
⽹上有很多 Redis 的安装教程,这⾥就不多说了,只说下 Docker 的安装⽅法:Docker 安装运⾏ Redis
docker run -d -p 6379:6379 redis:4.0.8
如果以后想启动 Redis 服务,打开命令⾏,输⼊以下命令即可。
redis-server
使⽤前先引⼊依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
三、注解⽅式使⽤ Redis 缓存
使⽤缓存有两个前置步骤
1. 在 l 引⼊依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. 在启动类上加注解 @EnableCaching
@SpringBootApplication
@EnableCaching
public class SellApplication {
public static void main(String[] args) {
SpringApplication.run(SellApplication.class, args);
}
}
常⽤的注解有以下⼏个
@Cacheable
属性如下图
⽤于查询和添加缓存,第⼀次查询的时候返回该⽅法返回值,并向 Redis 服务器保存数据。
以后调⽤该⽅法先从 Redis 中查是否有数据,如果有直接返回 Redis 缓存的数据,⽽不执⾏⽅法⾥的代码。如果没有则正常执⾏⽅法体中的代码。
value 或 cacheNames 属性做键,key 属性则可以看作为 value 的⼦键, ⼀个 value 可以有多个 key 组成不同值存在 Redis 服务器。
验证了下,value 和 cacheNames 的作⽤是⼀样的,都是标识主键。两个属性不能同时定义,只能定义⼀个,否则会报错。
condition 和 unless 是条件,后⾯会讲⽤法。其他的⼏个属性不常⽤,其实我也不知道怎么⽤…
@CachePut
更新 Redis 中对应键的值。属性和 @Cacheable 相同
@CacheEvict
删除 Redis 中对应键的值。
3.1 添加缓存
在需要加缓存的⽅法上添加注解 @Cacheable(cacheNames = "product", key = "123"),
cacheNames 和 key 都必须填,如果不填 key ,默认的 key 是当前的⽅法名,更新缓存时会因为⽅法名不同⽽更新失败。
如在订单列表上加缓存
@RequestMapping(value = "/list", method = RequestMethod.GET)
@Cacheable(cacheNames = "product", key = "123")
public ResultVO list() {
// 1.查询所有上架商品
List<ProductInfo> productInfoList = productInfoService.findUpAll();
// 2.查询类⽬(⼀次性查询)
//⽤ java8 的特性获取到上架商品的所有类型
List<Integer> categoryTypes = productInfoList.stream().map(e -> e.getCategoryType()).List()); List<ProductCategory> productCategoryList = categoryService.findByCategoryTypeIn(categoryTypes);
List<ProductVO> productVOList = new ArrayList<>();
//数据拼装
for (ProductCategory category : productCategoryList) {
ProductVO productVO = new ProductVO();
//属性拷贝
//把类型匹配的商品添加进去
List<ProductInfoVO> productInfoVOList = new ArrayList<>();
for (ProductInfo productInfo : productInfoList) {
if (CategoryType().CategoryType())) {
ProductInfoVO productInfoVO = new ProductInfoVO();
productInfoVOList.add(productInfoVO);
}
}
productVO.setProductInfoVOList(productInfoVOList);
productVOList.add(productVO);
}
return ResultVOUtils.success(productVOList);
}redis五种数据结构
可能会报如下错误
对象未序列化。让对象实现 Serializable ⽅法即可
@Data
public class ProductVO implements Serializable {
private static final long serialVersionUID = 961235512220891746L;
@JsonProperty("name")
private String categoryName;
@JsonProperty("type")
private Integer categoryType;
@JsonProperty("foods")
private List<ProductInfoVO> productInfoVOList ;
}
⽣成唯⼀的 id 在 IDEA ⾥有⼀个插件:GenerateSerialVersionUID ⽐较⽅便。
重启项⽬访问订单列表,在 rdm ⾥查看 Redis 缓存,有 product::123 说明缓存成功。
3.2 更新缓存
在需要更新缓存的⽅法上加注解: @CachePut(cacheNames = "prodcut", key = "123")
注意
1. cacheNames 和 key 要跟 @Cacheable() ⾥的⼀致,才会正确更新。
2. @CachePut() 和 @Cacheable() 注解的⽅法返回值要⼀致
3.3 删除缓存
在需要删除缓存的⽅法上加注解:@CacheEvict(cacheNames = "prodcut", key = "123"),执⾏完这个⽅法之后会将 Redis 中对应的记录删除。
3.4 其他常⽤功能
1. cacheNames 也可以统⼀写在类上⾯, @CacheConfig(cacheNames = "product") ,具体的⽅法上就不⽤写啦。
@CacheConfig(cacheNames = "product")
public class BuyerOrderController {
@PostMapping("/cancel")
@CachePut(key = "456")
public ResultVO cancel(@RequestParam("openid") String openid,
@RequestParam("orderId") String orderId){
buyerService.cancelOrder(openid, orderId);
return ResultVOUtils.success();
}
}
2. Key 也可以动态设置为⽅法的参数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论