Redis(2)---SpringBoot整合Redis

1.导入依赖

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <!-- spring boot redis Redis弹簧启动 -->

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-data-redis</artifactId>

        </dependency>

        <!-- Redis连接池 -->

        <dependency>

            <groupId>org.apache.commons</groupId>

            <artifactId>commons-pool2</artifactId>

        </dependency>

2.配置核心配置文件

# 应用名称

spring.application.name=redisdemo1

## Redis数据库索引(默认为0)

spring.redis.database=0

#Redis服务器地址

spring.redis.host=127.0.0.1

#Redis服务器连接端口

spring.redis.port=6379

#Redis服务器连接密码(默认为空)

spring.redis.password=

#连接池最大连接数(使用负值表示没有限制) 默认 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

3.创建控制器类,编写测试代码

3.1测试String类型

@RestController

@RequestMapping("/string")

public class StringController {

    @Autowired

    private RedisTemplate redisTemplate;

    @RequestMapping("/test.do")

    public String testString(){

        //设置key-value

        redisTemplate.opsForValue().set("username","chengshish");

        //得到指定键的数据值

        String str = (String) redisTemplate.opsForValue().get("username");

        System.out.println(str);

        return  str;

    }

}

还可以这样写:

public class StringController {

    @Autowired

    private RedisTemplate redisTemplate;

    @RequestMapping("/teststring.do")

    public  String testString(){

        //得到字符串键值对的绑定对象

        BoundValueOperations stringOper=redisTemplate.boundValueOps("name");

        //set(value)--设置字符串键值对的数据值

        stringOper.set("hello");

        //get()--得到指定键的数据值

        String rus=(String)stringOper.get();

        return  rus;

    }

opsForxxxx和boundxxxxOps区别

/**获取a,然后获取b,然后删除c,对同一个key有多次操作,按照opsForHash()的写法

     * 每次都是redisTemplate.opsForHash().xxx("key","value")写法很是啰嗦

     */

        int result = (Integer) redisTemplate.opsForHash().get("hash-key","a");

        result = (Integer)redisTemplate.opsForHash().get("hash-key","b");

        redisTemplate.opsForHash().delete("hash-key","c");



        /**

         * boundHashOps()则是直接将keyboundHashOperations对象进行了绑定,

         * 后续直接通过boundHashOperations对象进行相关操作即可,写法简洁,不需要

         * 每次都显式的将key写出来

         */

        BoundHashOperations<String, String, Object> boundHashOperations = redisTemplate.boundHashOps("hash-key");

    result = (Integer) boundHashOperations.get("a");

    result = (Integer) boundHashOperations.get("b");

    boundHashOperations.delete("c");

但是当我们查看keys * 会发现一个问题,就是加进来的key不是我们想的那样,如下图      

解决方法:需要进行序列化

4.创建配置类,进行序列化

固定模板,以后直接使用

import com.fasterxml.jackson.annotation.JsonAutoDetect;

import com.fasterxml.jackson.annotation.PropertyAccessor;

import com.fasterxml.jackson.databind.ObjectMapper;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.redis.connection.RedisConnectionFactory;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;

import org.springframework.data.redis.serializer.StringRedisSerializer;



@Configuration

public class RedisConfig {

    @Bean

    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){

        //我们为了自己开发方便,一般直接使用<String,Object>

        RedisTemplate<String, Object> template = new RedisTemplate<>();

        template.setConnectionFactory(factory);

        //json序列化配置

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper om = new ObjectMapper();

        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

        jackson2JsonRedisSerializer.setObjectMapper(om);

        //String的序列化

        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        //key采用String的序列化方式

        template.setKeySerializer(stringRedisSerializer);

        //hashkey也采用String的序列化方式

        template.setHashKeySerializer(stringRedisSerializer);

        //value序列化方式采用jackson

        template.setValueSerializer(jackson2JsonRedisSerializer);

        //hashvalue序列化方式采用jackson

        template.setHashValueSerializer(jackson2JsonRedisSerializer);

        template.afterPropertiesSet();

        

        return template;

    }

}

测试后发现:

 

5.五大类型测试

5.1 key-value(String类型)

@SpringBootTest

class Redisdemo1ApplicationTests {

    @Autowired

    @Qualifier("redisTemplate")

    private RedisTemplate redisTemplate;



    @Test

    void StringDemo() {

        System.out.println("-----------数字---------------");

        //keyboundValueOps对象进行了绑定

        BoundValueOperations ageOps = redisTemplate.boundValueOps("age");

        //设置age

        ageOps.set(23);

        //age加值

        ageOps.increment(22.3);

        Double age = (Double) ageOps.get();

        System.out.println(age);//45.3



        System.out.println("--------------字符串----------------------");

        //append的数据值的时候,没有成功

        //原因是保存的字符串键值对中的数据值没有序列化

        //所以就需要对字符串键值对中的数据值进行序列化

        redisTemplate.setValueSerializer(new StringRedisSerializer());

        BoundValueOperations nameOps = redisTemplate.boundValueOps("name");

        //设置name

        nameOps.set("lisi");

        //追加值

        nameOps.append("唐小妃");

        String name = (String) nameOps.get();

        System.out.println(name);//lisi唐小妃

        //一个汉字三个字节

        System.out.println(nameOps.size());



        //删除key

         redisTemplate.delete("age");

          redisTemplate.delete("name");

        //也可以一次性删除多个

        /*

        ArrayList<String> list = new ArrayList<>();

        list.add("name");

        list.add("age");

        redisTemplate.delete(list);

         */

    }

5.2 key-value(Set类型)

@Test

void SetDemo(){

    BoundSetOperations studentOps = redisTemplate.boundSetOps("student");

    /*一个一个添加

    studentOps.add("唐小妃");

    studentOps.add("波斯客");

    studentOps.add("城小将");

     */

    //也可以添加一组数据

    String[] setarray={"卫小青","去病","岳小飞"};

    studentOps.add(setarray);

    //删除一个set值

    studentOps.remove("去病");

    //删除一组set数据

    studentOps.remove(new String[]{"城小将","波斯客"});

    //member提取set中数据

    Set members = studentOps.members();

    System.out.println(members);//[卫小青, 唐小妃, 岳小飞]

    //set集合中的个数

    System.out.println(studentOps.size());//3

    //随机抽取count个元素

    Set randomMembers = studentOps.distinctRandomMembers(2);

    System.out.println(randomMembers);

}

5.3 key-value(List类型)

@Test

void ListDemo() {

    BoundListOperations personOps = redisTemplate.boundListOps("person");

    //从左向右添加,最后一个排在开头

    personOps.leftPush("许褚");

    personOps.leftPush("典韦");

    personOps.leftPush("徐晃");

    personOps.leftPush("徐晃");

    personOps.leftPush("张辽");

    personOps.leftPush("夏侯惇");

    BoundListOperations peopleOps = redisTemplate.boundListOps("people");

    //从右向左添加

    peopleOps.rightPush("许褚");

    peopleOps.rightPush("典韦");

    peopleOps.rightPush("徐晃");

    peopleOps.rightPush("徐晃");

    peopleOps.rightPush("张辽");

    peopleOps.rightPush("夏侯惇");

    //移除list中第一个元素,返回被删除的值

    Object obj1 = personOps.leftPop();

    System.out.println(obj1);//夏侯惇

    //移除list中最后一个元素,返回被删除的值

    Object obj2 = personOps.rightPop();

    System.out.println(obj2);//许褚

    //list集合中的元素个数

    System.out.println(personOps.size());//4

    //返回指定范围内的元素

    List list = personOps.range(1, 2);

    System.out.println(list);//[徐晃, 徐晃]

    //remove(count,obj)---从列表里移除前 count 次出现的值为 value 的元素。

    //这个 count 参数通过下面几种方式影响这个操作:

    //count > 0: 从头往尾移除值为 value 的元素。

    //count < 0: 从尾往头移除值为 value 的元素。

    //count = 0: 移除所有值为 value 的元素。

    peopleOps.remove(2,"典韦");//2个典韦消失

    //根据索引位置查询元素值

    System.out.println(peopleOps.index(4));//夏侯惇

}

 

 

5.4 key-value(Hash类型)

@Test

void HashDemo(){

    BoundHashOperations myhashOps = redisTemplate.boundHashOps("myhash");

    //put 添加key-value数据

    myhashOps.put("1","唐小妃");

    myhashOps.put("2","城小将");

    myhashOps.put("3","卫小青");

    myhashOps.put("4","嬴小政");

    myhashOps.put("5","武小天");

    //返回hash中所有的键

    Set keys = myhashOps.keys();

    System.out.println(keys);//[1, 2, 3, 4, 5]

    //返回hash中所有的value

    List values = myhashOps.values();

    System.out.println(values);//[唐小妃, 城小将, 卫小青, 嬴小政, 武小天]

    //hash中键值对个数

    System.out.println(myhashOps.size());//5

    //根据key移除一个键值对数据,返回值为移除元素的个数

    System.out.println(myhashOps.delete("3"));//1    卫小青已被删除



}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java-请多指教

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值