精华内容
下载资源
问答
  • 先更新数据库还是先更新redis
    2020-08-09 13:42:44

    https://zhuanlan.zhihu.com/p/98909029
    采取哪种方法比较好呢?

    先更新数据库,再更新缓存

    先删除缓存,再更新数据库(先删除缓存,再更新数据库,再删除缓存)

    先更新数据库,再删除缓存

    更多相关内容
  • 一个简易版的定时任务更新Redis中的数据 demo @Scheduled(fixedRate = 10000) public void schedule(){ //定时更新当月的排行榜数据 LocalDate localDate = LocalDate.now(); ExpendFrontParam ...

    概述

    一个简易版的定时任务更新Redis中的数据

    demo

    	
       @Scheduled(cron = "0 48 15 * * ?")
        public void schedule(){
    
           //定时更新当月的排行榜数据
            LocalDate localDate = LocalDate.now();
    
            ExpendFrontParam expendFrontParam = new ExpendFrontParam();
            expendFrontParam.setAcct(localDate);
    
            //不管存不存在,都去查一次数据库
            List<Expend> expendList = iExpendService.findRankPay(expendFrontParam);
            redisTemplate.opsForValue().set("rank_pay_" + Expend.class.getSimpleName(), expendList);
            
            System.out.println("scheduled");
    
    
        }
    

    需要注意一点的cron = “0 48 15 * * ?“是每天的15:48分统计一次,如果为”* 48 15 * * ?”,则表示每秒都会统计一次,然后15:48也会统计一次,但是也就不符合每天15:48分统计一次的设计了,下面补充一下corn的只是把

    也可以使用Corn表达式,

    它有6个域,
    Seconds: 0-59,0秒执行,30秒执行
    Minutes: 0-59,
    Hours:0-23
    DayofMonth: 1-31的整数,每月的第几天
    Month:1-12
    DayofWeek:星期几执行,1-7,1代表周日,2代表星期一

    ?代表某个域放弃指定规则,只有一个?号,

    -表示范围,5-20,秒为0,表示5分钟执行一次,20分钟执行一次

    /表示起始时间开始触发, 5/20,表示第5分钟执行,过20分钟执行一次

    比如:

    0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
    0 0/30 9-17 ? 朝九晚五每半小时
    0 0 12 ?* WED 每个星期三12点触发
    0 15 10 ? * *

    展开全文
  • 今天小编就为大家分享一篇关于SpringBoot AOP控制Redis自动缓存和更新的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 前言:如何保证redis与mysql数据一致性呢? 网上大部份答案都是延迟双删, 现在我就将另外一个解方案分享给大家,我自己也在最近项目中应有上来了。 1、开启 biglog 日志 (根据自己mysql配置文件位置更改) vim /...

    前言:如何保证redis与mysql数据一致性呢? 网上大部份答案都是延迟双删, 现在我就将另外一个解方案分享给大家,我自己也在最近项目中应有上来了。

    1、开启 biglog 日志 (根据自己mysql配置文件位置更改)

    vim /etc/my.cnf
    

    添加配置

    [mysqld]
    log-bin=mysql-bin # 开启binlog
    binlog-format=ROW # 选择ROW模式
    server_id=1 # 配置MySQL replaction需要定义,不和Canal的slaveId重复即可
    

    2、重启MySQL ,查看配置是否生效

    show variables like 'log_bin';
    

     3. RabbitMQ 队列创建 

    • 添加交换机 canal_exchange

    • 添加队列 canal_queue

    • 队列绑定交换机

    4. Canal 配置和启动

    Canal Server下载

    进入下载地址,选择 canal.deployer-1.1.5.tar.gz

    Canal Server配置

    需要配置的东西就两项,一个是监听数据库配置,另一个是 RabbitMQ 连接配置。

    改动的两个文件分别是 Canal 配置文件 canal.properties 和 实例配置文件 instance.properties

    ㊙️:一个 Server 可以配置多个实例监听 ,Canal 功能默认自带的有个 example 实例,本篇就用 example 实例 。如果增加实例,复制 example 文件夹内容到同级目录下,然后在 canal.properties 指定添加实例的名称。

    解压出来的目录信息:

    canal.properties

    配置 Canal 服务方式为 RabbitMQ 和连接配置

    进入到conf文件,打开canal.properties

    把原理tcp模式改成rabbitMQ

     

    到这里我们将canal连接rabbitMQ配置完成

    instance.properties

    监听数据库配置

    cd /example 目录下

     

     5. SpringBoot 整合 Canal + RabbitMQ

    引入maven依赖

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

    RabbitMQ连接配置

    spring:
      rabbitmq:
        host: ip
        port: 端口
        username: 用户名
        password: 密码
    

    RabbitMQ 监听同步缓存

     返回json映射bean类 CanalMessage

    
    /**
     * @author yueF_L
     * @version 1.0
     * @date 2022-04-10 0:30
     * Canal消息接收实体类
     */
    @NoArgsConstructor
    @Data
    public class CanalMessage<T> {
        @JsonProperty("type")
        private String type;
    
        @JsonProperty("table")
        private String table;
    
        @JsonProperty("data")
        private List<T> data;
    
        @JsonProperty("database")
        private String database;
    
        @JsonProperty("es")
        private Long es;
    
        @JsonProperty("id")
        private Integer id;
    
        @JsonProperty("isDdl")
        private Boolean isDdl;
    
        @JsonProperty("old")
        private List<T> old;
    
        @JsonProperty("pkNames")
        private List<String> pkNames;
    
        @JsonProperty("sql")
        private String sql;
    
        @JsonProperty("ts")
        private Long ts;
    
    }
    

    展开全文
  • 最近发现自己的工程中,修改了UserDetails中的用户信息后,再用access_token获取用户信息后,发现总是获取的第一次登录时存储的信息,不是修改后的信息,后来才发现是没有更新redis中的信息。 oauth2配置: import...

    最近发现自己的工程中,修改了UserDetails中的用户信息后,再用access_token获取用户信息后,发现总是获取的第一次登录时存储的信息,不是修改后的信息,后来才发现是没有更新redis中的信息。
    oauth2配置:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.annotation.Order;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.http.HttpMethod;
    import org.springframework.security.authentication.AuthenticationManager;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.oauth2.provider.ClientDetailsService;
    import org.springframework.security.oauth2.provider.approval.ApprovalStore;
    import org.springframework.security.oauth2.provider.approval.TokenApprovalStore;
    import org.springframework.security.oauth2.provider.approval.TokenStoreUserApprovalHandler;
    import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService;
    import org.springframework.security.oauth2.provider.request.DefaultOAuth2RequestFactory;
    import org.springframework.security.oauth2.provider.token.TokenStore;
    import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
    
    import javax.sql.DataSource;
    
    /**
     *
     */
    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    @Order(-1)
    public class OAuth2SecurityConfiguration extends WebSecurityConfigurerAdapter
    {
    
        @Autowired
        private DataSource dataSource;
    
        @Autowired
        private RedisConnectionFactory connectionFactory;
    
        @Autowired
        private PasswdAuthenticationProvider passwdAuthenticationProvider;
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception
        {
            auth.authenticationProvider(passwdAuthenticationProvider);
        }
    
    
        @Override
        protected void configure(HttpSecurity http) throws Exception
        {
            http.requestMatchers().antMatchers(HttpMethod.OPTIONS, "/oauth/token").and().csrf().disable();
        }
    
        @Override
        @Bean
        public AuthenticationManager authenticationManagerBean() throws Exception
        {
            return super.authenticationManagerBean();
        }
    
        @Bean
        public ClientDetailsService clientDetailsService()
        {
            return new JdbcClientDetailsService(dataSource);
        }
    
        @Bean
        public TokenStore tokenStore()
        {
            RedisTokenStore redis = new RedisTokenStore(connectionFactory);
            return redis;
        }
    
        @Bean
        @Autowired
        public TokenStoreUserApprovalHandler userApprovalHandler(TokenStore tokenStore)
        {
            TokenStoreUserApprovalHandler handler = new TokenStoreUserApprovalHandler();
            handler.setTokenStore(tokenStore);
            handler.setRequestFactory(new DefaultOAuth2RequestFactory(clientDetailsService()));
            handler.setClientDetailsService(clientDetailsService());
            return handler;
        }
    
        @Bean
        @Autowired
        public ApprovalStore approvalStore(TokenStore tokenStore) throws Exception
        {
            TokenApprovalStore store = new TokenApprovalStore();
            store.setTokenStore(tokenStore);
            return store;
        }
    
    }

    获取认证后的信息:

    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
                Object principal = authentication == null ? null : authentication.getPrincipal();

    修改的就是principal 中的信息,但没有修改redis中的信息,本想直接操作redis中存储的对象,但担心打乱spring security自身存储的数据结构,苦苦寻找并自己研究了两天,始终没能找到答案。

    spring security源码后,发现信息是在Tokenstone接口中新增的,由于该接口没有提供修改方法,所以重写了新增的方法,覆盖了redis中的信息。

    @Autowired
    private TokenStore tokenStore;
    @Autowired
    private RedisConnectionFactory connectionFactory;
    private AuthenticationKeyGenerator authenticationKeyGenerator=new 
    DefaultAuthenticationKeyGenerator();
    
    private JdkSerializationStrategy serializationStrategy=new JdkSerializationStrategy();
    
     //更新redis中的token相关信息
        OAuth2Authentication authentication = (OAuth2Authentication)SecurityContextHolder.getContext().getAuthentication();
        String key = authenticationKeyGenerator.extractKey(authentication);
        byte[] serializedKey =  serializationStrategy.serialize("auth_to_access:" + key);
        byte[] bytes = null;
        RedisConnection conn = connectionFactory.getConnection();
        try {
            bytes = conn.get(serializedKey);
        } finally {
            conn.close();
        }
        OAuth2AccessToken accessToken =serializationStrategy.deserialize(bytes, 
        OAuth2AccessToken.class);
        tokenStore.storeAccessToken(accessToken, authentication);
    展开全文
  • @Autowired  private RedisTemplate redisTemplate;  @Scheduled(cron = "0 0 */2 * * ?")//每隔两个小时执行一次  public void work() {  List&... userInfoList = jdbcTemplate.query(USER_SQ...
  • 用 spring security oauth2进行用户认证,首次登录后得到access_token和refresh_token,然后修改SecurityContextHolder.getContext().getAuthentication()中的Principal信息,但没有修改Redis中的数据, oauth2配置...
  • redis数据更新操作

    千次阅读 2021-12-08 15:10:46
    redis的数据更新尝尝涉及到和数据库的数据一致性的问题的。最有效的redis数据库一致性的操作方式是如下的: 1.先更新数据库; 2.删除缓存; 3.当再次查询的时候,查询缓存重建缓存就可以了; 上面还是存在一个缓存脏...
  • 主要介绍了spring boot+redis 监听过期Key,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • 提问:老师,上次面试我的回答是先更新数据库,在更新缓存。...总结两种方式入戏1:先更新数据库 - 删缓存 - 再次访问 - 查询数据库 - 存入缓存2:更新redis(新key覆盖旧key) - 查询 -redis异步将数据同步my...
  • RedisRedis 缓存更新方案分析

    千次阅读 2021-06-09 15:34:43
    由于两者的数据更新必然不是同时进行的,因此当其中一方出现数据更新时,正在进行的访问就有可能从另一方获取到“肮脏”的数据。接下来,我们就分析一下可能存在的几种方案以及他们各自的优缺点。 方案一:懒加载 ...
  • Redis在java中批量操作数据的更新

    千次阅读 2021-02-13 02:04:13
    背景:同事说Redis在插入数据时,同样存在插入速度慢,只是get获取时快,通过做实验,完全不是那么回事,同事说的话也根本没有找到有关官方的说法,仅仅是凭几个简单的操作,应该是不能作为依据的。今天贴出几个批量...
  • redis更新缓存

    千次阅读 2020-01-19 16:04:53
    今天对使用redis更新缓存整理几个方案,有不足的地方还望多多指正。 第一种: 方案:后台设置更新缓存按钮由操作人员操作或者使用定时任务,从DB查找最新数据集合,删除原缓存数据,存储新数据到缓存; 问题:...
  • Node.js 更新Redis中key的过期时间

    千次阅读 2019-05-11 20:58:59
    需求 最近有一个有趣的需求,用户家庭账号体系的建立,前提(小程序开发,前端无法检测小程序彻底退出),家庭中的成员账号A... 解决办法 由于上面的需求想到的解决办法是使用RedisRedis中为每一个账号设置一个...
  • 查看日志/var/log/redis/redis.log 843:M 19 Feb 17:26:29.097 * 1 changes in 900 seconds. Saving… 843:M 19 Feb 17:26:29.097 * Background saving started by pid 24809 24809:C 19 Feb 17:26:29.098 # Failed...
  • win10 开源 Redis管理工具纯净版,官方以开始收费,此为0.9.5免费纯净版,可关闭更新窗口。
  • redis 更新升级版本

    千次阅读 2020-12-25 10:20:56
    更新redis 升级redis 安装redis
  • 日前面试的时候被问到我们项目里面使用Redis的时候是如何更新缓存的,我的回答是写操作的时候的时候把缓存删了,然后读操作的时候就会读取出来最新的值。面试管继续问:Redis的写时更新和读时更新有什么区别没有?我...
  • Redis系列 - Redis更新数据库还是先更新缓存? 先更新数据库再失效缓存
  • Redis中的几种更新策略

    千次阅读 2021-01-23 17:26:35
    Redis中的几种更新策略 最近项目中用到redis做缓存,翻阅了各种资料,顺便也记录一下。 在redis缓存和mysql数据库跟新的策略中,它们都存在一定的缺点,可能会导致数据一致性的问题,即缓存和数据库中的内容不一致...
  • Redis和数据库同步更新的正确方法

    千次阅读 2019-11-07 11:34:39
    原文(缓存更新的套路):看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是查询...
  • 关于Redis并发更新key的问题

    千次阅读 2020-07-20 22:31:23
    Redis并发更新key的问题,主要指的是多个线程对同一个key的set操作,这种问题就如同在java中对同一个资源的并发访问一样。 问题场景 1、某个值先从redis中取出,然后再修改,比如一个线程取出值为1,然后+1后更新,...
  • 关于怎么实现mysql更新redis同步

    千次阅读 2019-11-04 20:04:01
    那么B所有的更新操作都删除reids,并重新新增数据到redis 定义一个AOP,扫描带有A注解的所有方法。方法的所有更新操作都要delete key,add key,value; 方法所有的查询都先查询redis,没有再查数据库 前期开发可以...
  • 讲讲 Redis 缓存更新一致性

    千次阅读 2020-05-12 09:16:00
    【75期】面试官:说说Redis的过期键删除策略吧!(高频) 【76期】面试官问:List如何一边遍历,一边删除? 【77期】这一道面试题就考验了你对Java的理解程度 【78期】别找了,Java集合面试问题这里帮你总结好了! ...
  • Redis更新缓存策略

    万次阅读 2019-03-28 11:04:03
     [被动]由用户触发更新  [预加载]提前加载好数据 方案1 [主动]后台点击更新缓存按钮,从DB查找最新数据集合,删除原缓存数据,存储新数据到缓存; 问题:更新过程中删除掉缓存后刚好有业务在查询,那么这...
  • canal将binlog转到连接器kafka,接收方订阅topic消费后更新redis或es canal工作原理 先看,MySQL主备复制原理: MySQL的Master实例将数据变更写入二进制日志(binary log,其中记录叫做二进制日志事件binary ...
  • redis 同步更新缓存数据

    千次阅读 2019-02-11 11:47:26
    问题场景 练习项目写后台的时候,在后台对前端的商品分类信息进行了增加或者删除的操作。...在实际更新数据库操作的同时,对 redis 的缓存数据进行更新处理 具体步骤:删除原有的 redis 中的缓存...
  • ssm redis里面缓存更新

    2017-11-21 13:38:52
    ssm搭redis,怎么设置xml使redis里面的缓存数据更新?(当我第一次查询数据库数据,缓存到redis里面,再往数据库插入数据,此时再查询会查询到redis里面的缓存,怎么设置xml使数据库数据有更新redis会跟着重新缓存...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 220,459
精华内容 88,183
关键字:

更新redis