首页 > 数据库 >redis的使用场景-热点数据缓存

redis的使用场景-热点数据缓存

时间:2024-07-27 17:24:32浏览次数:15  
标签:场景 redis springframework 缓存 user new import id

1.什么是缓存?

把一些经常访问的数据放入缓存中,减少访问数据库的频率,减少数据库的压力,从而提高程序的性能。【内存中存储】

2.缓存的原理

通过上图可以看出程序首先访问缓存,如果缓存中有访问的数据会直接方会给客户端,不需要访问数据库,如果缓存中没有需要的数据则访问数据库,命中后返回给客户端的同时存放到缓存当中,方便下次访问直接命中缓存,减少数据库的压力。

3.什么样的数据适合放入缓存中?

3.1 访问频率高且修改频率低的数据。

3.2 数据安全性低的数据。

4. 哪些组件可以用作缓存?

4.1 redis组件

4.2 memory组件

4.3 ehcache组件等

5.Java如何使用redis实现缓存功能?

package com.wzy.springrediscache.service.impl;

import com.wzy.springrediscache.dao.UserDao;
import com.wzy.springrediscache.entity.User;
import com.wzy.springrediscache.service.UserService;
import com.wzy.springrediscache.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

/**
 * @program: spring-redisCache
 * @description:
 * @author: 顾安
 * @create: 2024-07-25 09:49
 **/
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    @Autowired
    private RedisTemplate redisTemplate;
    @Override
    public R getUser(Integer id) {
        ValueOperations<String, Object> forValue = redisTemplate.opsForValue();
        Object o = forValue.get("user::" + id);
          //判断是否为空,如果不为空直接返回
        if (o != null) {
            User user = (User) o;
            return new R(200, "success", user);
        }
        //缓存没有命中
        User user = userDao.selectById(id);
//判断数据库是否为空
        if (user!=null){
         //放入缓存中
            forValue.set("user::"+id,user);
        }
        return new R(200,"查询成功",user);
    }

    //添加操作不适合做缓存
    @Override
    public R add(User user) {
        int insert = userDao.insert(user);
        return new R(200,"添加成功",insert);
    }

    @Override
    public R update(User user) {
        int i = userDao.updateById(user);
//判断是否为空
        if (i>0){
//把修改后的对象放入缓存中
            redisTemplate.opsForValue().set("user::"+user.getId(),user);
        }
        return new R(200,"修改成功",i);
    }

    @Override
    public R delete(Integer id) {
        int i = userDao.deleteById(id);
//判断是否删除成功
        if (i>0){
//删除缓存中的key
            redisTemplate.delete("user::"+id);
        }
        return new R(200,"删除成功",i);
    }
}

使用这种可以方式实现缓存,但是业务代码除了需要维护核心业务功能外,还需要维护缓存的代码

还可以使用aop切面编程解决以上问题,spring提供了aop缓存注解

以下是配置注解的配置类

 @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;
    }

并需要在启动类上加上@EnableCaching该注解

package com.wzy.springrediscache.service.impl;

import com.wzy.springrediscache.dao.UserDao;
import com.wzy.springrediscache.entity.User;
import com.wzy.springrediscache.service.UserService;
import com.wzy.springrediscache.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

/**
 * @program: spring-redisCache
 * @description:
 * @author: 顾安
 * @create: 2024-07-25 09:49
 **/
@Service
public class UserServiceImpl01 implements UserService {
    @Autowired
    private UserDao userDao;
    @Autowired
    private RedisTemplate redisTemplate;
//该注解用于查询   cacheNames 表示指定了缓存的名称  key 表示存入哪个条目的键
    @Cacheable(cacheNames = "user",key = "#id")
    @Override
    public R getUser(Integer id) {

        User user = userDao.selectById(id);
        return new R(200,"查询成功",user);
    }

    @Override
    public R add(User user) {
        int insert = userDao.insert(user);
        return new R(200,"添加成功",insert);
    }
//改注解用于修改
    @CachePut(cacheNames = "user",key = "#user.id")
    @Override
    public R update(User user) {
        int i = userDao.updateById(user);
        return new R(200,"修改成功",i);
    }
//该注解用于删除
    @CacheEvict(cacheNames = "user",key = "#id")
    @Override
    public R delete(Integer id) {
        int i = userDao.deleteById(id);
        return new R(200,"删除成功",i);
    }
}

标签:场景,redis,springframework,缓存,user,new,import,id
From: https://blog.csdn.net/wuzhaoyang11/article/details/140698532

相关文章

  • 常用的NOSQL产品——redis(上)
    一,什么是NOSQLnosql[notonlysql]不仅仅是sql。所有非关系型数据库的统称。除去关系型数据库之外的都是非关系数据库。NOSQL和RDBMS的区别RDBMS--关系型数据库得到通称-高度组织化结构化数据。 -结构化查询语言(SQL)sql语句 -数据和关系都存储在单独的表中。-数据......
  • 缓存的简介以及Mybatis缓存中一级缓存和二级缓存
    简介我们所有的查询都需要连接数据库,连接数据库比较耗资源,那么如何解决耗资源的问题呢?    我们可以把一次查询的结果暂存在一个可以直接取到的地方——>内存    放在内存里的这一些查询的数据就叫缓存,这是什么意思呢,我们再次查询相同数据的时     ......
  • 业务场景---Token无感刷新
    业务场景描述假设用户正在填写一个复杂的表单,由于表单内容繁多,用户花费了很长时间才填完。这时,如果Token已经过期,系统会让用户重新登录,这种体验显然是非常糟糕的。为了避免这种情况,我们需要在Token即将过期或已经过期时,自动刷新Token,而不影响用户正在进行的操作。技术实现思路......
  • windows redis5使用,下载安装
    1.Reids下载Redis对windows支持停留在3版本,在github看到有大佬适配的5版本可用地址:https://github.com/tporadowski/redis/releases访问不了的可在此链接下载:https://download.csdn.net/download/qq_51355375/895851952.Redis使用2.1cmd启动redis-server.exe......
  • CXL与NVME融合场景下, 计算存储应用案例分析
    场景1:数据写入之前目标是避免数据从存储设备传输到主机内存再返回存储设备的传统过程中的数据搬运成本。通过利用CXL和NVMe技术的结合,可以在存储层直接对数据进行处理,即所谓的计算存储(ComputationalStorage)。这特别适用于那些需要对数据进行快速处理然后存储的场景,比如数据......
  • Redis系列---【Linux系统离线安装redis5.0.7】
    Linux系统离线安装redis5.0.71.下载redis安装包方式一:shell命令下载wgethttp://download.redis.io/releases/redis-5.0.7.tar.gz方式二:手动官网下载官网地址:https://redis.io/download2.上传到服务器上传到/opt/app/middles/目录下3.解压并安装tar-zvxfredi......
  • redis的使用场景-热点数据缓存(把经常访问的数据放入缓存减少数据库压力)
    一、使用redis实现(不推荐,会增加业务代码维护)@ServicepublicclassClazzServiceImplimplementsClazzService{@AutowiredprivateClazzDaoclazzDao; //注入mapper@AutowiredprivateRedisTemplate<String,Object>redisTemplate; //调用redis使用@Overridep......
  • Redis应用场景-分布式锁
    1.创建springboot项目2.添加依赖<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="htt......
  • 易优CMS模板标签SQL数据查询查询数据表ey_arctype,指定栏目ID的基本信息,不使用数据缓存
    【基础用法】标签:sql描述:用于获取MySQL数据库内容的标签。用法:{eyou:sqlsql=''cachetime='3600'empty='没有数据'}{$field.数据表相应的字段名称}{/eyou:sql}属性:sql=''需要查询的SQL语句cachetime='3600'数据缓存时间,默认缓存25小时,即86400秒empty=''没有数据时显示......
  • 美国站群vps云服务器的应用场景和使用方法
    美国站群VPS云服务器在多站点托管、SEO优化、高可用性与稳定性、成本效益、安全性以及特定行业应用等方面具有广泛的应用场景。美国站群VPS云服务器是一种高性能、高稳定性的虚拟专用服务器解决方案,特别适用于需要托管和管理多个网站或应用的场景。以下是美国站群vps云服务器详细......