• SpringBoot入门 (七) Redis访问操作


    本文记录学习在SpringBoot中使用Redis。

    一 什么是Redis

      Redis 是一个速度非常快的非关系数据库(Non-Relational Database),它可以存储键(Key)与 多种不同类型的值(Value)之间的映射(Mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能。Redis主要有以下几个优点:

      1 性能极高,它每秒可执行约 100,000 个 Set 以及约 100,000 个 Get 操作;

      2 丰富的数据类型,Redis 对大多数开发人员已知的大多数数据类型提供了原生支持,这使得各种问题得以轻松解决;

      3 原子性,因为所有 Redis 操作都是原子性的,所以多个客户端会并发地访问一个 Redis 服务器,获取相同的更新值;

      4 丰富的特性,Redis 是一个多效用工具,有非常多的应用场景,包括缓存、消息队列(Redis 原生支持发布/订阅)、短期应用程序数据(比如 Web 会话、Web 页面命中计数)等。

      目前我们常用的Value的数据类型有String(字符串),Hash(哈希),List(列表),Set(集合),Zset(有序集合)。

    二 SpringBoot集成Redis

      SpringBoot提供了对Redis的集成的模块,包是spring-boot-starter-data-redis,它依赖于 spring-data-redis 和 lettuce,lettuce是一个线程安全的redis客户端。

      在pom.xml中引入依赖

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

      在application.properties中配置Redis的连接信息

    # redis 配置
    ## redis数据库索引(默认0)
    spring.redis.database=0
    ## redis 服务器地址
    spring.redis.host=localhost
    ## redis 服务器端口
    spring.redis.port=6379
    ## redis数据库密码(默认为空)
    spring.redis.password=
    ## redis连接池最大连接数(使用负数表示没有显示,默认8)
    spring.redis.lettuce.pool.max-active=8
    ## 连接池最大阻塞等待时间(使用负值表示没有限制,默认-1)
    spring.redis.lettuce.pool.max-wait=-1
    ## 连接池中的最大空闲连接 默认 8
    spring.redis.lettuce.pool.max-idle=8
    ## 连接池中的最小空闲连接 默认 0
    spring.redis.lettuce.pool.min-idle=0

      有了上边这两个步骤之后,我们启动服务后,SpringBoot就会帮我们连接到Redis服务器,并给我们提供了一个RedisTemplate类供我们使用操作Redis。我们在需要用的地方注入RedisTemplate就可以轻松完成操作。

    三 测试

      使用Junit做测试,在我们的单元测试类中注入RedisTemplate

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class RedisApplicationTests {
    
        @Autowired
        private RedisTemplate redisTemplate;
    
    }
    

      String字符串操作,value是一个字符串,通过delete(key)删除

    @Test
        public void testString() throws InterruptedException {
            //字符串
            ValueOperations strOps = redisTemplate.opsForValue();
            strOps.set("name", "梓&艺");
            System.out.println("字符串结果name:"+strOps.get("name"));
            //删除key
            redisTemplate.delete("name");
    }
    

      对象操作,value是一个对象

    @Test
        public void testObject() throws InterruptedException {
            ValueOperations objOps = redisTemplate.opsForValue();
            City city = new City(1, "X`A", "西安");
            objOps.set("city", city);
            System.out.println(objOps.get("city").toString());
            redisTemplate.delete("city");
    }
    

      设置key的过期时间,在set时加上过期时间,通过hasKey(key)来判断key是否还存在

    @Test
    public void testExpire(){
      //过期
            ValueOperations objOps1 = redisTemplate.opsForValue();
            City city1 = new City(1, "BJ", "北京");
            objOps1.set("expire", city1, 2000, TimeUnit.MILLISECONDS);
            System.out.println(objOps1.get("expire").toString());
            Thread.sleep(2000);
            System.out.println(redisTemplate.hasKey("expire"));  
    }
    

      hash哈希操作

    @Test
        public void testHash() {
            HashOperations hashOps = redisTemplate.opsForHash();
            hashOps.put("hash","hashKey","hashValue");
            System.out.println(hashOps.get("hash", "hashKey"));
        }
    

      在上边的代码中可以看出,Hash Set的时候就是在哈希表 Key 中的域(Field)的值设为 value。如果 Key 不存在,一个新的哈希表被创建并进行 Hash set 操作;如果域(Field)已经存在于哈希表中,旧值将被覆盖。

      List列表操作

    @Test
        public void testList() {
            ListOperations<String, String> listOps = redisTemplate.opsForList();
            listOps.leftPush("list","梓");
            listOps.leftPush("list","&");
            listOps.leftPush("list","艺");
            System.out.println(listOps.leftPop("list"));
        }
    

      列表操作时我们通过 leftPush 或者 rightPush 来将数据存入列表中,通过 leftPop 或者rightPop将数据取出来,我们可以利用它来实现一个队列。

      Set集合操作

    @Test
        public void testSet() {
            SetOperations<String, String> setOps = redisTemplate.opsForSet();
            setOps.add("set","梓");
            setOps.add("set","&");
            setOps.add("set","&");
            setOps.add("set","艺");
            System.out.println(setOps.members("set"));
        }
    

      Set是一个没有顺序的集合,key相同时,如果value已经存在了,后边进入的会把前边的覆盖掉

      ZSet有序集合操作

    @Test
        public void testZSet() {
            ZSetOperations zSetOps = redisTemplate.opsForZSet();
            zSetOps.add("zSet", "梓", 1);
            zSetOps.add("zSet", "&", 2);
            zSetOps.add("zSet", "艺", 3);
            zSetOps.add("zSet", "zi", 1);
            zSetOps.add("zSet", "yi", 3);
            System.out.println(zSetOps.rangeByScore("zSet", 1, 3));
        }
    

      add 方法的3个参数分别是key,value,数据插入位置。ZSet中存储的数据都是有顺序的,输出时顺序按照存储时设置的从小到大,如果遇到key相同,Value和顺序一样的,后边的会把前边的覆盖掉,range方法后边的2个参数时插入的位置。如上的输出

  • 相关阅读:
    git分支
    git使用
    多人协作
    python初心记录二
    python初心记录一
    Javascript 概念类知识
    想成为前端工程师?希望读完这篇文章能对你有所帮助。
    Egret note
    cocos2d-js 连连看
    PS置入图片之后保留选区方便C图
  • 原文地址:https://www.cnblogs.com/love-wzy/p/10338582.html
Copyright © 2020-2023  润新知