Redis介绍

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

 

 

希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。更多好文推荐,请关注我的微信公众号--JustJavaIt
原文地址:https://www.cnblogs.com/liaowenhui/p/12329171.html