軟件環境: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);
ops.hasKey的兩個參數,第一個是key,第二是hashKey
HashOperations<String, String, Object> ops = redisTemplate.opsForHash(); return ops.hasKey("LoginUser", token);
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);
下圖是本例子寫入數據後的樣子