1. Setup Heroku RedisConnectionFactory Configuration
2. Setup RedisTemplate Configuration
3. Setup Redis Service
4. Setup Redis Controller
1. Setup Heroku RedisConnectionFactory Configuration
package com.example.redis; import java.net.URI; import java.net.URISyntaxException; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import redis.clients.jedis.Protocol; @Configuration @Profile("default") public class LocalRedisConfiguration { @Bean public RedisConnectionFactory redisConnectionFactory() { try { URI redisUri = new URI(System.getenv("REDISCLOUD_URL")); JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory(); redisConnectionFactory.setHostName(redisUri.getHost()); redisConnectionFactory.setPort(redisUri.getPort()); redisConnectionFactory.setTimeout(Protocol.DEFAULT_TIMEOUT); redisConnectionFactory.setPassword(redisUri.getUserInfo().split(":",2)[1]); return redisConnectionFactory; } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } }
2. Setup RedisTemplate Configuration
package com.example.redis; import javax.inject.Inject; import org.springframework.context.annotation.*; import org.springframework.core.task.TaskExecutor; import org.springframework.data.redis.connection.*; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.listener.*; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Configuration @Import({LocalRedisConfiguration.class}) public class RedisConfiguration { @Inject private RedisConnectionFactory redisConnectionFactory; @Bean public Topic topic() { return new ChannelTopic("pubsub:customer"); } @Bean public RedisMessageListenerContainer redisMessageListenerContainer(Topic topic, RedisConnectionFactory redisConnectionFactory, TaskExecutor taskExecutor) { RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer(); redisMessageListenerContainer.setTaskExecutor(taskExecutor); redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory); redisMessageListenerContainer.addMessageListener(new MessageListener() { @Override public void onMessage(Message message, byte[] pattern) { System.out.println("Received notification " + new String(message.getBody()) + "."); System.out.println(new String(pattern)); } }, topic); return redisMessageListenerContainer; } @Bean public TaskExecutor taskExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setQueueCapacity(1); taskExecutor.setCorePoolSize(10); return taskExecutor; } @Bean public RedisTemplate<String, Object> redisTemplate() throws Exception { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); redisTemplate.setConnectionFactory(redisConnectionFactory); return redisTemplate; } }
3. Setup Redis Service
package com.example.redis; import com.example.service.CustomerService; import com.example.model.Customer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.math.BigInteger; import java.util.*; @Service public class RedisCustomerService implements CustomerService { @Autowired private RedisTemplate<String, Object> redisTemplate; private String uniqueIdKey = "customerId"; private BigInteger uniqueId() { long uniqueId = this.redisTemplate.opsForValue().increment(uniqueIdKey, 1); return BigInteger.valueOf(uniqueId); } private String lastNameKey(BigInteger id) { return "customer:ln:" + id; } private String firstNameKey(BigInteger id) { return "customer:fn:" + id; } public Collection<Customer> loadAllCustomers() { String keyPattern = "customer:fn:*"; Set<String> keys = redisTemplate.keys(keyPattern); Set<Customer> customerSet = new HashSet<Customer>(); for (String firstNameKey : keys) { long id = Long.parseLong(firstNameKey.split(":")[2]); customerSet.add(this.getCustomerById(BigInteger.valueOf(id))); } return customerSet; } @Override public Customer updateCustomer(BigInteger id, String fn, String ln) { this.redisTemplate.opsForValue().set(lastNameKey(id), ln); this.redisTemplate.opsForValue().set(firstNameKey(id), fn); return getCustomerById(id); } @Override public List<Customer> updateCustomers(List<Customer> customersToUpdate) { // TODO Auto-generated method stub return null; } @Override public Customer getCustomerById(BigInteger id) { String ln = (String) this.redisTemplate.opsForValue().get(lastNameKey(id)); String fn = (String) this.redisTemplate.opsForValue().get(firstNameKey(id)); return new Customer(id, fn, ln); } @Override public Collection<Customer> getAllCustomers() { String keyPattern = "customer:fn:*"; Set<String> keys = redisTemplate.keys(keyPattern); Set<Customer> customerSet = new HashSet<Customer>(); for (String firstNameKey : keys) { long id = Long.parseLong(firstNameKey.split(":")[2]); customerSet.add(this.getCustomerById(BigInteger.valueOf(id))); } return customerSet; } @Override public void deleteCustomer(BigInteger id) { redisTemplate.opsForValue().getOperations().delete(String.valueOf(id)); } @Override public int getTotalRecords() { return redisTemplate.keys("customer:fn:*").size(); } private void setCustomerValues(BigInteger lid, String fn, String ln) { this.redisTemplate.opsForValue().set(lastNameKey(lid), ln); this.redisTemplate.opsForValue().set(firstNameKey(lid), fn); } @Override public Customer createCustomer(String fn, String ln) { BigInteger lid = uniqueId(); setCustomerValues(lid, fn, ln); return getCustomerById(lid); } }
4. Setup Redis Controller
package com.example.controller; import java.math.BigInteger; import java.util.Arrays; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import com.example.redis.RedisCustomerService; @Controller @RequestMapping("/redis") public class RedisController { @Autowired RedisCustomerService redisCustomerService; @RequestMapping("") public String redisView(Map<String, Object> map){ map.put("redisCustomerList", redisCustomerService.getAllCustomers()); return "redis"; } @RequestMapping(value="/insert") public String insertCustomersView(){ return "insertredis"; } @RequestMapping(value="/insert", method=RequestMethod.POST) public String insertCustomers(Map<String, Object> map, @RequestParam("firstName") String firstName, @RequestParam("lastName") String lastName) { redisCustomerService.createCustomer(firstName, lastName); return "redis"; } @RequestMapping(value="/delete/{id}", method=RequestMethod.POST) public String deleteCustomer(@PathVariable("id") String id, Map<String, Object> map){ redisCustomerService.deleteCustomer(new BigInteger(id)); map.put("redisCustomerList", redisCustomerService.getAllCustomers()); return "redis"; } @RequestMapping(value="/update/{id}", method=RequestMethod.GET) public String updateCustomerView(@PathVariable("id") String id, Map<String, Object> map){ map.put("redisupdate", Arrays.asList(redisCustomerService.getCustomerById(new BigInteger(id)))); return "updateredis"; } @RequestMapping(value="/update/{id}", method=RequestMethod.POST) public String updateCustomer(@PathVariable("id") String id, Map<String, Object> map, @RequestParam("firstName") String firstName, @RequestParam("lastName") String lastName){ redisCustomerService.updateCustomer(new BigInteger(id), firstName, lastName); map.put("redisCustomerList", redisCustomerService.getAllCustomers()); return "redis"; } }