1、redis简介
Redis是一个使用 C 语言编写的、开源的高性能非关系型(NoSQL)数据库。
Redis 为键值对数据库,键的类型只能为字符串,值支持五种数据类型:字符串、列表(link lists)、集合(sets)、散列表(hash tables)、有序集合(sorted sets)。
与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB(键值对数据库)。
Redis 也经常用来做分布式锁。除此之外,Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。
1.1、Hash tables类型的项目使用实例
场景:以用户id为键,将用户加购物车商品(信息包含pid、商品数量)放入redis缓存;查看购物车时全部取出展示。
1)存:redisTemplate.opsForHash().put(userId, productId, productNumber);
2)只取全部的商品idList<String> pIdList = redisTemplate.opsForHash().values("userId");
3)取全部商品信息Map<String, int> map = redisTemplate.opsForHash().entries("userId");
存的时候只能一条一条数据存、相互之间没有联系,但是取的时候可以像从一张表中取出的一样,这就是非关系型数据库“非关系”的核心奥义。
2、Redis有哪些优缺点?
1)优点:
读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
支持数据持久化,支持AOF和RDB两种持久化方式。
支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
2)缺点
我能想到的缺点只有:受物理内存的限制,redis不能用作海量数据的高性能读写,只适应于,在数据量较小场景下的操作和运算,有些局限。
3、为什么要用 Redis /为什么要用缓存?
为了追求“高性能”,和适应“高并发”场景。
redis读写的高性能前边已经多次提到了,这里不再赘述;
在实际应用中,有很多请求结果是固定的,把这些结果存入redis缓存,当请求再次过来,我们就可以操作缓存而不是再次访问数据库查询,利用缓存的高速读写,可以适应高并发场景。
4、redis在实际开发中的应用场景
1)缓存
将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。
2)分布式锁实现
在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。可以使用 Redis 自带的 SETNX 命令实现分布式锁,除此之外,还可以使用官方提供的 RedLock 分布式锁实现。
redis分布式锁实现方案:
a、用setNX命令,key为对应的资源标记,value存获取到锁的线程设置的唯一标记;
b、setNX返回1,表示获取到锁,就可以执行任务;
c、setNX返回0,表示获取锁失败;
此分布式锁方案的一些问题及解决办法:
a、死锁问题:采用setNX + expire过期时间解决死锁(同时,为了保证两个命令的原子性,可用lua脚本同时执行2个命令);
b、误删问题:value存获取到锁的线程设置的唯一标记就是为了解决误删问题,要求线程释放锁前先判断value,是当前线程加的锁,才可用释放;
c、锁过期释放、但任务未完成的问题(续期问题):开启一个守护线程,定期检查锁是否存在,存在则适当延长过期时间。
d、采用Redisson分布式锁框架,其特有的看门狗watch dog,可以解决续期问题。
3)计数器
可以对 String 进行自增自减运算,从而实现计数器功能。Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的数据。
4)防止消息重复消费(具体看Rabbit MQ)
5、Redis 的持久化机制是什么?分别做一些说明
1)Redis持久化的原因:如果把数据放在内存中,电脑关闭或重启数据就会丢失,所以放在内存中的数据不是持久化的,而放在磁盘就算是一种持久化。
Redis 的数据存储在内存中,如果 linux 宕机或重启,又或者 Redis 崩溃或重启,所有的内存数据都会丢失,为解决这个问题,Redis 提供两种机制对数据进行持久化存储,便于发生故障后能迅速恢复数据。
2)Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制,
RDB就是在指定的时间间隔内将内存中的数据集快照写入磁盘,数据恢复时将快照文件直接再读到内存。RDB 保存了在某个时间点的数据集(全部数据),存储在一个二进制文件中,默认叫 dump.rdb。RDB 技术非常适合做备份,可以保存最近一个小时,一天,一个月的全部数据;保存数据是在单独的进程中写文件,不影响 Redis 的正常使用;RDB 恢复数据时比其他 AOF 速度快。
AOF就是Redis每次接收到一条改变数据的命令时,它将把该命令写到一个 AOF 文件中(只记录写操作,读操作不记录),当 Redis 重启时,它通过执行 AOF 文件中所有的命令来恢复数据。
两种持久化机制的实现方式,都是在redis.conf 文件中做相应配置即可。
3)两种持久化方式的优缺点:
RDB恢复方便,恢复速度也快;但是会丢失一部分数据看,而且会分出一个进程,如果数据库数据量大、服务器cpu也比较弱的时候,可能每次备份数据就会比较慢,可能达到1s。
AOF是一个可以提供完整数据的保障方案;缺点是,AOF 文件会在操作过程中变得越来越大,而且其中很多记录对最终的结果是无用的。
可以同时使用两种持久化方案,redis默认会用aof以保证数据的完整性。