首页 > 技术文章 > SpringBoot集成Redis

wzdnwyyu 2019-07-10 13:59 原文

https://blog.csdn.net/plei_yue/article/details/7936237
需要的依赖:
        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

编写配置文件信息(每行后面千万不能有空格):

spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.timeout=5000

  

编写RedisUtils类用来封装RedisTemplate。
这个类初始化Template是这样的:
private RedisTemplate<String, Object> redisTemplate;  

    public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {  
        this.redisTemplate = redisTemplate;  
    }

还有四个公用方法:expire、getExpire、hasKey、del(可删多个)。

/**
     * 指定缓存失效时间
     * @param key 键
     * @param time 时间(秒)
     * @return
     */
    public boolean expire(String key,Long time){
        try{
            if(time!=null&&key!=null&&time>0){
                redisTemplate.expire(key,time,TimeUnit.SECONDS);
                return true;
            }else{
                return false;
            }
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 根据key 获取过期时间
     * @param key 键 不能为null
     * @return 时间(秒) 返回0代表为永久有效
     */
    public long getExpire(String key){
        return redisTemplate.getExpire(key,TimeUnit.SECONDS);
    }

    /**
     * 判断key是否存在
     * @param key 键
     * @return true 存在 false不存在
     */
    public boolean hasKey(String key){
        try{
            return redisTemplate.hasKey(key);
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 删除缓存
     * @param keys 可以传一个值 或多个
     */
    @SuppressWarnings("unchecked")
    public void del(String... keys){
        if(keys!=null&&keys.length>0){
            if(keys.length==1){
                redisTemplate.delete(keys[0]);
            }else{
                redisTemplate.delete(CollectionUtils.arrayToList(keys));
            }
        }
    }

  

操作string的:(普通缓存获取,普通缓存放入,放入普通缓存并设置时间,增值,减值)
/**
     * 普通缓存获取
     * @param key 键
     * @return 值
     */
    public Object get(String key){
        return key==null?null:redisTemplate.opsForValue().get(key);
    }

    /**
     * 普通缓存放入
     * @param key 键
     * @param value 值
     * @return true成功 false失败
     */
    public boolean set(String key,Object value) {
        try {
            redisTemplate.opsForValue().set(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

    }

    /**
     * 普通缓存放入并设置时间
     * @param key 键
     * @param value 值
     * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
     * @return true成功 false 失败
     */
    public boolean set(String key,Object value,long time){
        try {
            if(time>0){
                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
            }else{
                set(key, value);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 对于一个键是字符串的key,值是数字的,我们可以使用INCRBY命令增加值,或者使用DECRBY命令来减少值。
     * 命令返回操作执行之后,key的当前值,如果key原先不存在,则Redis会生成一个key为键,
     * value为0的键值对,然后再来增加或减少操作。
     */

    /**
     * 针对增一或减一,有以下应用:
     * 我们可以实现网页上面点击次数的记录,也就是计数器。
     * id生成器:比如每个用户创建新帖子,有新帖子id;或者新用户注册就是新用户id的创建。
     */
    /**
     * 递增
     * @param key 键
     * @param by 要增加几(大于0)
     * @return
     */
    public long incr(String key, long delta){
        if(delta<0){
            throw new RuntimeException("递增因子必须大于0");
        }
        return redisTemplate.opsForValue().increment(key, delta);
    }

    /**
     * 递减
     * @param key 键
     *
     * @param by 要减少几(小于0)
     * @return
     */
    public long decr(String key, long delta){
        if(delta<0){
            throw new RuntimeException("递减因子必须大于0");
        }
        return redisTemplate.opsForValue().increment(key, -delta);
    }

  

此处的操作redisTemplate都是用opsForValue()来实现的。可以看一下源码:可以看到最终返回的是一个DefaultValueOperations。
@Override
	public ValueOperations<K, V> opsForValue() {

		if (valueOps == null) {
			valueOps = new DefaultValueOperations<>(this);
		}
		return valueOps;
	}

  

因为redis操作不同的数据类型,会有不同的类来做:
redis的五大数据类型是:String、List、Hash、Set、SortedSet。操作这五种类型可以用:
 
@Resource 
RedisTemplate<String, String> redisTemplate;
redisTemplate.opsForValue();
redisTemplate.opsForHahs();
redisTemplate.opsForList();
redisTemplate.opsForSet();
redisTemplate.opsForZSet();
  set(key,value);
get(key);
get(key,start,end);//获取存储在键上的字符串的子字符串
getAndSet(key,value);//设置键上的字符串值,并返回旧值
getBit(key,offset);//太复杂了
multiGet(keys);//批量传入键,批量获取值
setBit(key,offset,value);//太复杂了
set(key,value,timeout,unit);//unit是单位,如时分秒
setIfAbsent(key,value);//设置key的value,仅当key不存在时。
set(key,value,offset);//在指定偏移处开始键外覆盖字符串???
size(key);
multiGet(key);批量通过key获取值
multiSetIfAbsent(m)//设置key的value,仅当key不存在时。
increment系列方法
append(key,value);//追加值
没有删除方法
1.delete(H key, Object... hashKeys);//...表示可以传入多个map的key,用,隔开。或用数组传值
2.hasKey(key, hashKey);
3.get(key, hashKey);
4.entries(key);//返回map集合
5、6.increment(H key, HK hashKey, long delta);//或increment(H key, HK hashKey, double delta);;
7.keys(key);//返回map的key集合Set
8.size(key);
9.multiGet(H key, Collection<HK> hashKeys);
10.putAll(H key, Map<? extends HK, ? extends HV> m);
11.put(key, hashKey, value);
12.putIfAbsent(key, hashKey, value);
13.values(key);//返回map中的value集合List;
 

 

leftPush(key, value);//从左向右存压栈
leftPop(key);//从左出栈
size(key);//队/栈长
range(key, start, end);//范围检索,返回List
remove(key, i, value);//移除key中值为value的i个,返回删除的个数;如果没有这个元素则返回0 
index(key, index);//检索
set(key, index, value);//赋值
trim(key, start, end);//裁剪,void,删除除了[start,end]以外的所有元素  
rightPopAndLeftPush(String sourceKey, String destinationKey);//将源key的队列的右边的一个值删除,然后塞入目标key的队列的左边,返回这个值

Set的:
目前只有这么多,ok继续看RedisUtil里面封装的操作其他元素类型的方法:Map:https://357029540.iteye.com/blog/2389045
/** 
     * HashGet 
     * @param key 键 不能为null 
     * @param item 项 不能为null 
     * @return 值 
     */  
    public Object hget(String key,String item){  
        return redisTemplate.opsForHash().get(key, item);  
    }  

    /** 
     * 获取hashKey对应的所有键值 
     * @param key 键 
     * @return 对应的多个键值 
     */  
    public Map<Object,Object> hmget(String key){  
        return redisTemplate.opsForHash().entries(key);  
    }  

    /** 
     * HashSet 
     * @param key 键 
     * @param map 对应多个键值 
     * @return true 成功 false 失败 
     */  
    public boolean hmset(String key, Map<String,Object> map){    
        try {  
            redisTemplate.opsForHash().putAll(key, map);  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  

    /** 
     * HashSet 并设置时间 
     * @param key 键 
     * @param map 对应多个键值 
     * @param time 时间(秒) 
     * @return true成功 false失败 
     */  
    public boolean hmset(String key, Map<String,Object> map, long time){    
        try {  
            redisTemplate.opsForHash().putAll(key, map);  
            if(time>0){  
                expire(key, time);  
            }  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  

    /** 
     * 向一张hash表中放入数据,如果不存在将创建 
     * @param key 键 
     * @param item 项 
     * @param value 值 
     * @return true 成功 false失败 
     */  
    public boolean hset(String key,String item,Object value) {  
         try {  
            redisTemplate.opsForHash().put(key, item, value);  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  

    /** 
     * 向一张hash表中放入数据,如果不存在将创建 
     * @param key 键 
     * @param item 项 
     * @param value 值 
     * @param time 时间(秒)  注意:如果已存在的hash表有时间,这里将会替换原有的时间 
     * @return true 成功 false失败 
     */  
    public boolean hset(String key,String item,Object value,long time) {  
         try {  
            redisTemplate.opsForHash().put(key, item, value);  
            if(time>0){  
                expire(key, time);  
            }  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            return false;  
        }  
    }  

    /** 
     * 删除hash表中的值 
     * @param key 键 不能为null 
     * @param item 项 可以使多个 不能为null 
     */  
    public void hdel(String key, Object... item){    
        redisTemplate.opsForHash().delete(key,item);  
    }   

    /** 
     * 判断hash表中是否有该项的值 
     * @param key 键 不能为null 
     * @param item 项 不能为null 
     * @return true 存在 false不存在 
     */  
    public boolean hHasKey(String key, String item){  
        return redisTemplate.opsForHash().hasKey(key, item);  
    }   

    /** 
     * hash递增 如果不存在,就会创建一个 并把新增后的值返回 
     * @param key 键 
     * @param item 项 
     * @param by 要增加几(大于0) 
     * @return 
     */  
    public double hincr(String key, String item,double by){    
        return redisTemplate.opsForHash().increment(key, item, by);  
    }  

    /** 
     * hash递减 
     * @param key 键 
     * @param item 项 
     * @param by 要减少记(小于0) 
     * @return 
     */  
    public double hdecr(String key, String item,double by){    
        return redisTemplate.opsForHash().increment(key, item,-by);    
    }    

  

还有步骤必须要完成,看(二)

 

 

 

推荐阅读