redis是一个开源的,可基于内存也可持久化的日志型、KEY-VALUE数据库,并提供多种语言的API的非关系型数据库。传统数据库遵循ACID。而Nosql(NOT only sql)是不同于传统的关系型数据库的数据库管理系统,遵循CAP定理。
1.redis的5种数据类型:
1、String 字符串:格式 set key value #redis的String可以包含任何数据。比如jpg图片或者序列化的对象。String类型是redis最基本的数据类型,一个键最大能存储512MB。
2、hash 哈希:格式:hmset name key1 value1 key2 value2 #redis是一个键值对集合。redis hash 是一个String类型的feild和value的映射表,hash 特别适用于存储对象。
3、List 列表:简单的字符串列表,按照插入顺序排列。添加一个元素到列表的头部(左边)或者尾部(右边)
4、Set 集合: sadd name value redis的set是String类型无序集合。集合是通过哈希表实现的,所以添加、删除,查找的复杂度都是O(1)。
5、Zset 有序集合 : zadd name score value #redis zset和set 一样,也是String类型元素的集合,且不允许重复。不同的是每个元素都会关联一个double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)是可以重复的。
2.redis提供了2种持久化方案:RDB(默认)和AOF :
1.RDB(Redis Database):指定的时间间隔能对你的数据进行快照存储
2.AOF(Append Only File):每一个收到的写命令都通过write函数追加到文件中。
RDB是redis Database缩写 功能核心函数 rdbsave (生成RDB文件)和rdbLoad(从文件加在内存)两个函数
AOF是 Append only file缩写 每当执行服务器(定时)任务或者函数时flushAppendOnlyFile函数都会被调用,这个函数执行以下两个工作,aof写入保存:write #根据条件,将aof-buf中的缓存写入到AOF文件; save #根据条件,调用fsync或者fdatasync函数,将AOF文件保存到磁盘中。存储结构:内容为redis 通讯协议(RESP)格式的命令文本存储。
3.Redis 怎么实现分布式锁?
Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。占坑一般使用 setnx(set if not exists)指令,只允许被一个程序占有,使用完调用 del 释放锁。缺陷Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题。
4.Redis 如何做内存优化?
尽量使用 Redis 的散列表,把相关的信息放到散列表里面存储,而不是把每个字段单独存储,这样可以有效的减少内存使用。比如将 Web 系统的用户对象,应该放到散列表里面再整体存储到 Redis,而不是把用户的姓名、年龄、密码、邮箱等字段分别设置 key 进行存储。
5.Redis 淘汰策略有哪些?
volatile-lru:从已设置过期时间的数据集(server. db[i]. expires)中挑选最近最少使用的数据淘汰。
volatile-ttl:从已设置过期时间的数据集(server. db[i]. expires)中挑选将要过期的数据淘汰。
volatile-random:从已设置过期时间的数据集(server. db[i]. expires)中任意选择数据淘汰。
allkeys-lru:从数据集(server. db[i]. dict)中挑选最近最少使用的数据淘汰。
allkeys-random:从数据集(server. db[i]. dict)中任意选择数据淘汰。
no-enviction(驱逐):禁止驱逐数据。
6.Redis存在的缓存问题?
1.缓存穿透:
数据库和缓存中都没有数据,此时大量请求访问,从缓存中没有获取到数据,全部访问数据库,数据库压力过大。
解决方案:1.数据库和缓存中都没有,直接存储该key值为null
2.布隆过滤器(bitMap) hutool工具包 http://zhuanlan.zhihu.com/p/43263751
2.缓存击穿:
缓存中没有数据,数据库中有,缓存在同一时间过去,大量请求访问,此时请求全部访问数据库,数据库压力过大。
解决方案:1.加锁:(对于去数据库取数据的操作加锁,然后取出来放入redis缓存中,其他的从缓存中获取)
3.缓存雪崩:
缓存的大量数据在同一时间过期,此时大量请求从缓存中访问不到数据,全部访问数据库,数据库压力过大。
解决方案:1.设置热点数据永远不过期 2.过期时间设置为随机值
7.Redis 为什么是单线程的?
因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就顺理成章地采用单线程的方案了。关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。而且单线程并不代表就慢 nginx 和 nodejs 也都是高性能单线程的代表。
8.Redis 有哪些功能?都有哪些使用场景?
功能:
- 数据缓存功能
- 分布式锁的功能
- 支持数据持久化
- 支持事务
- 支持消息队列
使用场景:
- 记录帖子点赞数、点击数、评论数;
- 缓存近期热帖;
- 缓存文章详情信息;
- 记录用户会话信息。