Page tree
Skip to end of metadata
Go to start of metadata

CAST supports Redis via its NoSQL for Java extension. Details about how this support is provided for Java with Spring Data source code is discussed below.

Supported Libraries

  *  CrudRepository and JpaRepository are supported only if the repository is created using @RedisHash domain.

Supported Operations

Operation

Methods Supported

Insert
 Insert Operation APIs
  • org.springframework.data.redis.core.ValueOperations.set
  • org.springframework.data.redis.core.ValueOperations.multiSet
  • org.springframework.data.redis.core.ValueOperations.multiSetIfAbsent
  • org.springframework.data.redis.core.ValueOperations.setIfAbsent
  • org.springframework.data.redis.core.ValueOperations.append
  • org.springframework.data.redis.core.ListOperations.leftPush
  • org.springframework.data.redis.core.ListOperations.leftPushAll
  • org.springframework.data.redis.core.ListOperations.rightPush 
  • org.springframework.data.redis.core.ListOperations.rightPushAll
  • org.springframework.data.redis.core.ListOperations.set
  • org.springframework.data.redis.core.HashOperations.putAll
  • org.springframework.data.redis.core.HashOperations.put
  • org.springframework.data.redis.core.HashOperations.putIfAbsent
  • org.springframework.data.redis.core.SetOperations.add
  • org.springframework.data.repository.CrudRepository.save
  • org.springframework.data.repository.CrudRepository.saveAll
  • org.springframework.data.jpa.repository.JpaRepository.save 
  • org.springframework.data.jpa.repository.JpaRepository.saveAll
  • org.springframework.data.jpa.repository.JpaRepository.saveAndFlush
  • org.springframework.data.jpa.repository.JpaRepository.flush
Select
 Select Operation APIs
  • org.springframework.data.redis.core.ValueOperations.get
  • org.springframework.data.redis.core.ValueOperations.multiGet
  • org.springframework.data.redis.core.ValueOperations.size
  • org.springframework.data.redis.core.ValueOperations.bitField
  • org.springframework.data.redis.core.ValueOperations.getAndDelete
  • org.springframework.data.redis.core.ValueOperations.getAndSet
  • org.springframework.data.redis.core.ListOperations.range
  • org.springframework.data.redis.core.ListOperations.size
  • org.springframework.data.redis.core.ListOperations.index
  • org.springframework.data.redis.core.ListOperations.indexOf
  • org.springframework.data.redis.core.ListOperations.lastIndexOf
  • org.springframework.data.redis.core.HashOperations.hasKey
  • org.springframework.data.redis.core.HashOperations.get
  • org.springframework.data.redis.core.HashOperations.multiGet
  • org.springframework.data.redis.core.HashOperations.keys
  • org.springframework.data.redis.core.HashOperations.values
  • org.springframework.data.redis.core.HashOperations.lengthOfValue
  • org.springframework.data.redis.core.HashOperations.size
  • org.springframework.data.redis.core.HashOperations.entries
  • org.springframework.data.redis.core.HashOperations.randomEntries
  • org.springframework.data.redis.core.HashOperations.randomEntry
  • org.springframework.data.redis.core.HashOperations.randomKey
  • org.springframework.data.redis.core.HashOperations.randomKeys
  • org.springframework.data.redis.core.HashOperations.scan
  • org.springframework.data.redis.core.SetOperations.size
  • org.springframework.data.redis.core.SetOperations.isMember
  • org.springframework.data.redis.core.SetOperations.members
  • org.springframework.data.repository.CrudRepository.findAll
  • org.springframework.data.repository.CrudRepository.count
  • org.springframework.data.repository.CrudRepository.findById
  • org.springframework.data.repository.CrudRepository.findAllById
  • org.springframework.data.repository.CrudRepository.existsById
  • org.springframework.data.repository.PagingAndSortingRepository.findAll
  • org.springframework.data.jpa.repository.JpaRepository.count
  • org.springframework.data.jpa.repository.JpaRepository.findAll
  • org.springframework.data.jpa.repository.JpaRepository.findAllById
  • org.springframework.data.jpa.repository.JpaRepository.exists
  • org.springframework.data.jpa.repository.JpaRepository.findOne
  • org.springframework.data.jpa.repository.JpaRepository.findById
  • org.springframework.data.jpa.repository.JpaRepository.existsById
Delete
 Delete Operation APIs
  • org.springframework.data.redis.core.ListOperations.remove
  • org.springframework.data.redis.core.ListOperations.rightPop
  • org.springframework.data.redis.core.ListOperations.leftPop
  • org.springframework.data.redis.core.HashOperations.delete
  • org.springframework.data.redis.core.SetOperations.remove
  • org.springframework.data.redis.core.SetOperations.pop
  • org.springframework.data.redis.core.ValueOperations.getAndDelete
  • org.springframework.data.redis.core.RedisTemplate.delete
  • org.springframework.data.repository.CrudRepository.deleteAll
  • org.springframework.data.repository.CrudRepository.deleteById
  • org.springframework.data.repository.CrudRepository.delete
  • org.springframework.data.jpa.repository.JpaRepository.deleteInBatch

  • org.springframework.data.jpa.repository.JpaRepository.deleteAllInBatch

  • org.springframework.data.jpa.repository.JpaRepository.delete

  • org.springframework.data.jpa.repository.JpaRepository.deleteAll

  • org.springframework.data.jpa.repository.JpaRepository.deleteAllById

  • org.springframework.data.jpa.repository.JpaRepository.deleteById

Update
 Update Operation APIs
  • org.springframework.data.redis.core.ValueOperations.increment
  • org.springframework.data.redis.core.ValueOperations.decrement
  • org.springframework.data.redis.core.ValueOperations.getAndSet
  • org.springframework.data.redis.core.ValueOperations.setIfPresent
  • org.springframework.data.redis.core.ValueOperations.getAndSet
  • org.springframework.data.redis.core.ListOperations.trim
  • org.springframework.data.redis.core.ListOperations.leftPushIfPresent
  • org.springframework.data.redis.core.ListOperations.rightPushIfPresent
  • org.springframework.data.redis.core.HashOperations.increment

Objects

Icon

Description

Java Redis Connection

Java Redis Collection

Java unknown Redis Connection

Java Unknown Redis Collection

Links

Links are created for transaction and function point needs:

Link typeWhen is this created?Methods Supported
parentLink

Between Redis connection object and Redis collection object


useLink

Between the caller Java method object and Redis collection object





useSelectLink
  • multiGet
  • get
  • keys
  • entries
  • findAllById
  • findAll
useInsertLink
  •  set
  •  put
  •  putAll
  •  add
  •  leftpush
  • save
  • saveAll

useDeleteLink

  • delete
  • remove
  • deleteById
  • deleteAll
useUpdateLink
  • increment
  • decrement

What results can you expect?

Once the analysis/snapshot generation has completed, you can view the results in the normal manner (for example via CAST Enlighten). Some examples are shown below.

Redis Connections and Collections

 Connections and Collections
@Autowired
private ServiceConfigResource serviceConfigResource;

RedisConnectionFactory switchRedisMaster() {
         return getRedisConnectionFactory(serviceConfigResource.getSwitchRedisMaster(), serviceConfigResource.getDisRedisPort());
}
Java based configurations
@Configuration
@RefreshScope
@Getter
public class ServiceConfigResource {

    	@Value("${disredis.host.disRedisHost1}")
     	private String switchRedisMaster;

    	@Value("${disredis.host.disRedisHost2}")
     	private String switchRedisSlave1;

     	@Value("${disredis.host.disRedisHost3}")
      	private String switchRedisSlave2;

	    @Value("${disredis.port.disRedisPort1}")
    	private int disRedisPort; 

      	@Value("${useRoomSharedUsedTable}")
       	private int useRoomSharedUsedTable;

}

Xml based configurations
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xmlns:redis="http://www.springframework.org/schema/redis"
  xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/redis http://www.springframework.org/schema/redis/spring-redis.xsd
        ">
    
<!-- Jedis Connection -->    
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
   p:host-name="localhost" p:port="6379" />
  
<!-- Redis Template -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
	<property name="connectionFactory" ref="jedisConnectionFactory" />
	<property name="valueSerializer">
		<bean id="redisJsonSerializer" class="org.springframework.data.redis.serializer.JacksonJsonRedisSerializer">
			<constructor-arg type="java.lang.Class" value="redis.User"/>
		</bean>   
	</property>
</bean>

<bean class="redis.UserRepository"/>

</beans>

lettuce
 public ReactiveRedisConnectionFactory build() {
    LettuceClientConfiguration clientConfig;
    LettuceClientConfiguration.LettuceClientConfigurationBuilder builder =
        LettuceClientConfiguration.builder();
    if (ssl) {
      builder.commandTimeout(Duration.ofSeconds(timeout)).useSsl();
    }
    clientConfig = builder.build();

    RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
    configuration.setHostName(host);
    configuration.setPassword(password);
    configuration.setPort(port);
    return new LettuceConnectionFactory(configuration, clientConfig);

RedisHash Domain
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package io.project.app.domain;

import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.data.redis.core.RedisHash;

/**
 *
 * @author armena
 */
@RedisHash
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@EqualsAndHashCode
public class SearchData implements Serializable{
    
    private String id;   //unique id
    private String key; //key for search
    private String title;
    private String content;
    
}

Redis Repo Creation using CrudRepository
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package io.project.app.repositories;

import io.project.app.domain.SearchData;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

/**
 *
 * @author armena
 */
@Repository
@Component
public interface SearchRepository extends CrudRepository<SearchData, String>{
	
	public SearchRepository findByTitle(String title);
    
}

Insert Operation

 Insert Operation
@Bean(name = "switch_redis_master")
    <T> RedisTemplate<String, T> switchMasterRedis() {
        RedisTemplate template = new RedisTemplate<>();
        FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
        template.setConnectionFactory(switchRedisMaster());
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(fastJsonRedisSerializer);
        return template;
    }

@Autowired
@Qualifier("switch_redis_master")
private RedisTemplate<String, Integer> redisTemplate;


private boolean invokeFrequencyValidate(String agentCode, Date checkInDate, Date checkOutDate) {
        int openingHotelNum = hotelService.getOpeningHotelNum();
        Date currentDate = new Date();
        // 16-90
        if (AbstractDateUtils.isAfter(checkInDate, AbstractDateUtils.getDeltaDateByDays(currentDate, 15))) {
            Integer count = redisTemplate.opsForValue().get(agentCode + "_" + SIXTEEN_TO_NINETY);
            if (count == null) {
                redisTemplate.opsForValue().set(agentCode + "_" + SIXTEEN_TO_NINETY, 1, TIME_PERIOD_THREE, TimeUnit.MINUTES);
                return true;
            }
            if (count >= maxQueryBase + openingHotelNum / FIFTEEN_OUTER_DIVIDED) {
                return false;
            }
            return true;
        }

CrudRepository Insert Operation
	@Autowired
    private SearchRepository searchRepository;

    public SearchData save(SearchData googleSearch) {        
        return searchRepository.save(googleSearch);
    }

Select Operation

 Select Operation
private List<RoomShareUsedCountEntity> calculateRoomShareUsedCountWithType(StandardRoomWithTypeRequest standardRoomWithTypeRequest) {
        List<String> validDateList = calculateAllKeyDate(standardRoomWithTypeRequest.getCheckInDate(), standardRoomWithTypeRequest.getCheckOutDate());
        List<String> fullKey = Lists.newArrayList();

        List<UsedShareRoomCount> allUsedShareRoomCountList = Lists.newArrayList();
        for (String key : fullKey) {
            List<UsedShareRoomCount> value = (List<UsedShareRoomCount>) usedShareRoomCountSlaveRedisTemplate.opsForValue().get(key);
        }
        if (CollectionUtils.isEmpty(allUsedShareRoomCountList)) {
            return Lists.newArrayList();
        }
        return convert2RoomShareUsedCountEntityFromUsedShareCount(allUsedShareRoomCountList);
    }

CrudRepository Select Operation
	@Autowired
    private SearchRepository searchRepository;

    public Optional<SearchData> find(String id) {
       return searchRepository.findById(id);
    }

Update Operation

 Update operation
private boolean invokeFrequencyValidate(String agentCode, Date checkInDate, Date checkOutDate) {

        int openingHotelNum = hotelService.getOpeningHotelNum();
        Date currentDate = new Date();
        // 16-90
        if (AbstractDateUtils.isAfter(checkInDate, AbstractDateUtils.getDeltaDateByDays(currentDate, 15))) {
            Integer count = redisTemplate.opsForValue().get(agentCode + "_" + SIXTEEN_TO_NINETY);
            if (count == null) {
                redisTemplate.opsForValue().set(agentCode + "_" + SIXTEEN_TO_NINETY, 1, TIME_PERIOD_THREE, TimeUnit.MINUTES);
                return true;
            }
            if (count >= maxQueryBase + openingHotelNum / FIFTEEN_OUTER_DIVIDED) {
                return false;
            }
            redisTemplate.opsForValue().increment(agentCode + "_" + SIXTEEN_TO_NINETY, 1);
            return true;
        }

Delete Operation

 Delete Operation
public void delete(String key) {
		template.opsForValue().getOperations().delete(key);
	}

CrudRepository Delete Operation
 	@Autowired
    private SearchRepository searchRepository;

    public Optional<SearchData> delete(String id) {
        return searchRepository.deleteById(id);
    }

Evolution

  • Resolution increased for connection and collection objects
  • Connections names are resolved for the Redis.connection
  • Identifying connection and collection for XML based configuration
  • Support for Value, List, Hash, Set, CrudRepository and JpaRepository operations.
  • No labels