zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Javascript的作用域、作用域链以及闭包
    C#当中的泛型和java中的对比
    MongoDB的主从复制和副本集
    MongoDB启动配置等
    JavaScript学习系列1 基础-变量
    Umbraco项目发布错误 --More than one type want to be a model for content type authorize
    项目中gulp使用发生的错误及解决
    JavaScript学习系列2一JavaScript中的变量作用域
    ASP.NET MVC中的ActionFilter介绍学习
    Razor中的 内容标记块语法
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/12329171.html
Copyright © 2011-2022 走看看