# Redis ## Installing Redis using Docker `docker pull redis` `docker run -p 6379:6379 -d --name redis-cache redis ` **Note** : use the following command if you need to save configuration files in host server not in container: ` docker run -p 6379:6379 -d --name redis-cache -v /Users/mac/configs :/usr/redis_config redis redis-server /usr/local/etc/redis/redis.conf ` ## Access redis-cli `docker exec -it redis-cache /bin/bash` `redis-cli` ## Some usefull redis-cli commands `redis-cli info stats` : show information about redis `redis-cli info memory`: show information about memory `redis-cli ping` : check resdis service `redis-cli flushall` : clear all cached data ## Applying Redis in Micro-service * Add Spring Data Redis as a dependency in your project * Add the following properties in application.properties `spring.cache.type=redis` `spring.cache.type=none` : if you do not have redis in local env. `spring.redis.host=localhost` `spring.redis.port=6379` * Add @EnableCaching into your Application class * Apply cashing Annotations for service layer as in below service class sample ``` @Override @Cacheable(value = "allUsersCache") public List<User> findAll() { log.info("UserService :: findAll"); return repository.findAll(); } @Override @Cacheable(value = "allUsersCache", key = "'wtihParam_'.concat(#param)") public List<User> findAllWithParam(String param) { log.info("UserService :: findAll"); return repository.findAll(); } @Override @Cacheable(value = "userCache", key="#userId") public User findOne(int userId) { log.info("UserService :: findOne"); return repository.getOne(userId); } @Override @Caching(put= { @CachePut(value= "userCache", key= "#user.id") }, evict= { @CacheEvict(value= "allUsersCache", allEntries= true) }) public User save(User user) { log.info("UserService :: save"); User createdUser = repository.saveAndFlush(user); sender.send(USER_CREATED_TOPIC, createdUser); return createdUser; } @Override @Caching(evict= { @CacheEvict(value= "userCache", key= "#userId"), @CacheEvict(value= "allUsersCache", allEntries= true)}) public void delete(@PathVariable int userId) { log.info("UserService :: delete"); repository.deleteById(userId); } @Override @Caching(put= { @CachePut(value= "userCache", key= "#user.id") }, evict= { @CacheEvict(value= "allUsersCache", allEntries= true) }) public User update(User user) { log.info("UserService :: update"); User u = repository.getOne(user.getId()); u.setName(user.getName()); return repository.save(u); } ``` ## References: - https://programmerfriend.com/ultimate-guide-to-redis-cache-with-spring-boot-2-and-spring-data-redis/ - https://medium.com/@MatthewFTech/spring-boot-cache-with-redis-56026f7da83a - https://medium.com/@petehouston/install-and-config-redis-on-mac-os-x-via-homebrew-eb8df9a4f298