前言:上一篇文章我们用的是StringRedisTemplate,但是它存在一点问题,也迫使我重新写了代码,问题是:在我们往缓存中存入数字形式的String类型时,我们在利用Spring could将获取到的数据发送到另一服务时,我们发现数据已经被强转为Integer类型了,因为我们可能传输的数据庞大,类型多样,为了统一类型,以及开发方便,所以我将缓存改成RedisTemplate这种类型,进行增删改查的操作,文中没有特别举例更新操作,其更新操作与添加操作一样,当key一样时进行添加就会覆盖原value值,完成更新。RedisTemplate需要我们自己去配置它并进行实例化。接下来,举例子,上代码:
首先建立Spring boot项目添加Redis依赖
下载导入IDE,我们观察pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.test</groupId> <artifactId>redis</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>redis</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
1.配置application.properties
#redis spring.redis.host=主机地址 spring.redis.password=admin spring.redis.port=6379 spring.redis.timeout=10000 spring.redis.jedis.pool.max-idle=200 spring.redis.jedis.pool.min-idle=300000 spring.redis.jedis.pool.max-active=400 spring.redis.jedis.pool.max-wait=10000
2.我们写配置配置类实例化RedisTemplate
package com.test.redis.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.data.redis.connection.RedisConnectionFactory; @Configuration public class RedisConfig { /** * 实例化 RedisTemplate 对象 * * @return */ @Bean public RedisTemplate<String, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); initDomainRedisTemplate(redisTemplate, redisConnectionFactory); return redisTemplate; } /** * 设置数据存入 redis 的序列化方式,并开启事务 * * @param redisTemplate * @param factory */ private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) { // 如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to // String! redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // 开启事务 redisTemplate.setEnableTransactionSupport(true); redisTemplate.setConnectionFactory(factory); } }
3.写缓存操作的Service层,进行增删改查方法的定义:
package cn.com.dhcc.idatabus.admin.console.service; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import org.springframework.stereotype.Service; @Service public class RedisService { @Resource private RedisTemplate<String,Object> template; /** * 存储数据或修改数据 * * @param modelMap * @param mapName */ public void setKey(String mapName, Map<String, Object> modelMap) { HashOperations<String, String, Object> hps = template.opsForHash(); hps.putAll(mapName, modelMap); } /** * 获取数据Map * * @param mapName * @return */ public Map<String, Object> getMapValue(String mapName) { HashOperations<String, String, Object> hps = this.template.opsForHash(); return hps.entries(mapName); } /** * 获取数据value * * @param mapName * @param hashKey * @return */ public Object getValue(String mapName, String hashKey) { HashOperations<String, String, Object> hps = this.template.opsForHash(); return hps.get(mapName, hashKey); } /** * 批量删除缓存数据 * * @param keys */ public void deleteData(List<String> keys) { // 执行批量删除操作时先序列化template template.setKeySerializer(new JdkSerializationRedisSerializer()); template.delete(keys); } }
4.本次例子的实体类
package com.test.redis.entity; public class User { private Integer id; private String name; private String password; public User() { super(); } public User(Integer id, String name, String password) { super(); this.id = id; this.name = name; this.password = password; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", password=" + password + "]"; } }
5.编写Controller层,来实现缓存的操作
package com.test.redis.web; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.test.redis.entity.User; import com.test.redis.service.RedisService; @Controller public class UserController { private static final String mapName="mapName"; @Autowired private RedisService redisService; @GetMapping( "/templateAdd.do") @ResponseBody public Map<String, Object> addUser(HttpServletRequest request){ Map<String, Object> modelMap=new HashMap<String,Object>(); User user=new User(); user.setName("hehename"); user.setPassword("hehePassword"); //存放hash值 modelMap.put("name", user.getName()); modelMap.put("password", user.getPassword()); redisService.setKey(mapName, modelMap); //获取map集合 Map<String, Object> modelMap1= redisService.getMapValue(mapName); Object value= redisService.getValue(mapName, "name"); System.out.println(" value : "+value); modelMap1.put("从缓存中根据key取到的value", value); return modelMap1; } @GetMapping( "/templateDelete.do") @ResponseBody public Map<String, Object> deleteUser(HttpServletRequest request){ //获取即将删除的key值,这里我们做的批量删除 List<String> keys=new ArrayList<>(); keys.add("heheanme"); //开始执行删除操作 redisService.deleteData(keys); //获取map集合 Map<String, Object> modelMap1= redisService.getMapValue(mapName); Object value= redisService.getValue(mapName, "name"); System.out.println(" value : "+value); modelMap1.put("从缓存中根据key取到的value", value); return modelMap1; } }
接下来,我们访问Controller路径
(1) http://localhost:8081/templateAdd.do
结果:
(2) http://localhost:8081/templateDelete.do
结果: