Redis?
Redis(Remote Dictionary Server,远程字典服务)是一个开源的底层使用C语言编写的key-value存储数据库(非关系型数据库中的一种类型 -- 键值数据库)。
优缺点?(为什么要用?)
1)性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s (读和写速度差不多每秒10万次)。
2)丰富的数据类型 – Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
3)原子性 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
4)丰富的特性 – Redis还支持发布订阅(publish/subscribe), 通知, key 过期等等特性。
Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
使用场景?
1) 缓存(数据查询,新闻内容,商品内容,短连接等等)
2) Redis 轻量级的消息中间件: Redis 5.0 之后提供了新的数据类型 Stream 解决了消息确认的问题,但它同样不能提供复杂的路由匹配规则,在业务不复杂的场景下可以尝试性的使用 Redis 提供的消息队列。
3) 数据过期处理(可以精确到毫秒)
4) 不需要实时更新但是又极其消耗数据库的数据。比如网站上商品销售排行榜,这种数据一天统计一次就可以了,用户不会关注其是否是实时的。
5) 网站访问统计
6) 发布/订阅
7) 分布式集群架构中的session分离
8)需要实时更新,但是更新频率不高的数据。比如一个用户的订单列表,他肯定希望能够实时看到自己下的订单,但是大部分用户不会频繁下单。
项目中使用redis一般作为缓存来使用,缓存的目的就是为了减轻数据库压力,提高存取的效率。
redis数据类型有哪些以及使用场景?
它提供了字符串类型(String)、列表类型(List)、哈希表类型(Hash)、集合类型(Set)、有序集合类型(ZSet)等五种最常用的基础数据类型,还有管道类型(Pipeline)、地理位置类型(GEO)、基数统计类型(HyperLogLog)和流类型(Stream)。
使用场景
(1)string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
使用场景:常规key-value缓存应用。常规计数: 微博数, 粉丝数。
(2)hash 是一个键值(key => value)对集合。Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
使用场景:适合用于存储对象,存储部分变更数据,如用户信息等。
(3) list 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边).
使用场景:消息队列,可以利用List的PUSH操作,将任务存在List中,然后工作线程再用POP操作将任务取出进行执行。
(4)set是string类型的无序集合。当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,Redis还为集合提供了求交集、并集、差集等操作.
使用场景:①交集,并集,差集:(Set)
(5) zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
使用场景:Redis sorted set的使用场景与set类似,区别是set是无序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构。
redis 事务?常见命令?
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
Redis是单线程程序,速度为什么会这么快?
1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,优势是查找和操作的时间复杂度都是O(1);
2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
4、使用异步非阻塞IO;(重点说)
5、Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
Redis是nosql数据库,是否适合存储大数据?
Redis是nosql数据库,但是redis是key-value形式的nosql数据库,数据是存储到内存中的,适用于快速存取,一般作为缓存使用,所以不适合于大数据的存储。并且redis是单线程的,如果某个操作进行大数据的存储的话,其他的进程都处于等待状态,这样就降低了性能,所以redis不适合于大数据的存储。如果是类似商品评价这样的,价值不高的大批量数据,我们的做法是采用mongodb。
使用过Redis分布式锁么,它是什么回事?
先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。
这时候对方会告诉你说你回答得不错,然后接着问如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?
这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要抓一抓自己得脑袋,故作思考片刻,好像接下来的结果是你主动思考出来的,然后回答:我记得set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!对方这时会显露笑容,心里开始默念:嗯,这小子还不错。
项目实战:调货生成申请单的时候得用到锁,不能重复点击生成申请单
一个字符串类型的值能存储最大容量是多少?
512M
redis 和 memcached 的区别
1)redis支持更丰富的数据类型(支持更复杂的应用场景):Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。memcache支持简单的数据类型,String。
2)Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而Memecache把数据全部存在内存之中。
3)集群模式:memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是 redis 目前是原生支持 cluster 模式的.
4)Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的多路 IO 复用模型。
Redis支持的Java客户端都有哪些?官方推荐用哪个?
Redisson、Jedis、lettuce等等,官方推荐使用Redisson。
Redis和Redisson有什么关系?
Redisson是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。
Jedis与Redisson对比有什么优缺点?
Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;
Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。
Redis如何设置密码及验证密码?
设置密码:config set requirepass 123456
授权密码:auth 123456
为什么要用 redis 而不用 map/guava 做缓存?
缓存分为本地缓存和分布式缓存。以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。
使用 redis 或 memcached 之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持 redis 或 memcached服务的高可用,整个程序架构上较为复杂。
参考:
30道Redis面试题,面试官能问的都被我找到了--
https://www.jianshu.com/p/36a646cef11a
面试题 动力节点 --
http://www.bjpowernode.com/tutorial_baseinterviewquestions/225.html
Redis面试题总结 --
https://www.jianshu.com/p/65765dd10671
Redis五种数据类型及应用场景 --
https://www.cnblogs.com/jasonZh/p/9513948.html
菜鸟教程Redis事务 --
https://www.runoob.com/redis/redis-transactions.html