179. redis 是什么?都有哪些使用场景? 180. redis 有哪些功能? 181. redis 和 memecache 有什么区别? 182. redis 为何是单线程的? 183. 什么是缓存穿透?怎么解决? 184. redis 支持的数据类型有哪些? 185. redis 支持的 java 客户端都有哪些? 186. jedis 和 redisson 有哪些区别? 187. 怎么保证缓存和数据库数据的一致性? 188. redis 持久化有几种方式? 189. redis 怎么实现分布式锁? 190. redis 分布式锁有什么缺陷? 191. redis 如何作内存优化? 192. redis 淘汰策略有哪些? 193. redis 常见的性能问题有哪些?该如何解决?
Redisjava
179. redis 是什么?都有哪些使用场景?node
Redis是如今最受欢迎的NoSQL数据库之一
Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具有以下特性:nginx
Redis 使用场景:web
Redis 的应用场景包括:缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统。 redis
180. redis 有哪些功能?数据库
181. redis 和 memecache 有什么区别?缓存
182. redis 为何是单线程的?安全
由于 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有多是机器内存或者网络带宽。既然单线程容易实现,并且 cpu 又不会成为瓶颈,那就瓜熟蒂落地采用单线程的方案了。服务器
关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。网络
并且单线程并不表明就慢 nginx 和 nodejs 也都是高性能单线程的表明。
183. 什么是缓存穿透?怎么解决?
缓存穿透:**指查询一个必定不存在的数据
致使这个不存在的数据每次请求都要到数据库去查询,因为缓存是不命中时须要从数据库查询,查不到数据则不写入缓存,这将指查询一个必定不存在的数据
致使这个不存在的数据每次请求都要到数据库去查询**,形成缓存穿透。
解决方案:最简单粗暴的方法若是一个查询返回的数据为空(不论是数据不存在,仍是系统故障),咱们就把这个空结果进行缓存,但它的过时时间会很短,最长不超过五分钟。
184. redis 支持的数据类型有哪些?
Redis提供的数据类型主要分为5种自有类型和一种自定义类型,这5种自有类型包括:
String类型、Hash哈希类型、List列表类型、Set集合类型和ZSet顺序集合类型。
String类型:
它是一个二进制安全的字符串,意味着它不只可以存储字符串、还能存储图片、视频等多种类型, 最大长度支持512M。
对每种数据类型,Redis都提供了丰富的操做命令,如:
哈希类型:
该类型是由field和关联的value组成的map。其中,field和value都是字符串类型的。
Hash的操做命令以下:
列表类型:
该类型是一个插入顺序排序的字符串元素集合, 基于双链表实现。
List的操做命令以下:
集合类型:
Set类型是一种无顺序集合, 它和List类型最大的区别是:集合中的元素没有顺序, 且元素是惟一的。
Set类型的底层是经过哈希表实现的,其操做命令为:
Set类型主要应用于:在某些场景,如社交场景中,经过交集、并集和差集运算,经过Set类型能够很是方便地查找共同好友、共同关注和共同偏好等社交关系。
顺序集合类型:
ZSet是一种有序集合类型,每一个元素都会关联一个double类型的分数权值,经过这个权值来为集合中的成员进行从小到大的排序。与Set类型同样,其底层也是经过哈希表实现的。
ZSet命令:
185. redis 支持的 java 客户端都有哪些?
Redisson、Jedis、lettuce等等,官方推荐使用Redisson。
186. jedis 和 redisson 有哪些区别?
Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持。
Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操做,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者可以将精力更集中地放在处理业务逻辑上。
187. 怎么保证缓存和数据库数据的一致性?
188. redis 持久化有几种方式?
Redis 的持久化有两种方式,或者说有两种策略:
189. redis 怎么实现分布式锁?
Redis 分布式锁其实就是在系统里面占一个“坑”,其余程序也要占“坑”的时候,占用成功了就能够继续执行,失败了就只能放弃或稍后重试。
占坑通常使用 setnx(set if not exists)指令,只容许被一个程序占有,使用完调用 del 释放锁。
190. redis 分布式锁有什么缺陷?
Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行若是超出了锁的超时时间就会出现问题。
191. redis 如何作内存优化?
尽量使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存很是小,因此你应该尽量的将你的数据模型抽象到一个散列表里面。
好比你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的全部信息存储到一张散列表里面。
192. redis 淘汰策略有哪些?
193. redis 常见的性能问题有哪些?该如何解决?