參考:
https://www.cnblogs.com/ityouknow/p/5748830.html
http://blog.csdn.net/i_vic/article/details/53081241
https://www.cnblogs.com/gdpuzxs/p/7222309.html
http://www.runoob.com/redis/redis-keys.html #redis命令
springboot和redis結合,這里只是單機版的配置,如果需要配置集群,可以在上面幾個博客中看一下。附錄中是一些redis常用命令,也可以在參考[3]中看。
springboot的應用,包路徑一定要合格(所有的代碼,都在啟動類所在得包的下級目錄中),避免不必要的麻煩。
開始:
1. pom中添加
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2. 啟動類
添加 @EnableCaching
3. 配置
配置文件:
# Redis數據庫索引(默認為0) spring.redis.database=0 # Redis服務器地址 spring.redis.host=192.168.72.133 # Redis服務器連接端口 spring.redis.port=6379 # Redis服務器連接密碼(默認為空) spring.redis.password= # 連接池最大連接數(使用負值表示沒有限制) 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
配置類:
@Configuration @EnableCaching public class RedisCacheConfig extends CachingConfigurerSupport{ @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private int port; @Value("${spring.redis.timeout}") private int timeout; @Value("${redis.cacheExpirationTime}") private long cacheExpirationTime; //自定義緩存key生成策略 @Bean public KeyGenerator keyGenerator() { return new KeyGenerator(){ @Override public Object generate(Object target, Method method, Object... params) { StringBuffer sb = new StringBuffer(); sb.append(target.getClass().getName()); sb.append(method.getName()); for(Object obj:params){ sb.append(obj.toString()); } return sb.toString(); } }; } //緩存管理器 @Bean public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); //設置緩存過期時間 cacheManager.setDefaultExpiration(10); return cacheManager; } @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory){ StringRedisTemplate template = new StringRedisTemplate(factory); setSerializer(template);//設置序列化工具 template.afterPropertiesSet(); return template; } private void setSerializer(StringRedisTemplate template){ Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setValueSerializer(jackson2JsonRedisSerializer); } }
其中的使用的是com.fasterxml.jackson。
4. redis操作接口和實現類(使用接口實現類的形式,可以使你在單機和集群形式快速切換,而且在其它地方使用的使用可以自動注入)
interface:
public interface JedisServer { public boolean set(String key, String value); public String get(String key); public boolean expire(String key,long expire); public <T> boolean setList(String key ,List<T> list); public <T> List<T> getList(String key,Class<T> clz); public long lpush(String key,Object obj); public long rpush(String key,Object obj); public String lpop(String key); }
implements single:
@Service public class JedisServerImpl implements JedisServer { @Resource private RedisTemplate<String, ?> redisTemplate; @Override public boolean set(final String key, final String value) { boolean result = redisTemplate.execute(new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); connection.set(serializer.serialize(key), serializer.serialize(value)); return true; } }); return result; } public String get(final String key){ String result = redisTemplate.execute(new RedisCallback<String>() { @Override public String doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); byte[] value = connection.get(serializer.serialize(key)); return serializer.deserialize(value); } }); return result; } /** * 設置緩存剩余時間(s) */ @Override public boolean expire(final String key, long expire) { return redisTemplate.expire(key, expire, TimeUnit.SECONDS); } @Override public <T> boolean setList(String key, List<T> list) { String value = JsonUtilFood.object2Json(list); return set(key,value); } @Override public <T> List<T> getList(String key,Class<T> clz) { String json = get(key); if(json!=null){ @SuppressWarnings("unchecked") List<T> list = (List<T>) JsonUtilFood.json2Object(json, clz); return list; } return null; } @Override public long lpush(final String key, Object obj) { final String value = JsonUtilFood.object2Json(obj); long result = redisTemplate.execute(new RedisCallback<Long>() { @Override public Long doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); long count = connection.lPush(serializer.serialize(key), serializer.serialize(value)); return count; } }); return result; } @Override public long rpush(final String key, Object obj) { final String value = JsonUtilFood.object2Json(obj); long result = redisTemplate.execute(new RedisCallback<Long>() { @Override public Long doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); long count = connection.rPush(serializer.serialize(key), serializer.serialize(value)); return count; } }); return result; } @Override public String lpop(final String key) { String result = redisTemplate.execute(new RedisCallback<String>() { @Override public String doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); byte[] res = connection.lPop(serializer.serialize(key)); return serializer.deserialize(res); } }); return result; } }
記得添加@Service注釋
implements cluster: 沒寫,百度挺多的。
可以在電腦安裝虛擬機,安裝linux,然后安裝redis,在上面參考博客中有,然后關閉防火牆,啟動redis服務端,之后啟動客戶端測試,可以的時候再使用代碼測試。
配置中的緩存存在時間配置暫時測試,不知道為什么沒用,所以先在代碼中設置了,以后找到了再更新吧。。
再貼一份調用的代碼:
@Resource private JedisServer jedisServer; @Override public String noodlesList() { //其中的key暫時先寫的是固定的,之后可以根據表名+主鍵保存,防止重復,記得再次查詢的時候,重新設置超時時間,修改和刪除的時候刪除/更新redis中的緩存 try{ String string = jedisServer.get("foodcom"); if(null != string) { return string; }else{ jedisServer.expire("foodcom", 10); } }catch(Exception e) { log.info("查詢緩存異常(key=foodcom)."); } FoodInfo food = foodInfoMapper.selectByPrimaryKey(1); jedisServer.set("foodcom", JsonUtilFood.object2Json(food)); jedisServer.expire("foodcom", 10); return JsonUtilFood.object2Json(food); }
希望可以幫到你,如果是業余測試,或許有問題我可以幫到你,如果是...,我也。。不會,以后或許就會了,哈哈哈
附:
redis常用:
防火牆,需要用root用戶。 從配置菜單關閉防火牆是不起作用的,索性在安裝的時候就不要裝防火牆 查看防火牆狀態: /etc/init.d/iptables status 暫時關閉防火牆: /etc/init.d/iptables stop 禁止防火牆在系統啟動時啟動 /sbin/chkconfig --level 2345 iptables off 重啟iptables: /etc/init.d/iptables restart 題外話: BT或者騾子速度慢用不着關防火牆,只要把相應端口開放就可以了 在文件 /etc/sysconfig/iptables 在系統原始配置的:RH-Firewall-1-INPUT規則鏈增加類似這樣的行: -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 39764 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 39764 -j ACCEPT 如果發現原有-j REJECT一類的語句,上面兩句要放在它的前面 重啟后生效 開啟: chkconfig iptables on 關閉: chkconfig iptables off 或者 /sbin/chkconfig --level 2345 iptables off 2) 即時生效,重啟后失效 service 方式 開啟: service iptables start 關閉: service iptables stop iptables方式 查看防火牆狀態: /etc/init.d/iptables status 暫時關閉防火牆: /etc/init.d/iptables stop 重啟iptables: /etc/init.d/iptables restart
1. SET key value 設置指定 key 的值 2 GET key 獲取指定 key 的值。 3 GETRANGE key start end 返回 key 中字符串值的子字符 4 GETSET key value 將給定 key 的值設為 value ,並返回 key 的舊值(old value)。 5 GETBIT key offset 對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。 6 MGET key1 [key2..] 獲取所有(一個或多個)給定 key 的值。 7 SETBIT key offset value 對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)。 8 SETEX key seconds value 將值 value 關聯到 key ,並將 key 的過期時間設為 seconds (以秒為單位)。 9 SETNX key value 只有在 key 不存在時設置 key 的值。 10 SETRANGE key offset value 用 value 參數覆寫給定 key 所儲存的字符串值,從偏移量 offset 開始。 11 STRLEN key 返回 key 所儲存的字符串值的長度。 12 MSET key value [key value ...] 同時設置一個或多個 key-value 對。 13 MSETNX key value [key value ...] 同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在。 14 PSETEX key milliseconds value 這個命令和 SETEX 命令相似,但它以毫秒為單位設置 key 的生存時間,而不是像 SETEX 命令那樣,以秒為單位。 15 INCR key 將 key 中儲存的數字值增一。 16 INCRBY key increment 將 key 所儲存的值加上給定的增量值(increment) 。 17 INCRBYFLOAT key increment 將 key 所儲存的值加上給定的浮點增量值(increment) 。 18 DECR key 將 key 中儲存的數字值減一。 19 DECRBY key decrement key 所儲存的值減去給定的減量值(decrement) 。 20 APPEND key value 如果 key 已經存在並且是一個字符串, APPEND 命令將 value 追加到 key 原來的值的末尾。 1. DEL key 該命令用於在 key 存在時刪除 key。 2 DUMP key 序列化給定 key ,並返回被序列化的值。 3 EXISTS key 檢查給定 key 是否存在。 4 EXPIRE key seconds 為給定 key 設置過期時間。 5 EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 類似,都用於為 key 設置過期時間。 不同在於 EXPIREAT 命令接受的時間參數是 UNIX 時間戳(unix timestamp)。 6 PEXPIRE key milliseconds 設置 key 的過期時間以毫秒計。 7 PEXPIREAT key milliseconds-timestamp 設置 key 過期時間的時間戳(unix timestamp) 以毫秒計 8 KEYS pattern 查找所有符合給定模式( pattern)的 key 。 9 MOVE key db 將當前數據庫的 key 移動到給定的數據庫 db 當中。 10 PERSIST key 移除 key 的過期時間,key 將持久保持。 11 PTTL key 以毫秒為單位返回 key 的剩余的過期時間。 12 TTL key 以秒為單位,返回給定 key 的剩余生存時間(TTL, time to live)。 13 RANDOMKEY 從當前數據庫中隨機返回一個 key 。 14 RENAME key newkey 修改 key 的名稱 15 RENAMENX key newkey 僅當 newkey 不存在時,將 key 改名為 newkey 。 16 TYPE key 返回 key 所儲存的值的類型。