springboot操做redis基礎說明

軟件環境:springboot 1.5.2,redis 3.2.1java

配置

在application.properties,增長redis的配置,主要配置項包括redis的ip,端口,密碼等,具體以下:redis

# redis
# Redis數據庫索引(默認爲0)
spring.redis.database=0  
# Redis服務器地址
spring.redis.host=localhost
# Redis服務器鏈接端口
spring.redis.port=6379  
# Redis服務器鏈接密碼(默認爲空)
spring.redis.password=123456
# 鏈接池最大鏈接數(使用負值表示沒有限制)
spring.redis.pool.max-active=8  
# 鏈接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1  
# 鏈接池中的最大空閒鏈接
spring.redis.pool.max-idle=8  
# 鏈接池中的最小空閒鏈接
spring.redis.pool.min-idle=0  
# 鏈接超時時間(毫秒)
spring.redis.timeout=0

編碼

全局配置

在任意包(package)下添加類spring

/**
 * redis緩存配置
 */
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

//    @Bean
//    public KeyGenerator keyGenerator() {
//        return new KeyGenerator() {
//            @Override
//            public Object generate(Object target, Method method, Object... params) {
//                StringBuilder sb = new StringBuilder();
//                sb.append(target.getClass().getName());
//                sb.append(method.getName());
//                for (Object obj : params) {
//                    sb.append(obj.toString());
//                }
//                return sb.toString();
//            }
//        };
//    }

    @SuppressWarnings("rawtypes")
    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
        //設置緩存過時時間
        //rcm.setDefaultExpiration(60);//秒
        return rcm;
    }

    /**
     * redis模板配置
     *
     * @param factory
     * @return
     */
    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate template = new StringRedisTemplate(factory);
        //RedisTemplate序列化類設置
        //json序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        //value的序列化類
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //hash的value的序列化類
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

 

redis序列化類說明(關鍵!!)數據庫

根本上來講,redis只能保存字符串。若是要保存對象(javabean),就須要序列化,因此要設置序列化的類json

在上方代碼的redisTemplate方法中,其中有一行緩存

//value的序列化類
template.setValueSerializer(jackson2JsonRedisSerializer);

這是設置對value的序列化類的設置,當value的類型不是string時,就會用他作序列化springboot

下面還有一行服務器

//hash的value的序列化類
template.setHashValueSerializer(jackson2JsonRedisSerializer);

經過名字能夠看出是對HashValue的序列化,那HashValue跟value有什麼區別?這涉及到redis的幾種數據類型,對於string和list類型,他們的整個值的結構是key和value,對於hash類型,結構就是key,hashKey,hashValue,因此setHashValueSerializer是設置hash結構的hashValue的session

若是沒有setHashValueSerializer,而在對hashValue賦值時傳入了javabean,就會報錯app

具體操做

如下例子使用hash類型,場景是保存全部登陸用戶的信息,其中key固定是loginToken,hashKey是token(每一個用戶惟一隨機生成的string),hashValue是一個叫LoginUser的類

 

在須要操做redis的類先添加RedisTemplate的注入

 

插入值

ops.put方法表明插入,3個參數分別對應key,hashKey,hashValue

在這裏能夠把key理解爲表名,hashKey理解爲表的id,hashValue就是一行的全部列的值

HashOperations<String, Object, Object> ops = redisTemplate.opsForHash();

//登陸用戶信息
LoginUser loginUser = new LoginUser();
loginUser.setToken(token);
loginUser.setUserName(userName);

//插入到redis
ops.put("LoginUser", token, loginUser);

 

檢查key是否存在

ops.hasKey的兩個參數,第一個是key,第二是hashKey

HashOperations<String, String, Object> ops = redisTemplate.opsForHash();

return ops.hasKey("LoginUser", token);

 

經過key獲取值

ops.hasKey的兩個參數,第一個是key,第二是hashKey,跟上面的檢查差很少

HashOperations<String, String, LoginUser> ops = redisTemplate.opsForHash();

LoginUser loginUser = ops.get("LoginUser", token);

 

其餘操做

設置有效時間

能夠像session同樣,設置一個有效時間,超過了自動刪除

參數1是key,參數2是時間的值,參數3是時間單位,下面例子是30分鐘的意思

redisTemplate.expire("LoginUser", 30, TimeUnit.MINUTES);

 

下圖是本例子寫入數據後的樣子

相關文章
相關標籤/搜索