赞
踩
“收藏从未停止,练习从未开始”,或许有那么一些好题好方法,在被你选中收藏后却遗忘在收藏夹里积起了灰?今天请务必打开你沉甸甸的收藏重新回顾,分享一下那些曾让你拍案叫绝的好东西吧!
一、什么是redis缓存
Redis缓存是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
二、redis缓存的优缺点
优点:
一句话:
加快了响应速度,减少了对数据库的读操作,数据库的压力降低。
缺点:
一句话:
三、为什么使用redis缓存
使用redis作为缓存可以减少数据库的压力,特别是需要频繁查询大量数据的情形下。使用redis还可以提高访问速度,因为redis的数据会被保存在内存中。
四、redis支持的数据类型
字符串(string)
哈希表(hash)
列表(list)
集合(set)
有序集合(zset)
为了保证读取效率,Redis 把数据对象存储在内存中,并支持周期性的把更新的数据写入磁盘文件中。而且它还提供了交集和并集,以及一些不同方式排序的操作。
redis的特性决定了它的功能,它可以用来做以下这些事情!
排行榜,利用zset可以方便的实现排序功能
计数器,利用redis中原子性的自增操作,可以统计到阅读量,点赞量等功能
简单消息队列,list存储结构,满足先进先出的原则,可以使用lpush/rpop或rpush/lpop实现简单消息队列
session共享,分布式系统中,可以利用redis实现session共享。spring官方提供的分布式解决方案Spring Session就是利用redis 实现的。
五、springboot整合redis
1、引入依赖
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-redis</artifactId>
- </dependency>
2、springboot启动类增加注解@EnableCaching,开启缓存功能,如下:
- /**
- *服务启动类
-
- */
- @SpringBootApplication(scanBasePackages = {"cn.xxx.common.redis","cn.xxx.task.*"})
- @EnableEurekaClient
- @EnableApolloConfig
- @EnableFeignClients
- @EnableDiscoveryClient
- @EnableTransactionManagement
- @MapperScan("cn.xxx.task.dao")
- @EnableScheduling
- @Transactional
- @EnableCaching
- public class TaskApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(TaskApplication.class,args);
- }
-
- /**
- * 替换原生Decoder解析器,支持text/plain
- * @return
- */
- @Bean
- public Decoder feignDecoder(){
- WxMessageConverter wxConverter = new WxMessageConverter();
- ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(wxConverter);
- return new SpringDecoder(objectFactory);
- }
-
- }

3、配置redis连接信息
spring: redis: # redis库 database: 0 # redis 服务器地址 host: localhost # redis 端口号 port: 6379 # redis 密码 password: # 连接超时时间(毫秒) timeout: 1000 lettuce: pool: # 连接池最大链接数(负数表示没有限制) max-active: 8 # 连接池最大阻塞等待时间(负数表示没有限制) max-wait: -1 # 连接池最大空闲连接数 max-idle: 8 # 连接池最小空闲连接数 min-idle: 0
六、使用注解的方式使用redis缓存(重点内容)
1. 注解说明
@CacheConfig: 一般配置在类上,指定缓存名称,这个名称是和上面“置缓存管理器”中缓存名称的一致。
@Cacheable: 用于对方法返回结果进行缓存,如果已经存在该缓存,则直接从缓存中获取,缓存的key可以从入参中指定,缓存的 value 为方法返回值。
@CachePut: 无论是否存在该缓存,每次都会重新添加缓存,缓存的key可以从入参中指定,缓存的value为方法返回值,常用作于更新。
@CacheEvict: 用于清除缓存
@Caching: 用于一次性设置多个缓存。
2. 常用注解配置参数
value: 缓存管理器中配置的缓存的名称,这里可以理解为一个组的概念,缓存管理器中可以有多套缓存配置,每套都有一个名称,类似于组名,这个可以配置这个值,选择使用哪个缓存的名称,配置后就会应用那个缓存名称对应的配置。
key: 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合。
condition: 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存。
unless: 不缓存的条件,和 condition 一样,也是 SpEL 编写,返回 true 或者 false,为 true 时则不进行缓存。
3. 自动缓存
@Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。
如果添加了@Cacheable注解,那么方法被调用后,值会被存入redis,下次再调用的时候会直接从redis中取值返回。
- @Service
- @CacheConfig(cacheNames = "user")
- public class UserService {
-
- @Autowired
- private UserMapper userMapper;
-
- // 获取全部用户
- @Cacheable(key = "'allUsers'", unless = "#result==null")
- public List<Courses> findAll() {
- return userMapper.allUsers();
- }
- }
- /**
- * 登录用户信息缓存(部分,脱敏处理)
- * @param mUser
- * @return
- */
- @CachePut(value = "member", key = "'userinfo:' + #mUser.userId")
- public Map<String, Object> loginUserInfo(MUser mUser) {
- // 手机号加*处理
- String starPhone = PhoneUtil.star(mUser.getPhone());
- Map<String, Object> resMap = new HashMap<>();
- resMap.put("purePhoneNumber", starPhone);
- resMap.put("nickName", mUser.getUserName());
- resMap.put("avatarUrl", mUser.getHeadIcon());
- resMap.put("countryCode", mUser.getCountryCode());
- // resMap.put("resToken", resToken);
- resMap.put("wxAccount", mUser.getWxAccount());
- resMap.put("sex", mUser.getSex());
- resMap.put("sexName", mUser.getSexName());
- resMap.put("userState", mUser.getUserState());
- resMap.put("userStateName", mUser.getUserStateName());
- resMap.put("channelId", mUser.getChannelId());
- resMap.put("channelName", mUser.getChannelName());
- return resMap;
- }
-
- /**
- * 内部员工缓存信息
- * @param phone
- * @param status
- * @param b
- * @param messge
- * @return
- */
- @CachePut(value = "member#PT5M", key = "'employee:' + #phone")
- public Map<String, Object> employee(String phone,String status , boolean b ,String messge ) {
- Map<String, Object> resMap = new HashMap<>();
- resMap.put("phone", phone);
- resMap.put("status", status);
- resMap.put("flag", b);
- resMap.put("messge",messge);
- return resMap;
- }
-
- /**
- * 是否是内部员工缓存
- * @param phone
- * @return
- */
- @Cacheable(value = "member", key = "'employee:' + #phone")
- public Map<String, Object> getEmployee(String phone) {
- return null;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。