关于Redis的一些小问题

刚刚学习了Redis,有一些小问题在这里总结记录一下,加深一下记忆。

a)为什么在多线程并发情况下,以Redis实现的“自增ID工具”能保证ID按顺序自增长且不重复?
Redis自增ID工具**
public static Integer getId(RedisTemplate redisTemplate) {

	ValueOperations<String, Integer> opsForValue = redisTemplate.opsForValue();
	
	Integer intid = opsForValue.get("id");
	
	//自增
	long id = opsForValue.increment("id", 1);
	return (int)id;
	
}   
多线程并发,使用线程同步 可以保证ID按顺序自增长且不重复

b)描述Redis之List类型分页实现过程,以及假想企业里存在类似的场景
首先将数据存入Redis

List<Goods> list=new ArrayList<>();
list.add(goods);
ListOperations<String, Goods> opsForList = redisTemplate.opsForList();
opsForList.leftPushAll("goods_list", list);

Controller层
@RequestMapping("list")
public String list(Model model,@RequestParam(defaultValue = "1")Integer pageNum,@RequestParam(defaultValue = "10")Integer pageSize){
	ListOperations<String,Goods> opsForList = redisTemplate.opsForList();
	
	int start=(pageNum-1)*pageSize;
	int end=pageNum*pageSize-1;
	List<Goods> list = opsForList.range("goods_list", start, end);
	model.addAttribute("list", list);
	model.addAttribute("pageNum", pageNum);
	model.addAttribute("total", (int)Math.ceil(opsForList.size("goods_list")/(pageSize*1.0)));
	
	return "list";

JSP页面分页






当前页: p a g e N u m / {pageNum}/ pageNum/{total}

</div>

c)说下Redis的持久化机制。**
Redis是内存数据库。他将自己的数据库存储状态存储在内存中,如果不想方法把数据库状态保存到磁盘中,一旦服务进程退出,服务器中的数据库状态也将消失不见。
​ 因此,redis提供了RDB和AOF持久化功能,这个功能将redis内存中的数据库状态保存到磁盘中,避免数据意外丢失。
其中RDB为默认持久化方式,RDB持久化功能产生一个RDB文件(经过压缩的二进制文件)可还原成数据库状态。

保存在硬盘里,存在即可还原。

RDB文件的创建通过两个redis命令用于生成RDB文件:SAVE ,BGSAVE。

Save命令:会阻塞redis服务进程,直到RDB文件创建完成。服务器阻塞期间,服务器不能处理任何命令请求。
BGSAVE命令会派生一个子进程,然后由子进程负责创建RDB文件,服务父进程继续处理命令。
另外,当我们执行shutdown命令的时候,redis在关闭的时候,也会执行save

RDB持久化是通过保存数据库中的键值对来记录数据的状态不同,而AOF持久化是通过保存redis服务器所执行的写命令来记录数据库状态的。
AOF持久化的方法是将服务器执行的set ,sadd,rpush三个命令保存到AOF文件中

而,RDB持久化是将msg,fruits,numbers三个键的键值对保存到RDB文件。

AOF载入:

服务器启动时通过载入和执行AOF文件中的命令还原数据库状态。

AOF持久化的实现:

1.命令追加 2.文件写入3.文件同步 三个步骤

命令追加:

当AOF持久化功能处于打开状态时,服务器在执行一个写命令之后,会以协议格式将被执行的写命令追加到服务器的aof_buf缓存区的末尾:

文件写入与同步:

Redis的服务器进程就是一个事件循环(loop),这个循环中的文件事件负责接收客户端的命令请求,以及向客户端发送命令回复,而时间事件是负责执行定时运行函数(serverContron)。

因为服务器处理文件事件会执行写命令,使一些内容追加到aof_buf缓冲区里,所以服务器每次在结束一个事件循环之前,都会调用flushAppendOnlyFile函数,考虑是否将aof_buf缓冲区的内容写入和保存到Aof文件里。

因为AOF文件的更新频率比RDB文件的更新频率高,所以:

1如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据库状态。

2只有在AOF持久化功能处于关闭状态的时候,服务器才会使用RDB文件来还原数据库状态。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页