Redis的理解

     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 有哪些功能?都有哪些使用场景?

功能:

  • 数据缓存功能
  • 分布式锁的功能
  • 支持数据持久化
  • 支持事务
  • 支持消息队列

使用场景:

  • 记录帖子点赞数、点击数、评论数;
  • 缓存近期热帖;
  • 缓存文章详情信息;
  • 记录用户会话信息。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值