1.Redis简介
Redis本质上是一种键值数据库,但它在保持键值数据库简单快捷特点的同时,又吸收了部分关系数据库的优点。从而使它的位置处于关系数据库和键值数据库之间。Redis不仅能保存String类型的数据,还能保存Lists类型(有序)和Sets(无序)的数据,而且还能完成排序(SORT) 等高级功能,在实现INCR,SETNX等功能的时候,保证了其操作的原子性。与Memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从) 同步,数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。
2.Redis在开发中的体现
我们通常在项目中使用redis,主要是从两个角度去考虑:性能和并发。
①我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。
②在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。
3.Redis特点
1. Redis数据库完全在内存中运行,使用磁盘仅用于持久性。
2. 相比许多键值数据存储Redis拥有一套较为丰富的数据类型。
3. Redis支持数据的备份,即master-slave模式(主从)的数据备份。
4.Redis查询迅速
分析:这个问题其实是对redis内部机制的一个考察,其实redis是单线程工作模型。
主要是以下三点
①纯内存操作
②单线程操作,避免了频繁的上下文切换
③采用了非阻塞I/O多路复用机制
5.Redis的5种数据类型
①String
String类型最常见的操作就是get和Set方法,一般做一些复杂的计数功能的缓存,其中Redis还提供了一个DEL方法,用来删除字符串。
②hash
这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。项目开发过程中做单点登录的时候,就是用这种数据结构存储用户信息,以cookieId作为key,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果。
③list
使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能。其中要注意的是List数据类型是可以重复的。
④set
Redis的散列可以存储多个键值对之间的映射。和字符串一样,散列存储的值既可以是字符串也可以是数值,并且用户同样可以对散列存储的数字值执行自增和自减操作。set数据类型最大的特点是不重复,因此可以做全局去重的功能。
⑤sorted set
sorted set多了一个权重参数score,集合中的元素能够按score进行排列。可以做排行榜应用,取TOP N操作。
关于上述所说的5种数据类型,在下一节中我会详细说明。
思考:Redis和数据库双写一致性问题
描述:在项目开发过程中,我们经常会用到一个数据库供给两个分支的代码,一个是我们开发的本地项目一个是服务器的dev分支项目,比如说:我在服务器的dev分支上创建了一个快码,保存之后,我想在本地项目中直接去使用,然而发现本地前端代码中并不能直接饮用该快码,然后我们去快码的模块去查找发现是已经存在的,这个时候点击保存之后,才能在本地使用。
为什么呢?
因为我虽然在远程服务器的项目中点击了保存,这个时候将快码写进了数据库和远程服务器的Redis缓存里面,但是本地去使用的时候从缓存中获取发现缓存中并没有这个快码,因此需要重新点击保存,然后在缓存中生效即可。
分析:一致性问题是分布式常见问题,还可以再分为最终一致性和强一致性。数据库和缓存双写,就必然会存在不一致的问题。答这个问题,先明白一个前提。就是如果对数据有强一致性要求,不能放缓存。我们所做的一切,只能保证最终一致性。另外,我们所做的方案其实从根本上来说,只能说降低不一致发生的概率,无法完全避免。因此,有强一致性要求的数据,不能放缓存。
不怕从零开始,只怕从未启程!
网友评论