个人学习笔记分享,当前能力有限,请勿贬低,菜鸟互学,大佬绕道
如有勘误,欢迎指出和讨论,本文后期也会进行修正和补充
前言
通常数据存储在两个位置:数据库&缓存.
然而对于使用频率较高的数据,频繁请求数据库的代价过于昂贵,而自带的缓存机制又过于简陋,这时候第三方服务redis就出现了。
redis完美解决了这些问题,能够快速的进行数据存取,可以将高频率的数据存于redis,不用再去麻烦数据库了,同时还完美契合了消息队列的实现方案。
因而在大小项目中redis都成为了一个必要的组件。
1.介绍
- redis是最常用的缓存数据库,常用于存储用户登录token、临时数据、定时相关数据等。
- redis使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
- redis是单线程的,所以redis的操作是原子性的,这样可以保证不会出现并发问题
- redis基于内存,速度非常快,据测试,redis读的速度是110000次/s,写的速度是81000次/s
- redis也可用于消息队列或任何短期数据
2.集成
-
安装redis服务
官网https://redis.io/
-
windows环境:
- 从官网直接下载redis后
- 运行
redis-server
启动服务
请注意不要关闭窗口,否则将redis关闭服务
-
Linux环境:
-
通过工具上传或者直接下载redis压缩包到服务器,请到官网获取下载地址
-
解压
tar xzvf redis-4.0.8.tar.gz
-
进入目录后,编译
make
-
安装
make install PREFIX=/usr/local/redis
,路径请视情况更改若安装失败,请先安装gcc,命令为
yum -y install gcc automake autoconf libtool make
-
启动服务
./redis-server
-
上述仅给出了前端部署方法,自定义配置和后台部署请自行查阅相关资料,懒得话就直接找传送门好啦~
-
-
添加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.3.2.RELEASE</version> </dependency>
-
添加默认配置
-
创建配置文件:示例如下,自定义配置暂不做赘述,有兴趣的可以找传送门
@Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { @Bean public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { RedisCacheConfiguration configuration = RedisCacheConfiguration .defaultCacheConfig() .entryTtl(Duration.ofMinutes(30)) .disableCachingNullValues(); return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(configuration).build(); } @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<Object, Object> template = new RedisTemplate<>(); // 配置连接工厂 template.setConnectionFactory(factory); //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 om.activateDefaultTyping( LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY); jacksonSeial.setObjectMapper(om); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(jacksonSeial); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(jacksonSeial); template.afterPropertiesSet(); return template; } }
3.使用
-
初始化redisTemplate
private final RedisTemplate redisTemplate; public TestController(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; }
此处可以指定数据类型,如
private final RedisTemplate<String, String> redisTemplate;
,若不指定类型,则以json格式存取,通过其他格式存取会报错 -
存取,示例如下
@ApiOperation("存储redis") @GetMapping("/saveRedis") @ResponseBody public ReturnMsg saveRedis(String key, String value) throws Exception { redisTemplate.opsForValue().set(key, value); return ReturnMsg.success(); } @ApiOperation("读取redis") @GetMapping("/getRedis") @ResponseBody public ReturnMsg getRedis(String key) throws Exception { if (redisTemplate.opsForValue().getOperations().hasKey(key)) { return ReturnMsg.success(redisTemplate.opsForValue().get(key)); } return ReturnMsg.error(); }
4.相关操作
-
存储:
redisTemplate.opsForValue().set(key, value)
redisTemplate.boundValueOps(key).set(value)
-
取出:
redisTemplate.opsForValue().get(key)
(String) redisTemplate.boundValueOps(key).get()
-
设定有效时间:
redisTemplate.expire(key, 2000, TimeUnit.SECONDS);
设置key的缓存有效时间为2000秒
-
其他:算了,懒得枚举了,给个示例算了。。。
//向redis里存入数据和设置缓存时间 stringRedisTemplate.opsForValue().set("baike", "100", 60 * 10, TimeUnit.SECONDS); //val做-1操作 stringRedisTemplate.boundValueOps("baike").increment(-1); //根据key获取缓存中的val stringRedisTemplate.opsForValue().get("baike") //val +1 stringRedisTemplate.boundValueOps("baike").increment(1); //根据key获取过期时间 stringRedisTemplate.getExpire("baike"); //根据key获取过期时间并换算成指定单位 stringRedisTemplate.getExpire("baike",TimeUnit.SECONDS); //根据key删除缓存 stringRedisTemplate.delete("baike"); //检查key是否存在,返回boolean值 stringRedisTemplate.hasKey("baike"); //向指定key中存放set集合 stringRedisTemplate.opsForSet().add("baike", "1","2","3"); //设置过期时间 stringRedisTemplate.expire("baike",1000 , TimeUnit.MILLISECONDS); //根据key查看集合中是否存在指定数据 stringRedisTemplate.opsForSet().isMember("baike", "1"); //根据key获取set集合 stringRedisTemplate.opsForSet().members("baike"); //验证有效时间 Long expire = redisTemplate.boundHashOps("baike").getExpire(); System.out.println("redis有效时间:"+expire+"S");
5.传送门
RedisTemplate配置的jackson.ObjectMapper
BB两句
虽然上述已经满足很多项目的需求,但实际上redis能做的事情远不止这些,慢慢学吧。
如此小的一个组件,能完成那么多功能,其实挺神奇的。。。
作者:Echo_Ye
WX:Echo_YeZ
email :echo_yezi@qq.com
个人站点:在搭了在搭了。。。(右键 - 新建文件夹)