Redis使用场景,持久化机制,Redis为什么是单线程的,Redis回收策略

一、Redis的使用场景

1、缓存热数据:
使用:
select之前,先查询Redis是否有,有的话就直接使用Redis中的数据,没有的话在查询数据库,将数据放入Redis
update或者delete数据之前,先查询Redis里面是否有该条数据,有的话,先删除,再update或者delete。

这种操作在并发量小的时候没问题,但是并发量大的情况下,如果为了update先删除掉了Redis中的某条数据,这时候另一个线程执行查询,发现Redis中没有,
就执行了查询,并把这条数据放入了Redis,刚才那个update根本就不知道这个线程做了这个操作,直到下一次update或者delete之前,这个错误数据就一直存在。

2.计数器
可以用来点击计数之类的,由于Redis是单线程,所以可以避免并发问题。用INCRBY命令

3.队列
相当于消息队列

4.全页面缓存
如果使用的是服务器端内容渲染,又不想为每个请求重新渲染每个页面,就可以使用Redis把常被请求的内容缓存起来,能够大大降低页面请求的延迟,这就是页面静态化的一种方式。

set key “<html></html> EX 60

5.排行榜
Redis的sorted set可以轻松实现“从一个大型列表中取得排名最高的N个元素”

ZADD sortedSet 1 "one"  (ZADD key score member)
ZRANGE sortedSet 0 -1  // 获取sorted set中所有items
ZRANGE sortedset 0 -1 WITHSCORES

6.Redis生成序列号
Redis是单线程的,保证了操作的原子性。

Long increment = redisTemplate.opsForValue().increment(key, 1);
// 加上前缀
 orderId = prefix + String.format("%1$06d", increment);
二、Redis持久化机制
2.1、RDB

Redis会定期保存数据快照至一个rdb文件中,并在启动时自动加载rdb文件,恢复之前保存的文件。可以在配置文件中配置Redis进行快照保存的时机。
save   [seconds]   [changes]   如果再seconds秒内发生了changes次改变,则进行一次快照保存
优点:

  • 一旦采用此方式,整个Redis数据库将只包含一个文件,方便备份,可以很容易的把rdb文件移动到其他的存储设备上
  • RDB在恢复大数据集的时候比AOF要快
  • RDB可以最大化Redis的性能,父进程在保存RDB文件时唯一要做的就是fork出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无需执行任何磁盘I/O操作。

缺点:

  • 快照是定期生成的,所以Redis宕机时多少会丢失一部分数据。
  • 如果数据集非常大且CPU不够强,Redis在fork子进程的时候可能会消耗比较长的时间,影响Redis对外提供服务的能力。
2.2、AOF

Redis会将每一个收到的写命令都通过write函数追加到文件中(默认是appendonly.aof)
当Redis重启时,会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。

AOF默认是关闭的,如果要开启,使用appendonly yes命令。

AOF提供了三种fsync配置,always/everysec/no

appendfsync no:      不进行fsync,将flush文件的时机交给os决定,速度最快
appendfsync always:  每写入一条日志就进行一次fsync操作,数据安全性最高,但是速度最	慢
appendfsync everysec:交由后台线程每秒fsync一次。

AOF rewrite:

随着AOF不断的记录日志,因为所有的操作都会记录,所以必定会出现一些重复且无用的记录。大量的日志会让AOF文件过大,也会让数据恢复的时间过长,不过Redis提供了AOF rewrite功能,可以重写AOF文件。
AOF rewrite可以通过bgrewriteaof命令触发,也可以配置Redis定期自动进行。

auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb

上面两个配置的意思是:
Redis在每次AOF rewrite时,会记录完成rewrite后的AOF日志大小,当AOF日志在此基础上增长了100%后,自动进行AOF rewrite。同时,如果增长的大小没有达到64mb,则不会进行rewrite。

优点:

  • 1.最安全,任何写入的数据都不会丢失
  • 2.AOF文件易读,可修改,在执行了某些错误的数据清除指令后,只要AOF文件还没有rewrite,就可以把AOF文件备份出来,把错误命令删除。

缺点:

  • 1.AOF文件比RDB文件大
  • 2.性能消耗比RDB快,恢复速度比RDB慢
三、什么是上下文切换?

即使是单核CPU也支持多线程执行代码,CPU通过给每个线程分配时间片来实现这个机制。时间片是CPU分配给每个线程的时间,时间片时间非常短,一般几十毫秒,所以CPU通过不停切换线程执行,让我们感觉多个线程在执行。

CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片之后会切换到下一个任务。但是,在切换之前,会保存上一个任务的状态,以便下次切回这个任务时,可以再次加载这个任务的状态,从任务保存到再加载的过程就是一次上下文切换
在Linux中可以使用vmstat来查看上下文切换的次数。

程序计数器是一块较小的内存,可以看做当前线程所执行字节码的行号指示器。在虚拟机的概念模型里,字节码解释器就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,为了线程切换后能回到正确的执行位置,每条线程都需要有一个独立的程序计数器。所以一般来说,线程上下文会记录程序计数器的值。

既然上下文切换会导致额外的开销,如何减少上下文切换呢
       减少上下文切换的方法有无锁开发编程,CAS算法,使用最少线程等。
无锁并发编程:多线程竞争时,会引起上下文切换,所以多线程处理数据时,可以使用一些方法来避免锁,比如将数据的ID按照hash取模分段,不同的线程处理不同段的数据。

四、Redis为什么是单线程的?
  • 1.可以避免上下文切换耗费时间
  • 2.不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致性能消耗。
五、Redis为什么这么快?
  • 1.完全基于内存
  • 2.数据结构简单,对数据操作简单
  • 3.使用多路I/O复用模型
  • 4.采用单线程,避免了上下文切换时间,以及锁竞争可能发生死锁消耗性能。
六、Redis的回收策略
  • volatile-lru:从已经设置过期时间的数据集中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已经设置过期时间的数据集中挑选将要过期的数据淘汰
  • volatile-random:从已经设置过期时间的数据集中任意选择淘汰数据
  • allkeys-lru:从数据集中挑选最近最少使用的数据
  • allkeys-random:从数据集中任意选择数据淘汰
  • no-enviction:禁止驱逐数据
  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值