一、redis的应用场景,什么时候选用链表什么时候选用对象存储,堆和栈的区别

redis的应用场景

1、string类型 :String 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字

 应用场景:常规key-value缓存应用。常规计数: 微博数, 粉丝数。

2、Hash

使用场景:存储部分变更数据,如用户信息等。

3、List

应用场景:Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。
List 就是链表,相信略有数据结构知识的人都应该能理解其结构。使用List结构,我们可以轻松地实现最新消息排行等功能。List的另一个应用就是消息队列,
可以利用List的PUSH操作,将任务存在List中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删除List中某一段的元素。
使用场景:消息队列系统

4、Set

应用场景:
     Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用Redis提供的Set数据结构,可以存储一些集合性的数据。
使用场景:
交集,并集,差集:(Set)

5、Sorted Set

使用场景:
     Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。

 栈和堆的特点

1、栈:先进后出。

       (1)栈内存就好像一个矿泉水瓶,像里面放入东西,那么先放入的沉入底部,所以它的特点是:先进后出,后进先出

        (2)存取速度比堆要快,仅次于寄存器,栈数据可以共享,但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性

2、堆:队列优先,先进先出。

       (1)堆其实可以类似的看做是管道,或者说是平时去排队买票的的情况差不多,所以堆内存的特点就是:先进先出,后进后出,也就是你先排队,好,你先买票。

        (2)堆可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,但缺点是,由于要在运行时动态分配内存,存取速度较慢。

堆与栈的不同点:

                          1、栈内存存储的是局部变量而堆内存存储的是实体(对象);

                          2、栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

                          3、栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

堆和栈的相同点:                

                            1、都是属于Java内存的一种
                         2、系统都会自动去回收它,但是对于堆内存一般开发人员会自动回收它

二、redis的筛选数据,比如根据热度或者根据活跃度来筛选队列里的数据

、memcache的特点
• 具有非常快的处理速度
• 缺乏认证以及安全管制,应将其放置在防火墙之后
• 重启后数据全部丢失
• 可以给数据设置有效期
• 适合使用大量低CPU的机器搭建集群
• 各节点之间各自独立
• 通过客户端一致性哈希等分布式算法实现数据线性扩展

 

四、找出执行速度比较慢的sql语句,主要是explain和mysql的慢日志

https://zhidao.baidu.com/question/1770291692487260340.html

五、redis和memcache有什么区别

六、为什么redis是单线程的都那么快?

1)数据存于内存         

2)用了多路复用I/O         

3)  单线程

七、redis持久化机制(怎么保证redis挂掉之后再重启数据可以进行恢复)?

redis的一种持久化方式叫快照,另一种方式是只追加文件。redis可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。redis创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(redis主从结构,主要用来提高redis性能),还可以将快照留在原地以便重启服务器的时候使用。

八、缓存雪崩和缓存穿透问题的解决方案?

缓存雪崩:

     事前:尽量保证整个redis集群的高可用性,发现机器宕机尽快补上。选择合适的内存淘汰策略

     事中:本地ehcache缓存+hystrix限流&降级,避免mysql崩掉

     事后:利用redis持久化机制保存的数据尽快恢复缓存

缓存穿透:

     有很多种方法可以有效的解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据 会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟