SpringBoot對經常使用的數據庫支持外,對NoSQL 數據庫也進行了封裝自動化。linux
redis介紹git
Redis是目前業界使用最普遍的內存數據存儲。相比memcached,Redis支持更豐富的數據結構,例如hashes, lists, sets等,同時支持數據持久化。除此以外,Redis還提供一些類數據庫的特性,好比事務,HA,主從庫。能夠說Redis兼具了緩存系統和數據庫的一些特性,所以有着豐富的應用場景。本文介紹Redis在Spring Boot中兩個典型的應用場景。github
如何使用redis
一、引入 spring-boot-starter-redisspring
<dependency> 數據庫
<groupId>org.springframework.boot</groupId> windows
<artifactId>spring-boot-starter-data-redis</artifactId> 瀏覽器
</dependency>緩存
二、添加配置文件服務器
# REDIS (RedisProperties)
# Redis數據庫索引(默認爲0)
spring.redis.database=0
# Redis服務器地址
spring.redis.host=127.0.0.1
# 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=1000
三、安裝 Redis (Windows)
Redis 官網:https://redis.io/,官網提供的是linux版本的,下載windows版本的地址以下。
Redis windows下載地址:https://github.com/MicrosoftArchive/redis/releases
一、安裝。
運行對話框輸入"cmd",打開命令提示符對話框。定位到redis解壓縮後的文件夾中。輸入「redis-server.exe redis.windows.conf」出現以下界面即成功啓動。
二、測試是否安裝成功(使用客戶端進行測試)
方法一: 安裝redis服務的dos窗口不要關閉。另外打開一個dos窗口,定位到解壓縮後的redis文件夾,輸入「redis-cli.exe -h 127.0.0.1 -p 6379」
方法二:直接在安裝目錄找到redis-cli.exe,雙擊打開
輸入set a '1'回車保存成功,輸入get a獲取Redis內的值。
以下圖表示成功
三、由於redis是key/value形式的內存數據庫,因此,在設置/讀取值的時候,須要使用set/get key value的形式
若是能正常設置/讀取,則證實redis已經安裝完成。
四、每次使用都須要這樣開啓Redis 服務,挺麻煩的,那就繼續看:
1)安裝服務:redis-server --service-install redis.windows.conf--loglevel verbose
2)啓動服務:redis-server --service-start
3)卸載服務:redis-server --service-uninstall
這裏也簡單寫一下 Linux 安裝Redis 的方案
............................................................................................................(有時間再寫)
好,到這裏,Redis 的基本準備已經能夠了,接下來就是怎樣去寫入緩存,怎樣拿出緩存的問題了,我看了不少人的用法,都不同,這個方案,是我認爲比較合適的方案,裏面包含了 Redis 的全部使用方式,你們能夠參考一
@Component public class RedisUtil { @Autowired private RedisTemplate redisTemplate; /** * 寫入緩存 * @param key 鍵 * @param value 值 * @return */ public boolean set(final String key, Object value) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 寫入緩存設置時效時間 * @param key 鍵 * @param value 值 * @param expireTime 過時時間(秒) * @return */ public boolean set(final String key, Object value, Long expireTime) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, TimeUnit.SECONDS); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 批量刪除對應的value * @param keys 鍵s */ public void remove(final String... keys) { for (String key : keys) { remove(key); } } /** * 批量刪除key * @param pattern */ public void removePattern(final String pattern) { Set<Serializable> keys = redisTemplate.keys(pattern); if (keys.size() > 0) redisTemplate.delete(keys); } /** * 刪除對應的value * @param key 鍵 */ public void remove(final String key) { if (exists(key)) { redisTemplate.delete(key); } } /** * 判斷緩存中是否有對應的value * @param key 鍵 * @return */ public boolean exists(final String key) { return redisTemplate.hasKey(key); } /** * 讀取緩存 * @param key 鍵 * @return */ public Object get(final String key) { Object result = null; ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); result = operations.get(key); return result; } /** * 哈希 添加 * @param key 鍵 * @param hashKey has鍵 * @param value 值 */ public void hmSet(String key, Object hashKey, Object value){ HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); hash.put(key,hashKey,value); } /** * 哈希獲取數據 * @param key 鍵 * @param hashKey has鍵 * @return */ public Object hmGet(String key, Object hashKey){ HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); return hash.get(key,hashKey); } /** * 列表添加 * @param k 鍵 * @param v 值 */ public void lPush(String k,Object v){ ListOperations<String, Object> list = redisTemplate.opsForList(); list.rightPush(k,v); } /** * 列表獲取 * @param k 鍵 * @param l * @param l1 * @return */ public List<Object> lRange(String k, long l, long l1){ ListOperations<String, Object> list = redisTemplate.opsForList(); return list.range(k,l,l1); } /** * 集合添加 * @param key 鍵 * @param value 值 */ public void add(String key,Object value){ SetOperations<String, Object> set = redisTemplate.opsForSet(); set.add(key,value); } /** * 集合獲取 * @param key 鍵 * @return */ public Set<Object> setMembers(String key){ SetOperations<String, Object> set = redisTemplate.opsForSet(); return set.members(key); } /** * 有序集合添加 * @param key * @param value * @param scoure */ public void zAdd(String key,Object value,double scoure){ ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); zset.add(key,value,scoure); } /** * 有序集合獲取 * @param key * @param scoure * @param scoure1 * @return */ public Set<Object> rangeByScore(String key,double scoure,double scoure1){ ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); return zset.rangeByScore(key, scoure, scoure1); } }
四、好了,接下來就能夠直接使用了,我是直接用瀏覽器或者 PostMan 來測試的,配合我第二節的 User 類來使用
@RestController public class TestRedisController { @Autowired private UserDao userDao; @Autowired private RedisUtil redisUtil; @RequestMapping("/testSetRedis") public void testSetRedis () { redisUtil.set("key","value22222"); } @RequestMapping("/testGetRedis") public Object getSetRedis () { return redisUtil.get("key"); } @RequestMapping("/testRegister") public void testRegister () { User user = new User(); user.setUserName("xjb1"); user.setPassword("123456"); user.setEmail("1xjb@qq.com"); user.setNickName("xjb1"); user.setRegTime(new Date().toString()); userDao.save(user); // new User 並添加到數據庫後,將主鍵返回,而且保存到 緩存,設置有效時間 redisUtil.set(user.getId().toString(), user, 10l); } @RequestMapping("/testGetUserByRedis") public Object testGetUserByRedis () { // 這裏寫得比較死,真實開發中,有不少方式獲取緩存的key return redisUtil.get("61"); } }