cari
RumahJavajavaTutorialAnalisis senario penggunaan Java Redis

Analisis senario penggunaan Java Redis

May 09, 2023 pm 01:07 PM
javaredis

1. Sebagai cache

1.1 Mengapa menggunakan

Data disimpan dalam memori dan kelajuan pertanyaan data adalah pantas. Tekanan pangkalan data boleh dikongsi.

Analisis senario penggunaan Java Redis

1.2 Apakah jenis data yang sesuai untuk cache

Kekerapan pertanyaan agak tinggi dan kekerapan pengubahsuaian agak rendah.

Data dengan faktor keselamatan yang rendah

1.3 Gunakan redis sebagai cache

1.3.1 Kelas konfigurasi tidak digunakan

Perhatikan bahawa kelas entiti mesti bersiri :

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "tb_dept")
public class Dept implements Serializable {
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    private String name;
    private String realname;
}

Kebergantungan sepadan:

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--连接数据源-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!--mp的依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

Kod sepadan lapisan pengawal:

@RestController
@RequestMapping("order")
public class DeptController {
    @Resource
    private DeptService deptService;
    @GetMapping("getById/{id}")
    //order/getById/1
    //{}可以放多个,由下面的传参函数对应
    //@PathVariable:获取请求映射中{}的值
    public Dept getById(@PathVariable Integer id){
        return deptService.findById(id);
    }
    @GetMapping("deleteById/{id}")
    public String deleteById(@PathVariable Integer id){
        int i = deptService.deleteById(id);
        return i>0?"删除成功":"删除失败";
    }
    @GetMapping("insert")
    public Dept insert(Dept dept){
        Dept insert = deptService.insert(dept);
        return insert;
    }
    @GetMapping("update")
    public Dept update(Dept dept){
        Dept update = deptService.update(dept);
        return update;
    }
}

Kod sepadan lapisan perkhidmatan:

@Service
public class DeptService {
    @Resource
    private DeptMapper deptMapper;
    //当存储的value类型为对象类型使用redisTemplate
    //存储的value类型为字符串。StringRedisTemplate
    @Autowired
    private RedisTemplate redisTemplate;
    //业务代码
    public Dept findById(Integer id){
        ValueOperations forValue = redisTemplate.opsForValue();
        //查询缓存
        Object o = forValue.get("dept::" + id);
        //缓存命中
        if(o!=null){
            return (Dept) o;
        }
        Dept dept = deptMapper.selectById(id);
        if(dept!=null){
            //存入缓存中
            forValue.set("dept::"+id,dept,24, TimeUnit.HOURS);
        }
        return dept;
    }
    public int deleteById(Integer id){
        redisTemplate.delete("dept::"+id);
        int i = deptMapper.deleteById(id);
        return i;
    }
    public Dept insert(Dept dept){
        int insert = deptMapper.insert(dept);
        return dept;
    }
    public Dept update(Dept dept){
        redisTemplate.delete("dept::"+dept.getId());
        int i = deptMapper.updateById(dept);
        return dept;
    }
}

Sumber konfigurasi:

# Konfigurasikan sumber data
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb ? serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
#sql log
mybatis-plus.configuration.log-impl=org.apache.ibatis . logging.stdout.StdOutImpl
#Connect redis
spring.redis.host=192.168.22*.1**
spring.redis.port=6379

Lihat cache : Bahagian pertama kod adalah sama @sebelum pemberitahuan, dan bahagian kedua kod juga adalah pemberitahuan siaran yang sama. Kita boleh menggunakan AOP untuk memisahkan kod caching dan kod perniagaan.

Rangka kerja musim bunga juga sepatutnya dapat memikirkannya. --Ini boleh dilakukan menggunakan anotasi. Menghuraikan anotasi.

1.3.2 Gunakan kelas konfigurasi

(1) Tambahkan kelas konfigurasi cache ke

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // 配置序列化(解决乱码的问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600)) //缓存过期10分钟 ---- 业务需求。
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))//设置key的序列化方式
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) //设置value的序列化
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;

(2) Gunakan anotasi cache dayakan

Analisis senario penggunaan Java Redis

Konfigurasi dalaman: Analisis senario penggunaan Java Redis

Analisis senario penggunaan Java Redis

Analisis senario penggunaan Java Redis

2.2 Item inventoriAnalisis senario penggunaan Java Redis

2.2.1 lapisan pengawal

//业务代码
    //使用查询注解:cacheNames表示缓存的名称 key:唯一标志---dept::key
    //先从缓存中查看key为(cacheNames::key)是否存在,如果存在则不会执行方法体,如果不存在则执行方法体并把方法的返回值存入缓存中
    @Cacheable(cacheNames = {"dept"},key="#id")
    public Dept findById(Integer id){
        Dept dept = deptMapper.selectById(id);
        return dept;
    }
//先删除缓存在执行方法体。
    @CacheEvict(cacheNames = {"dept"},key = "#id")
    public int deleteById(Integer id){
        int row = deptMapper.deleteById(id);
        return row;
    }
    //这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中,实现缓存与数据库的同步更新。
    @CachePut(cacheNames = "dept",key="#dept.id")
    public Dept update(Dept dept){
        int insert = deptMapper.updateById(dept);
        return dept;
    }
Analisis senario penggunaan Java Redis2.2.2 lapisan dao

@RestController
@RequestMapping("bucket")
public class BucketController {
    @Autowired
    private BucketService bucketService;
    @GetMapping("update/{productId}")
    public String  testUpdate(@PathVariable Integer productId){
        String s = bucketService.updateById(productId);
        return s;
    }
}

2.2.3 lapisan entitiAnalisis senario penggunaan Java Redis

//此处写就不需要在启动类使用注解
@Mapper
public interface BucketMapper extends BaseMapper<Bucket> {
    public Integer updateBucketById(Integer productId);
}

2.2.4 lapisan perkhidmatan

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Bucket {
    @TableId(value = "productId",type = IdType.AUTO)
    private Integer productId;
    private Integer num;
}

2.2.5 pemeta
@Service
public class BucketService {
    @Resource
    private BucketMapper bucketMapper;
    public String updateById(Integer productId){
        //查看该商品的库存数量
        Bucket bucket = bucketMapper.selectById(productId);
        if(bucket.getNum()>0){
            //修改库存每次减1
            Integer integer = bucketMapper.updateBucketById(productId);
            System.out.println("扣减成功!剩余库存数:"+(bucket.getNum()-1));
            return "success";
        }else {
            System.out.println("扣减失败!库存数不足");
            return "fail";
        }
    }
}
2.2.6 Ketergantungan
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qy151wd.dao.BucketMapper">
    <update id="updateBucketById" parameterType="int">
        update bucket set num=num-1 where productId=#{productId}
    </update>
</mapper>
2.2.7 Keputusan ujian
Kami melihat bahawa inventori yang sama digunakan n kali. Dan inventori dalam pangkalan data adalah negatif. Disebabkan oleh isu keselamatan benang.
2.3 Penyelesaian
2.3.1 Gunakan kunci disegerakkan atau kunci

Lapisan perkhidmatan yang sepadan diubah suai kepada Analisis senario penggunaan Java Redis

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--连接数据源-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!--mp的依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

Jika kluster projek dibina, maka ini Kunci tidak sah.

2.3.2 Menggunakan redisTemplate

(1) Gunakan idea untuk membuka projek kelompok

Analisis senario penggunaan Java Redis( 2) Gunakan nginx

(3) Keputusan ujian

Analisis senario penggunaan Java Redis

dan mendapati terdapat nombor berulang dan negatif inventori.

Analisis senario penggunaan Java Redis(4) Penyelesaian

Analisis senario penggunaan Java RedisPerkhidmatan pengubahsuaian kod sepadan

@Service
public class BucketService {
    @Resource
    private BucketMapper bucketMapper;
    public String updateById(Integer productId){
        //加自动锁
        synchronized (this){
            //查看该商品的库存数量
            Bucket bucket = bucketMapper.selectById(productId);
            if(bucket.getNum()>0){
                //修改库存每次减1
                Integer integer = bucketMapper.updateBucketById(productId);
                System.out.println("扣减成功!剩余库存数:"+(bucket.getNum()-1));
                return "success";
            }else {
                System.out.println("扣减失败!库存数不足");
                return "fail";
            }
        }
    }
}

Perhatikan bahawa kelajuan pengukuran tekanan di sini tidak mudah untuk terlalu cepat (disyorkan) 100 utas dalam 5 saat)

Selepas ujian tekanan, keputusannya ialah:

Analisis senario penggunaan Java Redis

Atas ialah kandungan terperinci Analisis senario penggunaan Java Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Artikel ini dikembalikan pada:亿速云. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Bagaimanakah saya menggunakan Maven atau Gradle untuk Pengurusan Projek Java Lanjutan, Membina Automasi, dan Resolusi Ketergantungan?Bagaimanakah saya menggunakan Maven atau Gradle untuk Pengurusan Projek Java Lanjutan, Membina Automasi, dan Resolusi Ketergantungan?Mar 17, 2025 pm 05:46 PM

Artikel ini membincangkan menggunakan Maven dan Gradle untuk Pengurusan Projek Java, membina automasi, dan resolusi pergantungan, membandingkan pendekatan dan strategi pengoptimuman mereka.

Bagaimanakah saya membuat dan menggunakan perpustakaan Java Custom (fail JAR) dengan pengurusan versi dan pergantungan yang betul?Bagaimanakah saya membuat dan menggunakan perpustakaan Java Custom (fail JAR) dengan pengurusan versi dan pergantungan yang betul?Mar 17, 2025 pm 05:45 PM

Artikel ini membincangkan membuat dan menggunakan perpustakaan Java tersuai (fail balang) dengan pengurusan versi dan pergantungan yang betul, menggunakan alat seperti Maven dan Gradle.

Bagaimanakah saya melaksanakan caching pelbagai peringkat dalam aplikasi java menggunakan perpustakaan seperti kafein atau cache jambu?Bagaimanakah saya melaksanakan caching pelbagai peringkat dalam aplikasi java menggunakan perpustakaan seperti kafein atau cache jambu?Mar 17, 2025 pm 05:44 PM

Artikel ini membincangkan pelaksanaan caching pelbagai peringkat di Java menggunakan kafein dan cache jambu untuk meningkatkan prestasi aplikasi. Ia meliputi persediaan, integrasi, dan faedah prestasi, bersama -sama dengan Pengurusan Dasar Konfigurasi dan Pengusiran PRA Terbaik

Bagaimanakah saya boleh menggunakan JPA (Java Constence API) untuk pemetaan objek-objek dengan ciri-ciri canggih seperti caching dan malas malas?Bagaimanakah saya boleh menggunakan JPA (Java Constence API) untuk pemetaan objek-objek dengan ciri-ciri canggih seperti caching dan malas malas?Mar 17, 2025 pm 05:43 PM

Artikel ini membincangkan menggunakan JPA untuk pemetaan objek-relasi dengan ciri-ciri canggih seperti caching dan pemuatan malas. Ia meliputi persediaan, pemetaan entiti, dan amalan terbaik untuk mengoptimumkan prestasi sambil menonjolkan potensi perangkap. [159 aksara]

Bagaimanakah mekanisme kelas muatan Java berfungsi, termasuk kelas yang berbeza dan model delegasi mereka?Bagaimanakah mekanisme kelas muatan Java berfungsi, termasuk kelas yang berbeza dan model delegasi mereka?Mar 17, 2025 pm 05:35 PM

Kelas kelas Java melibatkan pemuatan, menghubungkan, dan memulakan kelas menggunakan sistem hierarki dengan bootstrap, lanjutan, dan pemuat kelas aplikasi. Model delegasi induk memastikan kelas teras dimuatkan dahulu, yang mempengaruhi LOA kelas tersuai

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini