Redis之StringRedisTemplate使用

  • Post author:
  • Post category:其他




StringRedisTemplate的用法



Redis介绍

Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI

C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。



引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>



配置

spring:
  redis:
    host: localhost #Redis服务器地址
    port: 6379 #Redis端口号
    timeout: 300 # 连接超时时间(毫秒)
    database: 0 # Redis数据库索引(默认为0)
    password: # Redis 服务器密码,默认为空。生产中,一定要设置 Redis 密码!
    jedis:
      pool:
        max-active: 8 # 连接池最大连接数,默认为 8 。使用负数表示没有限制。
        max-idle: 8 # 默认连接数最大空闲的连接数,默认为 8 。使用负数表示没有限制。
        min-idle: 0 # 默认连接池最小空闲的连接数,默认为 0 。允许设置 0 和 正数。
        max-wait: -1 # 连接池最大阻塞等待时间,单位:毫秒。默认为 -1 ,表示不限制。



StringRedisTemplate

  • StringRedisTemplate继承RedisTemplate
  • 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
  • RedisTemplate使用的是JdkSerializationRedisSerializer 存入数据会将数据先序列化成字 节数组然后在存入Redis数据库。 StringRedisTemplate使用的是StringRedisSerializer



基本操作

	@Resource
    private StringRedisTemplate stringRedisTemplate;

操作字符串:stringRedisTemplate.opsForValue()

操作hash:stringRedisTemplate.opsForHash()

操作list:stringRedisTemplate.opsForList()

操作set:stringRedisTemplate.opsForSet()

操作有序set:stringRedisTemplate.opsForZSet()



string

public void redisString(){
        //存入数据
        stringRedisTemplate.opsForValue().set("key","value");
        //存入数据设置缓存时间 TimeUnit.SECONDS 单位:秒
        stringRedisTemplate.opsForValue().set("key","value",1200, TimeUnit.SECONDS);
        //如果不存在则插入,返回true为插入成功,false失败
        Boolean absent = stringRedisTemplate.opsForValue().setIfAbsent("key", "value");

        Map<String,String> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        //批量插入,key值存在会覆盖原值
        stringRedisTemplate.opsForValue().multiSet(map);

        //批量插入,如果里面的所有key都不存在,则全部插入,返回true,如果其中一个在redis中已存在,全不插入,返回false
        Boolean absent1 = stringRedisTemplate.opsForValue().multiSetIfAbsent(map);

        //获取值,key不存在返回null
        Object object = stringRedisTemplate.opsForValue().get("key");
        //批量获取,key不存在返回null
        List<String> list = stringRedisTemplate.opsForValue().multiGet(Arrays.asList("key1", "key2"));

        //获取指定字符串的长度
        Long size = stringRedisTemplate.opsForValue().size("key");
        //原有的值基础上新增字符串到末尾 返回长度
        Integer integer = stringRedisTemplate.opsForValue().append("key", "lemon");

        //获取原来key键对应的值并重新赋新值 返回原来值
        String str =stringRedisTemplate.opsForValue().getAndSet("key","lemon");

        //获取指定key的值进行减1,如果value不是integer类型,会抛异常,如果key不存在会创建一个,默认value为0
        stringRedisTemplate.opsForValue().decrement("keyint");
        //获取指定key的值进行加1,如果value不是integer类型,会抛异常,如果key不存在会创建一个,默认value为0
        stringRedisTemplate.opsForValue().increment("keyint");
        //删除指定key,成功返回true,否则false
        Boolean delete = stringRedisTemplate.opsForValue().getOperations().delete("key");
        //删除多个key,返回删除key的个数
        Long deleteL = stringRedisTemplate.opsForValue().getOperations().delete(Arrays.asList("key1", "key2"));
    }



list

public void redisList(){
        //在变量左边添加元素值。如果key不存在会新建,添加成功返回添加后的总个数
        Long leftPush = stringRedisTemplate.opsForList().leftPush("key","value");
        //向左边批量添加参数元素,如果key不存在会新建,添加成功返回添加后的总个数
        Long pushAll = stringRedisTemplate.opsForList().leftPushAll("key", "value1", "value2", "value3");
        //向集合最右边添加元素。如果key不存在会新建,添加成功返回添加后的总个数
        Long rightPush = stringRedisTemplate.opsForList().rightPush("key", "value4");
        //向右边批量添加参数元素,如果key不存在会新建,添加成功返回添加后的总个数
        Long pushAll2 = stringRedisTemplate.opsForList().rightPushAll("key", "value5", "value6", "value7");
        //向已存在的集合中添加元素。返回集合总元素个数 左边
        Long leftL = stringRedisTemplate.opsForList().leftPushIfPresent("key", "value");
        //向已存在的集合中添加元素。返回集合总元素个数 右边
        Long rightL = stringRedisTemplate.opsForList().rightPushIfPresent("key", "value");
        //获取集合长度
        Long size = stringRedisTemplate.opsForList().size("key");
        //移除集合中的左边第一个元素。返回删除的元素,如果元素为空,该集合会自动删除
        String leftPop = stringRedisTemplate.opsForList().leftPop("key");
        //移除集合中右边的元素。返回删除的元素,如果元素为空,该集合会自动删除
        String rightPop = stringRedisTemplate.opsForList().rightPop("key");
        //移除集合中左边的元素在等待的时间里,如果超过等待的时间仍没有元素则退出。
        String leftstr = stringRedisTemplate.opsForList().leftPop("key", 10, TimeUnit.SECONDS);
        //移除集合中右边的元素在等待的时间里,如果超过等待的时间仍没有元素则退出。
        String rightstr = stringRedisTemplate.opsForList().rightPop("key", 10, TimeUnit.SECONDS);
        //移除第一个集合右边的一个元素,插入第二个集合左边插入这个元素
        String s = stringRedisTemplate.opsForList().rightPopAndLeftPush("key", "key1");
        //在集合的指定位置插入元素,如果指定位置已有元素,则覆盖,没有则新增,超过集合下标+n则会报错。
        stringRedisTemplate.opsForList().set("key", 2, "value11");
        //从存储在键中的列表中删除等于值的元素的第一个计数事件。count> 0:删除等于从左到右移动的值的第一个元素;
        //count< 0:删除等于从右到左移动的值的第一个元素;count = 0:删除等于value的所有元素
        Long remove = stringRedisTemplate.opsForList().remove("key", 2, "value12");
        //截取集合元素长度,保留长度内的数据。
        stringRedisTemplate.opsForList().trim("key", 0, 3);
        //获取集合指定位置的值。
        Object listValue = stringRedisTemplate.opsForList().index("key", 3);
        //获取指定区间的值
        List<String> list = stringRedisTemplate.opsForList().range("key", 0, -1);
        //删除指定集合,返回true删除成功
        Boolean delete = stringRedisTemplate.opsForList().getOperations().delete("key");
    }



hash

 public void redisHash(){
        //新增hashmap值
        stringRedisTemplate.opsForHash().put("hash","hash-key","hash-value");
        //以map集合的形式添加键值对
        Map<String,String> map = new HashMap<>();
        map.put("hash-key2","hash-value2");
        map.put("hash-key3","hash-value3");
        stringRedisTemplate.opsForHash().putAll("hash",map);
        //如果变量值存在,在变量中可以添加不存在的的键值对,
        //如果变量不存在,则新增一个变量,同时将键值对添加到该变量。添加成功返回true否则返回false
        Boolean absent = stringRedisTemplate.opsForHash().putIfAbsent("hash", "hash-key", "value1");
        //获取指定变量中的hashMap值
        List<Object> values = stringRedisTemplate.opsForHash().values("hash");
        //获取变量中的键值对
        Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("hash");
        //获取变量中的指定map键是否有值,如果存在该map键则获取值,没有则返回null。
        Object value = stringRedisTemplate.opsForHash().get("hash", "hash-key");
        //获取变量中的键。
        Set<Object> keys = stringRedisTemplate.opsForHash().keys("hash");
        //获取变量的长度
        Long size = stringRedisTemplate.opsForHash().size("hash");
        //使变量中的键以long值的大小进行自增长。值必须为Integer类型,否则异常
        Long increment = stringRedisTemplate.opsForHash().increment("hash", "hash-key2", 1);
        //以集合的方式获取变量中的值。
        List<Object> valuelist= stringRedisTemplate.opsForHash().multiGet("hash", Arrays.asList("hash-key", "hash-key1"));
        // 删除变量中的键值对,可以传入多个参数,删除多个键值对。返回删除成功数量
        Long delete = stringRedisTemplate.opsForHash().delete("hash", "hash-key", "hash-key1");
        
    }



set

  public void redisSet(){

        //向变量中批量添加值。返回添加的数量
        Long add = stringRedisTemplate.opsForSet().add("set", "a", "b", "c");
        //获取变量的值
        Set<String> set = stringRedisTemplate.opsForSet().members("set");
        //获取变量中值得长度
        Long size = stringRedisTemplate.opsForSet().size("set");
        //随机获取变量中的某个元素
        String member = stringRedisTemplate.opsForSet().randomMember("set");
        //随机获取变量中指定个数的元素
        List<String> members = stringRedisTemplate.opsForSet().randomMembers("set", 2);
        //检查给定的元素是否在变量中,true为存在
        Boolean member1 = stringRedisTemplate.opsForSet().isMember("set", "b");
        //转义变量的元素值到另一个变量中
        Boolean move = stringRedisTemplate.opsForSet().move("set", "b", "set1");
        //弹出变量中的元素。当元素全部弹完,变量也会删除
        String pop = stringRedisTemplate.opsForSet().pop("set");
        //批量删除变量中的元素,返回删除的数量
        Long remove = stringRedisTemplate.opsForSet().remove("set1", "b");
        //通过集合求差值。
        Set<String> difference = stringRedisTemplate.opsForSet().difference("set", "set1");
        //将求出来的差值元素保存
        Long aLong = stringRedisTemplate.opsForSet().differenceAndStore("set", "set1", "set2");
        //获取去重的随机元素
        Set<String> set1 = stringRedisTemplate.opsForSet().distinctRandomMembers("set", 2);
        //获取两个变量中的交集
        Set<String> intersect = stringRedisTemplate.opsForSet().intersect("set", "set1");
        //获取2个变量交集后保存到最后一个变量上。
        Long aLong1 = stringRedisTemplate.opsForSet().intersectAndStore("set", "set1", "set2");
        //获取两个变量的合集
        Set<String> union = stringRedisTemplate.opsForSet().union("set", "set1");
        //获取两个变量合集后保存到另一个变量中
        Long aLong2 = stringRedisTemplate.opsForSet().unionAndStore("set", "set1", "set2");
    }



zset

 public void redisZSet(){

        //添加元素到变量中同时指定元素的分值。
        Boolean add = stringRedisTemplate.opsForZSet().add("zset", "a", 1);
        //通过TypedTuple方式新增数据。
        ZSetOperations.TypedTuple<String> typedTuple1 = new DefaultTypedTuple<>("b",2.0);
        ZSetOperations.TypedTuple<String> typedTuple2 = new DefaultTypedTuple<>("c",3.0);
        ZSetOperations.TypedTuple<String> typedTuple3 = new DefaultTypedTuple<>("d",4.0);
        Set<ZSetOperations.TypedTuple<String>> typedTupleSet = new HashSet<>();
        typedTupleSet.add(typedTuple1);
        typedTupleSet.add(typedTuple2);
        typedTupleSet.add(typedTuple3);
        Long zset = stringRedisTemplate.opsForZSet().add("zset", typedTupleSet);
        //获取指定区间的元素
        Set<String> zset1 = stringRedisTemplate.opsForZSet().range("zset", 0, -1);
        //于获取满足非score的排序取值。这个排序只有在有相同分数的情况下才能使用,如果有不同的分数则返回值不确定。
        Set<String> rangeByLex = stringRedisTemplate.opsForZSet().rangeByLex("zset",
                RedisZSetCommands.Range.range().lt("c"));
        //用于获取满足非score的设置下标开始的长度排序取值。
        Set<String> zset2 = stringRedisTemplate.opsForZSet().rangeByLex("zset", RedisZSetCommands.Range.range().lt("c"),
                RedisZSetCommands.Limit.limit().offset(1).count(2));
        //根据设置的score获取区间值。
        Set<String> zset3 = stringRedisTemplate.opsForZSet().rangeByScore("zset", 1, 3);
        //获取RedisZSetCommands.Tuples的区间值
        Set<ZSetOperations.TypedTuple<String>> zset4 = stringRedisTemplate.opsForZSet().rangeWithScores("zset", 1, 3);
       /* assert zset != null;
        for (ZSetOperations.TypedTuple<String> next : zset) {
            String value = next.getValue();
            Double score = next.getScore();
            System.out.println(value + "-->" + score);
        }*/
       //获取区间值的个数。
        Long zsetCount = stringRedisTemplate.opsForZSet().count("zset", 1, 3);
        //获取变量中指定元素的索引,下标开始为0
        Long rank = stringRedisTemplate.opsForZSet().rank("zset", "a");
        //匹配获取键值对,ScanOptions.NONE为获取全部键值对;
        // ScanOptions.scanOptions().match("C").build()匹配获取键位map1的键值对,不能模糊匹配。
        Cursor<ZSetOperations.TypedTuple<String>> zset6 = stringRedisTemplate.opsForZSet().scan("zset", ScanOptions.NONE);
       /* while (zset6.hasNext()) {
            ZSetOperations.TypedTuple<String> next = zset6.next();
            System.out.println(next.getValue() + "-->" + next.getScore());
        }*/
        //获取指定元素的分值
        Double score = stringRedisTemplate.opsForZSet().score("zset", "a");
        //获取变量中元素的个数
        Long zset7 = stringRedisTemplate.opsForZSet().zCard("zset");
        //修改变量中元素的分值
        Double score1 = stringRedisTemplate.opsForZSet().incrementScore("zset", "a", 2);
        //索引倒序排列指定区间的元素
        Set<String> zset8 = stringRedisTemplate.opsForZSet().reverseRange("zset", 1, 3);
        //倒序排列指定分值区间的元素
        Set<String> zset9 = stringRedisTemplate.opsForZSet().reverseRangeByScore("zset", 1, 3);
        //倒序排序获取RedisZSetCommands.Tuples的分值区间值
        Set<String> zset10 = stringRedisTemplate.opsForZSet().reverseRangeByScore("zset", 1, 3, 1, 2);
        //倒序排序获取RedisZSetCommands.Tuples的分值区间值。
        Set<ZSetOperations.TypedTuple<String>> zset11 = stringRedisTemplate.opsForZSet().reverseRangeByScoreWithScores("zset", 1, 5);
        /*assert zset != null;
        zset.iterator().forEachRemaining(e-> System.out.println(e.getValue() + "--->" + e.getScore()));*/
        //获取倒序排列的索引值
        Long aLong = stringRedisTemplate.opsForZSet().reverseRank("zset", "a");
        //获取2个变量的交集存放到第3个变量里面。
        Long aLong1 = stringRedisTemplate.opsForZSet().intersectAndStore("zset", "zset1", "zset2");
        //获取2个变量的合集存放到第3个变量里面。 返回操作的数量
        Long aLong3 = stringRedisTemplate.opsForZSet().unionAndStore("zset", "zset1", "zset2");
        //批量移除元素根据元素值。返回删除的元素数量
        Long remove = stringRedisTemplate.opsForZSet().remove("zset", "a", "b");
        //根据分值移除区间元素。返回删除的数量
        Long zset12 = stringRedisTemplate.opsForZSet().removeRangeByScore("zset", 1, 3);
        //据索引值移除区间元素。返回移除的元素集合
        Set<String> zset13 = stringRedisTemplate.opsForZSet().reverseRange("zset", 0, 4);
        
    }



五大常用数据类型使用场景



string

缓存:将数据以字符串方式存储 计数器功能:比如视频播放次数,点赞次数。

共享session:数据共享的功能,redis作为单独的应用软件用来存储一些共享数据供多个实例访问。

字符串的使用空间非常大,可以结合字符串提供的命令充分发挥自己的想象力



list

字典。键值对集合,即编程语言中的Map类型。适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值。适用于:存

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



hash

链表(双向链表),增删快,提供了操作某一段元素的API。适用于:最新消息排行等功能;消息队列。



set

集合。哈希表实现,元素不重复,为集合提供了求交集、并集、差集等操作。适用于:共同好友;利用唯一性,统计访问网站的所有独立ip;> 好友推荐时,根据tag求交集,大于某个阈值就可以推荐。



zset

有序集合。将Set中的元素增加一个权重参数score,元素按score有序排列。数据插入集合时,已经进行天然排序。适用于:排行榜;带权重的消息队列。



版权声明:本文为weixin_43479025原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。