在SpringBoot中集成Redis

在 SpringBoot 中集成 Redis

  • Spring提供两种Template操作Redis,分别是:StringRedisTemplate 和 RedisTemplate,区别如下:

    • StringRedisTemplate
      • StringRedisTemplate使用的是 StringRedisSerializer 序列化String
      • 主要用来存储字符串,StringRedisSerializer的泛型指定的是String。当存入对象时,会报错 :can not cast into String。
      • 可见性强,更易维护。如果过都是字符串存储可考虑用StringRedisTemplate
    • RedisTemplate
      • RedisTemplate使用的是 JdkSerializationRedisSerializer 序列化对象
      • 可以用来存储对象,但是要实现Serializable接口。
      • 以二进制数组方式存储,内容没有可读性。
  • 在 SpringBoot中 整合 Redis , StringRedisTemplate的例子RedisTemplate 类详解

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
    #redis的ip地址  
    spring.redis.hostName=127.0.0.1
    #数据库,默认为0
    spring.redis.database=0
    #端口号  
    spring.redis.port=6379
    #如果有密码  
    spring.redis.password=
    #客户端超时时间单位是毫秒 默认是2000 
    spring.redis.timeout=10000  
    
    /* stringRedisTemplate.opsForValue();//操作字符串
      stringRedisTemplate.opsForHash();//操作hash
      stringRedisTemplate.opsForList();//操作list
      stringRedisTemplate.opsForSet();//操作set
      stringRedisTemplate.opsForZSet();//操作有序set  */
    
    @Autowired
    StringRedisTemplate stringRedisTemplate;
    
    @Test
    public void testRadis(){
     
      stringRedisTemplate.delete("key");//根据key删除缓存
      stringRedisTemplate.hasKey("key");//检查key是否存在,返回boolean值
      
      stringRedisTemplate.expire("setkey",1000 , TimeUnit.MILLISECONDS);//设置过期时间
      stringRedisTemplate.getExpire("key");//根据key获取过期时间
      stringRedisTemplate.getExpire("key",TimeUnit.SECONDS);//根据key获取过期时间并换算成指定单位
    }
    
    • String 字符串使用说明

    • 可以是字符串、整数或者浮点数

    • 对整个字符串或者字符串的其中一部分执行操作;对象和浮点数执行 自增(increment)或者自减(decrement)

    • 命令

      set hello world
      get hello
      
    • Java 代码

      //redisTemplate 有两个方法经常用到, 一个是opsForXXX一个是boundXXXOps, XXX是value的类型,前者获取到一个Opercation, 但是没有指定操作的key, 可以在一个连接(事务)内操作多个key以及对应的value; 后者会获取到一个指定了key的operation,在一个连接内只操作这个key对应的value.
      stringRedisTemplate.boundValueOps("key").increment(-1); //val做-1操作
      stringRedisTemplate.boundValueOps("key").increment(1);  //val +1
      
      //向redis里存入数据和设置缓存时间(5分钟)
      stringRedisTemplate.opsForValue().set("key", "value", 60*5, TimeUnit.SECONDS);
      stringRedisTemplate.opsForValue().get("key");//根据key获取缓存中的val
      stringTemplate.delete("key");
      
      stringRedisTemplate.opsForValue.set("liu10", "6"); // 新增或更新
      stringRedisTemplate.opsForValue.increment("liu10", 1);   // 加 1
      stringRedisTemplate.opsForValue.append("liu10", "haha");  // 追加字符串
      
      Map<String,String> param = new HashMap<String,String>();
      param.put("liu6", "liu6");
      param.put("liu7", "liu7");
      stringRedisTemplate.opsForValue.multiSet(param);  //为多个键分别设置它们的值
      
  • List 列表

    • 列表(链表)是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或尾部(右边)。类似 双向链表

    • 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值来查找或者移除元素

    • 适用于:最新消息排行等功能;消息队列。

    • 命令

      DEL runoob
      lpush runoob redis
      lpush runoob mongodb
      lrange runoob 0 10
      
    • Java 代码

      //先进后出(左进左出)
      stringRedisTemplate.opsForList.leftPush("li1", "a");  // 添加
      stringRedisTemplate.opsForList.leftPush("li1", "b");
      List<Object> range = stringRedisTemplate.opsForList.range("li1", 0, -1);  // 查询
      for (Object object : range) {
        System.out.println(object);//c b a
      }
      
      List<Object> param = new ArrayList<Object>();  // 批量添加
      stringRedisTemplate.opsForList.leftPushAll("li4", param);
      
      stringRedisTemplate.opsForList.size("li3");
      stringRedisTemplate.opsForList.trim("li2", 1, -1);  // 
      stringRedisTemplate.opsForList.remove("li15", 1, "b");  // 
      stringRedisTemplate.opsForList.leftPop("li17");     // 
      
      //先进先出(右进左出)
      stringRedisTemplate.opsForList.rightPush("li7", "a");
      stringRedisTemplate.opsForList.rightPush("li7", "b");
      stringRedisTemplate.opsForList.rightPush("li7", "c");
      List<Object> range = stringRedisTemplate.opsForList.range("li7", 0, -1);
      for (Object object : range) {
        System.out.println(object);//a b c
      }
      
  • Hash 散列

    • 散列可以让用户将多个键值对存储到一个Redis键里面,即编程语言中的Map类型,适合存储对象

    • 可以像数据库中update一个属性一样只修改某一项属性值。

    • 适用于:存储、读取、修改用户属性。也可以用Hash做表数据缓存

    • 命令

      DEL runoob
      HMSET runoob field1 "Hello" field2 "World"
      HGET runoob field1
      
    • Java 代码

      stringRedisTemplate.opsForHash.put("he1", "key1", "a");
      stringRedisTemplate.opsForHash.put("he1", "key2", "b");
      stringRedisTemplate.opsForHash.put("he1", "key3", "c");
      Map<String, Object> entries = stringRedisTemplate.opsForHash.entries("he1"); // 全部
      stringRedisTemplate.opsForHash.get("he1", "key1");   // 获取 1 个
      
      Map<String,Object> param = new HashMap<String,Object>();  // 批量添加
      stringRedisTemplate.opsForHash.putAll("he2", param);
      
      stringRedisTemplate.opsForHash.increment("he1", "key3", 1);  // 加 1
      stringRedisTemplate.opsForHash.hasKey("he1", "key2"); // true
      
  • Set 无序集合

    • 集合成员是唯一的,这就意味着集合中不能出现重复的数据

    • Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)

    • 适用于:共同好友;利用唯一性,统计访问网站的所有独立ip; 好友推荐时,根据tag求交集,大于某个阈值就可以推荐。

    • 命令

      DEL runoob
      sadd runoob redis
      smembers runoob
      
    • Java 代码

      stringRedisTemplate.opsForSet().add("setkey", "1","2","3"); //向指定key中存放set集合 
      stringRedisTemplate.opsForSet.members("setkey");  // 返回集合中的所有成员
      
      stringRedisTemplate.opsForSet.size("setkey");     // 无序集合的大小长度
      stringRedisTemplate.opsForSet().isMember("setkey", "1");//根据key查看是否存在指定数据
      stringRedisTemplate.opsForSet().isMember("version_available_ios", version);
      
  • ZSet 有序集合

    • Redis 有序集合和无序集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。有序集合的成员是唯一的,但分数(score)却可以重复。redis正是通过分数来为集合中的成员进行从小到大的排序

    • 数据插入集合时,已经进行天然排序。

    • 适用于:排行榜;

    • 命令

      DEL runoob
      zadd runoob 0 redis
      zadd runoob 0 mongodb
      ZRANGEBYSCORE runoob 0 1000
      
    • Java 代码

      stringRedisTemplate.opsForZSet().add("test:sart_service:rank", "301", 2);
      // 获取分数值范围在 min <= score <= max 之间的数据
      zSetValue = stringRedisTemplate.opsForZSet().rangeByScore(redisKey, min, max);  
      // 倒序排列 带上分数 获取从start行到end行之间的数据, 
      Set<ZSetOperations.TypedTuple<String>> typedTuples = stringRedisTemplate.opsForZSet()
        .reverseRangeWithScores(redisKey, start, end);
      
      stringRedisTemplate.opsForZSet().incrementScore("test:sart_service:rank", "301", -1);
      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值