redis知识点整理

redis知识点整理

Scroll Down

redis使用中常见的一些问题

  1. 使用redis的好处
  • 因为redis操作的是内存,所以读取都特别快。
  • redis支持的数据类型特别多,例如:string,list,set,sorted set,hash
  • redis支持事务,操作的数据都是原子性,要么全部操作成功,要么全部失败
  1. redis使用场景
  • 假设现在有一条sql语句,这个sql语句的使用频率非常高,而且操作数据的内容也不会更改。这个时候就可以将这条sql查询的数据放在redis中。后面的所有通过该sql语句查询的数据都直接从redis中拉取,就可以使请求迅速响应
  • 解决并发,假设现在有大量的请求需要查询数据库数据,如果使用的数据库性能不是特别好的情况下,直接回导致数据库瘫痪。这里就可以使用redis缓冲一下。使一次性到达数据库的请求达不到峰值。当然这里也可以使用消息队列解决。 3.使用的redis的缺点
  • redis缓存的数据和数据库的数据不同步问题,也就是redis和数据库双写一致性问题,一致性问题通常在分布式中比较常见,但是只要使用缓存数据库,那么就必然会出现缓存和数据库双写一致性问题。还可以将这个一致性分为最终一致性和强一致性。如果该数据要求的强一致性,那么就不能使用数据库缓存,因为我们能做到的是尽量保证缓存的数据库和数据库的数据一致,但是不能完全保证,所以有强一致性的数据不能存放到缓存数据库中。
  • 缓存穿透问题,缓存穿透就是有黑客故意请求缓存中不存在的数据,那么所有的请求都会进入到数据库中。最终导致数据库瘫痪。解决缓存穿透问题有三种方法,一可以采用数据库互斥锁,一个请求进入到了数据库,就立马挂锁,其他请求来了没得到锁,就直接让他休眠一段时间重试。二可以当请求达到缓存的时候,发现所请求的数据在缓存中并没有,那么无论有没有取到值都直接缓存,然后另起一个线程去数据库中更新对应的数据到数据库缓存中。三可以使用拦截策略,首先使用过滤器拦截维护一系列有效的key,然后拦截请求判断请求的key是否是合法的,如果不是合法的就直接返回。
  • 解决缓存雪崩,一肯定想到的办法是防止大面积数据失效,可以将缓存失效时间加上一个随机值,这样就可以避免同一时间大面积的数据失效。二同样可以使用互斥锁保证不会大批量的请求全部进入到数据库。三可以使用双缓存策略,A缓存设置数据失效时间,B数据不设置缓存失效时间,请求先进入到A缓存,有则直接返回,如果没有就从B读取数据返回。并且同时启动另一个线程更新A和B缓存中的数据。
  • 并发竞争key问题,首先判断对key的操作是否要求顺序,如果不要求顺序,那么就可以准备一个分布式锁,大家去抢锁,谁抢到锁就获得key的操作权限。如果对key的操作要求顺序,假设现在有一个key然后系统A要将key的值设置为valueA,系统B需要将key的值设置为valueB,系统C需要将key的值设置为valueC,如果要求value值得变化为valueA->valueB->valueC,那么可以设置在系统对key进行操作的时候,同时在后边加上时间戳,假设在valueA设置3.01,valueB设置3.05,valueC设置3.10,假设系统B先进行操作,然后将时间戳设置为3.05,这样A系统再来操作的话,发现自己的时间戳早于当前的时间戳,就不对该数据进行操作。
  1. redis为什么操作数据很快
  • 单线程的redis为什么这么快,一是因为redis是纯内存操作,二是因为redis是单线程工作模型,避免频繁的上下文切换,三是采用了非阻塞IO多路复用机制。 多路复用技术就是使用一个线程,然后会根据IO的操作不同,使用事件分派器。
  1. redis操作的数据类型和使用场景
  • 首先是string一般做一些复杂的计数功能的缓存。
  • Hash中的value存放的是结构化的对象,比较方便的就是可以操作其中某个字段。
  • List可以做一个类似于消息队列的功能。
  • Set存放的是不重复的数据,那么就可以使用这一特性对全局数据进行去重。
  • Sorted set 主要是可以对set中存放的数据进行排列。可以用来做排行榜应用。
  1. redis的过期策略
  • 首先redis不是无限大的,如果当前redis存放的数据已经满了,但是还需要给其存放数据,那么就需要删除之前的某些数据。第一个想到的就是定时删除,假设现在有大量的数据达到了存活时间,然后需要被定时删除,这个时候就会消耗大量的cpu资源。明显不太好。
  • Redis采用的定期删除加惰性删除,它这里的定期删除并不是将所有到期的数据全部删除,它是会抽取其中的部分数据进行检测如果该数据过期那么就直接给其删除掉,当然这样做的弊端也显现出来了,会导致大量的过期数据没法删除。所以就需要加上惰性删除,惰性删除就是,当使用到某条数据的时候就会检查该条数据的到期时间,如果该条数据到期则删除。这样做同样会有弊端,假设一条数据并没有被定期删除检测到,也没有被调用,那么这条数据永远都不会被删除。这时候就需要在redis.conf中配置内存淘汰策略,内存淘汰策略有很多种,比如配置成在内存不足的时候写入数据,会报错。还可以配置成在内存不足的时候自动删除近期没有使用过的数据。