首页 > 数据库 >.net core 中使用Redis,及Redis问题

.net core 中使用Redis,及Redis问题

时间:2023-06-17 11:33:58浏览次数:40  
标签:core 缓存 userid cache Redis 线程 key net

1.安装 Microsoft.Extensions.Caching.StackExchangeRedis 包

.net core 中使用Redis,及Redis问题_Redis

2.//分布式缓存    在startup的ConfigureServices中注入redis                                                               services.AddStackExchangeRedisCache(options =>                                                              {                                                                                                                                                     //获取连接字符串               options.Configuration = Configuration.GetSection("RedisConnectionStrings").Value;               //实例名称               //options.InstanceName = "SampleInstance";           });


3.private readonly IDistributedCache _cache;

      public ValuesController(IDistributedCache cache)

      {

          _cache = cache;

      }

4.var userid = _cache.GetString("userid");//从redis中读取数据

           if (userid==null)

           {

               //模拟读取数据库

               userid = "abcd";

               //设置缓存过期时间

               var options = new DistributedCacheEntryOptions()

           .SetSlidingExpiration(TimeSpan.FromSeconds(20));

               _cache.SetString("userid", userid, options);

               return Ok(userid);

           }

           else

           {

               return Ok(userid);

           }

5.Redis缓存雪崩解决方法                                                                                                                    

(1).保持缓存层的高可用性


使用Redis 哨兵模式或者Redis 集群部署方式,即便个别Redis 节点下线,整个缓存层依然可以使用。除此之外,还可以在多个机房部署 Redis,这样即便是机房死机,依然可以实现缓存层的高可用。

(2)限流降级组件


无论是缓存层还是存储层都会有出错的概率,可以将它们视为资源。作为并发量较大的分布式系统,假如有一个资源不可用,可能会造成所有线程在获取这个资源时异常,造成整个系统不可用。降级在高并发系统中是非常正常的,比如推荐服务中,如果个性化推荐服务不可用,可以降级补充热点数据,不至于造成整个推荐服务不可用。常见的限流降级组件如 Hystrix、SenTInel 等。

(3)缓存不过期


Redis 中保存的 key 永不失效,这样就不会出现大量缓存同时失效的问题,但是随之而来的就是Redis 需要更多的存储空间。


(4)优化缓存过期时间


设计缓存时,为每一个 key 选择合适的过期时间,避免大量的 key 在同一时刻同时失效,造成缓存雪崩。

(5)使用互斥锁重建缓存


在高并发场景下,为了避免大量的请求同时到达存储层查询数据、重建缓存,可以使用互斥锁控制,如根据 key 去缓存层查询数据,当缓存层为命中时,对 key 加锁,然后从存储层查询数据,将数据写入缓存层,最后释放锁。若其他线程发现获取锁失败,则让线程休眠一段时间后重试。对于锁的类型,如果是在单机环境下可以使用 Java 并发包下的 Lock,如果是在分布式环境下,可以使用分布式锁(Redis 中的 SETNX 方法)。


分布式环境下使用Redis 分布式锁实现缓存重建,优点是设计思路简单,对数据一致性有保障;缺点是代码复杂度增加,有可能会造成用户等待。假设在高并发下,缓存重建期间 key 是锁着的,如果当前并发 1000 个请求,其中 999 个都在阻塞,会导致 999 个用户请求阻塞而等待。


(6)异步重建缓存


在这种方案下构建缓存采取异步策略,会从线程池中获取线程来异步构建缓存,从而不会让所有的请求直接到达存储层,该方案中每个Redis key 维护逻辑超时时间,当逻辑超时时间小于当前时间时,则说明当前缓存已经失效,应当进行缓存更新,否则说明当前缓存未失效,直接返回缓存中的 value 值。如在Redis 中将 key 的过期时间设置为 60 min,在对应的 value 中设置逻辑过期时间为 30 min。这样当 key 到了 30 min 的逻辑过期时间,就可以异步更新这个 key 的缓存,但是在更新缓存的这段时间内,旧的缓存依然可用。这种异步重建缓存的方式可以有效避免大量的 key 同时失效。

标签:core,缓存,userid,cache,Redis,线程,key,net
From: https://blog.51cto.com/u_16102274/6504624

相关文章

  • .NET CORE 核心概念:深入理解依赖注入
    1.为什么要用依赖注入(DI)什么是依赖注入,为什么要使用呢?简单通俗说就是一个类需要另一个类来协助工作,就产生了依赖,所以需要的依赖项就要【注入】过来一起来协同完成工作。 软件设计原则中有一个依赖倒置原则(DIP)讲的是要依赖于(1)抽象,不要依赖于具体,(2)高层模块不应该依赖于低层模......
  • Navicat For Redis 的学习与使用
    NavicatForRedis的学习与使用背景周末在家看了几个公众号:说到Navicat16.2已经有了Redis的客户端.想着前段时间一直在学习Redis,但是没有GUI的工具,所以想可以试用一下.这里简单总结和记录一下最新版的下载地址#最新版的集合版本premium里面包含多种数据库的连接工具......
  • Redis中的数据结构
    字符串SDS(simpledynamicstring):redis自己构建的一种简单动态字符串,而没有直接使用C语言的字符串(在redis中C语言的字符串仅用在无需对字符串修改的地方,例如日志打印),SDS以空字符'\0'结尾,且不占用len里,会额外占用1字节空间,即使用长度为N+1的空间来表示长度为N的字符串数......
  • jpa2.2.10 JpaSpecificationExecutor Specification 查询时,实体类中存在@OneToMany,怎
    对于这个问题,您可以在查询时通过join()方法指定不查询@OneToMany关联表。举个例子,如果有一个实体A与实体B是一对多关系,那么您可以这样写查询条件:@OneToMany(targetEntity=DcyRightImage.class,cascade={CascadeType.ALL},fetch=FetchType.EAGER)@JoinColumn(nam......
  • Redis--键值设计
    Redis的key最好遵循如下规则设计:1.遵循基本格式:业务名称:数据名:ID2.长度不超过44个字节3.不包含特殊字符优点:1.可读性强2.避免key冲突3.方便管理4.更节省内存:key是string类型,底层编码是int,embstr,raw三种,embstr在小于44个字节长度使用,采用连续......
  • netty rpc个人即兴整理
    nettyrpcrpc不通过http,只是使用了tcphttp应用层tcp传输层http不同产品或者不同语言之间最佳解决浪费传输的宽带rpc为什么只用tcp就可以实现,说白了,http就是编码解码用的,我用prc可以自定义编码解码器,不需要通过http实现rpc个人理解,适用于客户端和服务端都是一个产品组开发......
  • dubbo-redis练习
    1. 项目需求    1351.1 注册学生phone必须唯一,如果已将存在了手机号,注册失败int addstudent(Student student);返回值int1:注册成功2:手机号已存在name至少两个字符,age必须大于01.2 查询学生根据id查询,此学生先到redis查询学生,如果redis没有此学生,从数据库查,把查询到的学生......
  • 申威3231服务器Redis性能验证-及最全信创CPU性能分析
    申威3231服务器Redis性能验证-及最全信创CPU性能分析背景公司里面新进了几台服务器.有台申威服务器.因为前段时间参与过一次申威的POC验证.当时对性能有一点简单的理解.但是因为不方便,没有测试更多.这次有了一台实体机器,并且可以上网,所以感觉可以方便的多了.本来想......
  • Go Redis 管道和事务之 go-redis
    GoRedis管道和事务之go-redisGoRedis管道和事务官方文档介绍Redispipelines(管道)允许一次性发送多个命令来提高性能,go-redis支持同样的操作,你可以使用go-redis一次性发送多个命令到服务器,并一次读取返回结果,而不是一个个命令的操作。GoRedis管道和事务:https://red......
  • 3.1 卷积神经网路 (Convolutional Neural Networks, CNN)
    1.概念引入:ImageClassification  我们做图像分类时,一般分为三步:所有图片都先rescale成大小一样把每一个类别表示成一个one-hotvector(dimension的长度决定模型可以辨识出多少不同种类的东西)将图片输入到模型中......