首页 > 数据库 >SpringBoot+Redis整合

SpringBoot+Redis整合

时间:2023-11-13 19:06:39浏览次数:37  
标签:SpringBoot Redis jedis user 整合 序列化 public redisTemplate User

SpringBoot+Redis整合

一.操作Json

1.1 pom文件

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.7.17</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.2.2</version>
        </dependency>
        <!--redis依赖-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.3</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <!--<scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>
    
    
    <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
    </dependency>
    
    </dependencies>

2.创建实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String name;
    private String pwd;
}

3.通用类

​ JedisPoolUtil

4.测试类

@Test
    public void test01(){
        Jedis jedis= JedisPoolUtils.getJedis();
        User user=new User(1,"张三","666");
        String jsonString = JSONObject.toJSONString(user);
        //存数据擦操作
        //设置数据到redis服务器
        jedis.set("user:1",jsonString);
        System.out.println(jedis.get("user:1"));
        
        //从redis服务器取数据操作
        //将字符串的格式转回Object类型;
        //parseObject(json字符串,User.class);
        User user2= JSONObject.parseObject(jedis.get("user:1"), User.class);
        System.out.println(user2);
        jedis.close();
        jedis.close();
    }

image-20231111192450978

5.集合测试类

@Test
    public void test02(){
        Jedis jedis= JedisPoolUtils.getJedis();
        List<User> userList = Arrays.asList(new User(2,"万凯","888"),new User(3,"tom","989"));
        String jsonString = JSONArray.toJSONString(userList);
        //存数据到redis服务器
        jedis.set("userList",jsonString);
        System.out.println(jedis.get("userList"));
        //将字符串转回来;
        String str=jedis.get("userList");
		
        //从redis服务器取数据操作;
         List<User>list= JSONArray.parseArray(str, User.class);
        //lambda方式;
         list.forEach(System.out::println);
        
        //之前的操作方式
         for (User user : userList2) {
            System.out.println(user.getId()+"\t"+user.getName()+"\t"+user.getPwd());
        }
         jedis.close();
    }

image-20231111192603750

二.整合RedisTemplate

SpringData

JDBCTemplate

jedis客户端,存在如下不足:

  1. connection管理缺乏自动化,connection-pool的设计缺少必要的容器支持。
  2. 数据操作需要关注“序列化”/“反序列化”,因为jedis的客户端API接受的数据类型为string和byte,对结构化数据(json,xml,pojo等)操作需要额外的支持。
  3. 事务操作纯粹为硬编码。
  4. pub/sub功能,缺乏必要的设计模式支持,对于开发者而言需要关注的太多。

spring-data-redis针对jedis提供了如下功能:

  • 1.连接池自动管理,提供了一个高度封装的“**RedisTemplate”**类

  • 2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口

    ValueOperations:String简单K-V操作
    SetOperations:set类型数据操作
    ZSetOperations:zset类型数据操作
    HashOperations:针对map类型的数据操作
    ListOperations:针对list类型的数据操作
    
  • 3.提供了对key的“bound”(绑定)便捷化操作API,可以通过bound封装指定的key,然后进行一系列的操作而无须“显式”的再次指定Key,即

    BoundKeyOperations
    BoundValueOperations
    BoundSetOperations
    BoundListOperations
    BoundSetOperations
    BoundHashOperations
    
  • 4.将事务操作封装,有容器控制。

  • 5.针对数据的“序列化/反序列化”,提供了多种可选择策略.

    RedisTemplate中API使用

2.1增加jar包依赖

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.17</version>
    </parent>

		<!--  data-redis依赖  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.7.5</version>
        </dependency>
 		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

2.2 测试代码

编写启动类

@SpringBootApplication
public class RedisApp {
    public static void main(String[] args) {
        SpringApplication.run(RedisApp.class);
    }
}

编写配置类

package com.yh.config;

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 redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        //使用jackson进行序列化
        Jackson2JsonRedisSerializer jsonRedisSerializer =
                new Jackson2JsonRedisSerializer(Object.class);
        //规定序列化规则
        ObjectMapper objectMapper = new ObjectMapper();
        /**
         * 第一个参数指的是序列化的域,ALL指的是字段、get和set方法、构造方法
         * 第二个参数指的是序列化哪些访问修饰符,默认是public,ANY指任何访问修饰符
         */
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        //指定序列化输入的类型,类必须是非final修饰的类
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jsonRedisSerializer.setObjectMapper(objectMapper);
        //序列化key value
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

测试类

@RunWith(SpringRunner.class)
@SpringBootTest(classes = RedisApp.class)
public class Demo03 {
    @Autowired
    RedisTemplate<String,Object> redisTemplate;
    /**
     * 对redisTemplate的依赖
     */

    @Test
    public void test03(){
        ValueOperations opsForValue = redisTemplate.opsForValue();
        opsForValue.set("name","chenguang");
        System.out.println(opsForValue.get("name"));
    }
    @Test
    public void test04(){
        User user=new User(5,"tomhs","tttt");
        ValueOperations opsForValue = redisTemplate.opsForValue();
        opsForValue.set("user"+user.getId(),user);

        User u = (User) opsForValue.get("user" + user.getId());
        System.out.println(u);
    }
    @Test
    public void test05(){
        List<User> userList = Arrays.asList(new User(2,"smith","99999"),new User(3,"king","kkkk"));
        ValueOperations opsForValue = redisTemplate.opsForValue();
    }
}

单对象格式:

image-20231113122235039

列表格式:

image-20231113122409213

三.布隆过滤器测试

​ 布隆过滤器本质上是一种数据结构,是一种巧妙的概率型数据结构,用来高效的插入和查询.作用是用来告诉使用者某样东西一定不存在或者可能存在。使用多个哈希函数,将一个数据映射到位图结构中。

查询某个变量的时候,只要这些对应的点是否是都是1:

  • 如果这些点有一个0,则被查询的变量一定不存在.
  • 如果都是1,则被查询的变量可能存在
  • image-20231112223815792
		<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>19.0</version>
        </dependency>

JAVA代码测试

	private static int size = 1000000;//预计要插入多少数据
    private static double fpp = 0.01;//期望的误判率
    private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size, fpp);

    public static void main(String[] args) {
        //插入数据
        for (int i = 0; i < 1000000; i++) {
            bloomFilter.put(i);
        }
        int count = 0;
        for (int i = 1000000; i < 2000000; i++) {
            if (bloomFilter.mightContain(i)) {
                count++;
                System.out.println(i + "误判了");
            }
        }
        System.out.println("总共的误判数:" + count);
    }

使用場景

布隆过滤器适用场景

1.网页爬虫中对URL的去重,避免爬取相同的URL地址
2.垃圾邮件过滤,从数十亿个垃圾邮件列表中判断邮箱是否是垃圾邮箱
3.秒杀系统,查看用户是否重复购买
4.数据库防止穿库。 Google Bigtable,HBase 和 Cassandra 以及 Postgresql 使用BloomFilter来减少不存在的行或列的磁盘查找。避免代价高昂的磁盘查找会大大提高数据库查询操作的性能。
业务场景中判断用户是否阅读过某视频或文章,比如抖音或头条,当然会导致一定的误判,但不会让用户看到重复的内容。
5.缓存宕机、缓存击穿场景,一般判断用户是否在缓存中,如果在则直接返回结果,不在则查询db,如果来一波冷数据,会导致缓存大量击穿,造成雪崩效应,这时候可以用布隆过滤器当缓存的索引,只有在布隆过滤器中,才去查询缓存,如果没查询到,则穿透到db。如果不在布隆器中,则直接返回。

标签:SpringBoot,Redis,jedis,user,整合,序列化,public,redisTemplate,User
From: https://blog.51cto.com/teayear/8348478

相关文章

  • 信息系统项目管理师论文-------整合管理论文范文
    整合管理论文范文某县传媒中心在“互联网+”驱动产业创新的格局下,将广电和报刊业务整合,实现传统媒体和新媒体深度融合,为此需打造一套新型《融媒体工作平台》,将音视频及稿件的采集、收录、编辑、策划、审核、分发等业务流程整合,实现“一次采集、多种生成、多元传播”的建设目标......
  • IDEA新建SpringBoot项目突然报错问题的解决
    问题描述在我使用IDEA新建SpringBoot项目时,突然出现这个错误:之前也是一直这么新建项目,这次突然出现这样的错误,哎呦,我真服啦~问题解决就是说吧,在我看了网上解决问题的教程之后,发现都没有问题,然后我就不死心地又试了试,发现就成功创建了,具体怎么解决的,我确实是不太清楚了。......
  • 213-springboot项目,maven结构,打war包的pom配置
    <projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"&......
  • springboot前后台博客系统
    源码私信或者公众号java大师获取博客简介:本博客采用SpringBoot+LayUI做为基础,进行的博客系统开发,与boot+vue相比,更为适合开发简单的系统,并且更容易上手,简单!高效!更易上手!SpringBoot+LayUI:快速开发:LayUI是一个简单的UI框架,它提供了易于使用的组件,可以快速构建界面。搭配Spring......
  • SpringBoot 项目优雅实现读写分离 | 京东云技术团队
    一、读写分离介绍当使用SpringBoot开发数据库应用时,读写分离是一种常见的优化策略。读写分离将读操作和写操作分别分配给不同的数据库实例,以提高系统的吞吐量和性能。读写分离实现主要是通过动态数据源功能实现的,动态数据源是一种通过在运行时动态切换数据库连接的机制。它允许应......
  • SpringBoot 项目优雅实现读写分离
    一、读写分离介绍当使用SpringBoot开发数据库应用时,读写分离是一种常见的优化策略。读写分离将读操作和写操作分别分配给不同的数据库实例,以提高系统的吞吐量和性能。读写分离实现主要是通过动态数据源功能实现的,动态数据源是一种通过在运行时动态切换数据库连接的机制。它允许......
  • 喜马拉雅 Redis 与 Pika 缓存使用军规
    作者:喜马拉雅董道光宣言:缓存不是万金油,更不是垃圾桶!!!缓存作为喜马拉雅至关重要的基础组件之一,每天承载着巨大的业务请求量。一旦缓存出现故障,对业务的影响将非常严重。因此,确保缓存服务的稳定和高效运行始终是我们的重要目标。下面是我们对喜马缓存历史故障复盘后总结的一套缓存使......
  • springboot集成EasyPoi,实现Excel/Word的导入导出
    前言在日常工作中,我们经常需要进行Excel或Word文档的导入和导出。这需要我们编写大量的代码和复杂的操作,从而增加了我们工作的难度。而EasyPoi就是针对这种情况而开发出来的一个简单易用的Java导入导出工具。EasyPoi是一个开源的Java导入导出工具,它提供了非常简单易用的API,可以让......
  • macOS 通过 docker 安装 redis 集群
    安装集群macOS通过docker来进行安装redis机群,解决开发环境临时使用的问题,完成本地redis集群环境搭建。安装步骤如下:查询主机ip信息,命令如下:ifconfig删除容器信息,如果步骤执行错误了,可以删除容器,然后重新执行第3步dockerrm-fredis-30001dockerrm-fredis-30002doc......
  • 基于C# Socket实现的简单的Redis客户端
    前言    Redis是一款强大的高性能键值存储数据库,也是目前NOSQL中最流行比较流行的一款数据库,它在广泛的应用场景中扮演着至关重要的角色,包括但不限于缓存、消息队列、会话存储等。在本文中,我们将介绍如何基于C#Socket来实现一个简单的Redis客户端类RedisClient,来演示构建请......