redis是最常用的缓存数据库,常用于存储用户登录token、临时数据、定时相关数据等。

redis是单线程的,所以redis的操作是原子性的,这样可以保证不会出现并发问题。

redis基于内存,速度非常快,据测试,redis读的速度是110000次/s,写的速度是81000次/s

本节介绍SpringBoot引入redis,以及使用RedisTemplate来操作redis数据。

采用SpringBoot 2.1.9.RELEASE,对应示例代码在:https://github.com/laolunsi/spring-boot-examples

一、A Simple Demo-使用SpringBoot连接redis

maven:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

yml:

server:port: 8867
spring:redis:host: localhostport: 6379#password: ''database: 6

测试类:

@SpringBootTest
@RunWith(SpringRunner.class)
public class RedisTest {@Autowiredprivate RedisTemplate redisTemplate;@Testpublic void testRedis() {String key = "hello";redisTemplate.opsForValue().set("hello", "你好");String res = (String) redisTemplate.opsForValue().get(key);System.out.println(res);}
}

执行结果:

看一下redis:

这里存在一个问题:默认的存储方式导致key在redis-manager里面显示出来是乱码的,并且存储结果是二进制了。这样不利用我们查看redis里面的数据。

我们需要自定义redis存储的序列化规则。

二、解决RedisTemplate默认序列化的问题

完善一下maven:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

定义RedisConfig类:

/*** redis配置* 主要是配置Redis的序列化规则,替换默认的jdkSerializer* key的序列化规则用StringRedisSerializer* value的序列化规则用Jackson2JsonRedisSerializer*/
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(connectionFactory);// 使用Jackson2JsonRedisSerialize替换默认序列化Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);// 设置key和value的序列化规则redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}
}

删除之前的key,重新执行一下test方法:

下面来演示一下SpringBoot使用RedisTemplate进行redis数据的操作

三、基于SpringBoot的redis操作——key/list/hash

RedisTemplate内置redis操作如下:

这里主要展示value/hash/list三种用法:

3.1 RedisTemplate.opsForValue

  @Testpublic void testKeyOps() {// 测试redis操作key-value形式Set<String> keySet = new HashSet<>();String key1 = "name";keySet.add(key1);// 存储简单的key-value,并设置过期时间redisTemplate.opsForValue().set(key1, "eknown", 1, TimeUnit.MINUTES);String key2 = "token:user1";String key3 = "token:user2";keySet.add(key2);keySet.add(key3);//redisTemplate.opsForValue().set(key2, "{"name":"eknown"}, "role":"admin"");redisTemplate.opsForValue().set(key3, "{"name":"test"}, "role":"test"");// 根据key的集合获取多个valueList<String> valueList = redisTemplate.opsForValue().multiGet(keySet);for (String value : valueList) {System.out.println(value);}}

执行结果:

redis中的数据:

redis中的key显示出了一个层级关系,这个小技巧对于实际项目有个非常好的作用:通过prefix:suffix这样的形式,可以将redis中存储的数据分出层级。

3.2 RedisTemplate.opsForHash

清空该database下的数据,测试redisTemplate.opsForHash:

    @Testpublic void testHashOps() {String key = "hash";// 单次往hash中存放一个数据redisTemplate.opsForHash().put(key, "1", "你好");Map<String, Object> map = new HashMap<>();map.put("2", "hello");map.put("3a", "china1=2");// 一次性向hash中存放一个mapredisTemplate.opsForHash().putAll(key, map);// 获取hash下的所有key和valueMap<String, Object> resultMap = redisTemplate.opsForHash().entries(key);for (String hashKey : resultMap.keySet()) {System.out.println(hashKey + ": " + resultMap.get(hashKey));}}

执行结果:

redis:

3.3 RedisTemplate.opsForList

    @Testpublic void testListOps() {String listKey = "list";redisTemplate.opsForList().leftPush(listKey, "first value"); // 从list最左边插入数据redisTemplate.opsForList().leftPush(listKey, "second value but left");redisTemplate.opsForList().rightPush(listKey, 3); // 从list最右边插入数据List<Object> list = new ArrayList<>();list.add("hello");list.add("http://www.eknown.cn");list.add(23344);list.add(false);redisTemplate.opsForList().rightPushAll(listKey, list); // 从list右边批量插入数据long size = redisTemplate.opsForList().size(listKey);if (size > 0) {for (int i = 0; i < size -1 ; i++) {// 从list最左边开始读取list中的数据,注意pop会导致出栈,也就是数据被取出来了(redis中就没有这个值了)// 此处我们读取size-1条数据,仅留下最后一条数据System.out.println(i + ":" + redisTemplate.opsForList().leftPop(listKey).toString());}}}

执行上面的脚本,注意在最后的读取list数据代码前面加一个断点,此时redis中是这样的:

放开断点,程序继续执行,控制台如下:

注意,此时redis中仅剩余最后一条数据,这是由于pop的问题,list中的数据被读取并删除了:

好了,这一节主要讲了SpringBoot引入redis,以及使用redis的一些基本操作和相关技巧,在此基础上,我们可以让我们的项目变得更加快速、灵活!


交流学习

我的个人网站:http://www.eknown.cn

Git仓库地址:https://github.com/laolunsi

另外也欢迎大家关注我的公众号:猿生物语,一起学习Java/SpringBoot/SpringCloud技术。

redis序列化_SpringBoot整合redis相关推荐

  1. 不要再找了,Java操作Redis、Spring整合Redis及SpringBoot整合Redis这里都有

    文章开始之前先抛出一个问题:Jedis.Lettuce.Redisson以及RedisTemplate几者之间有什么区别,又有什么联系? 如果你心中已经很清晰的有了答案,那么本文你可以很轻松的阅读过去 ...

  2. redis 连接池_SpringBoot整合redis

    闲来没事,把之前自己搭建的SpringBoot集成Redis整理了一下,相信网上有很多,我只是写一下搭建的文章,能帮到就好,不能帮助,也是自己整理的文档罢了.文章开始: 开发工具用的IDEA 2018 ...

  3. redis缓存原理与实现_SpringBoot整合Redis缓存,手把手教你一步一步实现

    推荐学习 分布式大全:反向代理/Redis/中间件/MySQL/消息,挑战阿里P7必备 都是"Redis惹的祸",害我差点挂在美团三面,真是"虚惊一场" 微服务 ...

  4. Linux中部署Redis及SpringBoot整合Redis

    一.Linux下安装Redis 1.官网下载安装包 redis-6.2.0.tar.gz 2.程序一般放在/opt目录下,将安装包移动到/opt目录下 mv redis-6.2.0.tar.gz /o ...

  5. @primary注解_springboot整合redis分别实现手动缓存和注解缓存

    一.前期准备 1.一个构建好的springboot系统2.下载redis安装包,去redis官网下载3.启动redis服务,windows下双击bin目录下的redis-service.exe 二.环 ...

  6. nodejs redis 发布订阅_SpringBoot整合Redis,怎么实现发布/订阅?

    一.简介 1.发布订阅 SUBSCRIBE, UNSUBSCRIBE 和 PUBLISH 实现了 发布/订阅消息范例,发送者 (publishers) 不用编程就可以向特定的接受者发送消息 (subs ...

  7. ssm整合redis和mysql_ssm整合redis - 开源中国首席碉堡了的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.首先你的有个SSM工程 二.添加引用 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache. ...

  8. 8分钟带你学会SpringBoot整合Redis来实现缓存技术

    1.概述 随着互联网技术的发展,对技术要求也越来越高,所以在当期情况下项目的开发中对数据访问的效率也有了很高的要求,所以在项目开发中缓存技术使用的也越来越多,因为它可以极大的提高系统的访问速度,关于缓 ...

  9. redis序列化_实例讲解Springboot以Template方式整合Redis及序列化问题

    1 简介 之前讲过如何通过Docker安装Redis,也讲了Springboot以Repository方式整合Redis,建议阅读后再看本文效果更佳: (1) Docker安装Redis并介绍漂亮的可 ...

最新文章

  1. JavaScript最全编码规范
  2. linux内核调度,Linux内核的三种调度策略
  3. Maven - error in opening zip file
  4. 一元多项式的乘法与加法运算_如果加法变成【乘法】 , 那么什么能变成【加法】 ? ——记一则函数方程...
  5. 40多套在线教育平台系统网站源码知识付费源程序网上教育
  6. vue全屏组件vue-fullscreen使用
  7. appliedzkp的zkevm(7)定制化Proof System
  8. 推荐9个能让你看一天的网站
  9. MFC利用CPen与CBrush绘制实心圆
  10. 基于CentOS 6.10的Oracle 11g RAC安装手册
  11. 【Numpy】1. n维数组,dtype,切片,索引
  12. linux 更新系统时间
  13. 深度学习之文本生成图片
  14. 辟邪剑法之字符串常用API
  15. Tomcat使用过滤器实现页面的限制访问,登录才能访问受限页面
  16. scala集合算子大全及分类汇总——倾心整理
  17. 地区数据erea.js
  18. linux系统发qq邮箱文件,Linux打印文件和发送邮件
  19. CMake I add_custom_command命令详解(构建)
  20. 计算机网络脆弱性评估技术研究

热门文章

  1. php获取外部URL,使用PHP从外部API / URL获取信息
  2. springboot2整合mysql5_SpringBoot2整合SSM框架详解
  3. 线程 协程 python_在Python 的线程中运行协程的方法
  4. OpenCV绘图和注释
  5. LeetCode题——最长无重复子串
  6. 吴恩达斯坦福大学机器学习 CS229 课程学习笔记(一)
  7. 全能终端神器 --- MobaXterm 、开启 linux 远程桌面
  8. 掌控谈话~让对方说“不”
  9. 用法 stl_C++STL 容器篇
  10. 天池CV学习赛:街景字符识别-思路与上分技巧汇总