展開被 SpringBoot 玩的日子 《 三 》 整合Redis
SpringBoot對常用的資料庫支援外,對NoSQL 資料庫也進行了封裝自動化。
redis介紹
Redis是目前業界使用最廣泛的記憶體資料儲存。相比memcached,Redis支援更豐富的資料結構,例如hashes, lists, sets等,同時支援資料持久化。除此之外,Redis還提供一些類資料庫的特性,比如事務,HA,主從庫。可以說Redis兼具了快取系統和資料庫的一些特性,因此有著豐富的應用場景。本文介紹Redis在Spring Boot中兩個典型的應用場景。
如何使用
1、引入 spring-boot-starter-redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、新增配置檔案
# 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
3、安裝 Redis
Redis 官網:https://redis.io/,官網提供的是linux版本的,下載windows版本的地址如下。
Redis windows下載地址:https://github.com/MicrosoftArchive/redis/releases
1、安裝。
執行對話方塊輸入"cmd",開啟命令提示符對話方塊。定位到redis解壓縮後的資料夾中。輸入“redis-server.exe redis.windows.conf”出現如下介面即成功啟動。
2、測試是否安裝成功(使用客戶端進行測試)
方法一: 安裝redis服務的dos視窗不要關閉。另外開啟一個dos視窗,定位到解壓縮後的redis資料夾,輸入“redis-cli.exe -h 127.0.0.1 -p 6379”
方法二:直接在安裝目錄找到redis-cli.exe,雙擊開啟
輸入set a '1'回車儲存成功,輸入get a獲取Redis內的值。
如下圖表示成功
3、因為redis是key/value形式的記憶體資料庫,所以,在設定/讀取值的時候,需要使用set/get key value的形式
如果能正常設定/讀取,則證明redis已經安裝完成。
4、每次使用都需要這樣開啟Redis 服務,挺麻煩的,那就繼續看:
1)安裝服務:redis-server --service-install redis.windows.conf--loglevel verbose
2)啟動服務:redis-server --service-start
3)解除安裝服務:redis-server --service-uninstall
好,到這裡,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); } }
4、好了,接下來就可以直接使用了,我是直接用瀏覽器或者 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("[email protected]"); 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"); } }