展開被 SpringBoot 玩的日子 《 三 》 整合Redis

  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");
    }
}  
相關文章
相關標籤/搜索