1.为什么要用缓存,缓存的使用场景
2.redis数据存储类型 string/list/set/hash/sort set(zset)
3.redis的常用数据类型,使用方式
4.redis实现的跳跃表是什么结构
5.redis支持哪些持久化方式
6.redis事务
7.redis实现分布式锁
8.常用的缓存使用模式
9.数据库与缓存数据一致性
10.缓存穿透问题
11.如何解决缓存击穿问题
12.如何解决缓存雪崩问题
13.redis如何做持久化?

1.为什么要用缓存,缓存的使用场景
缓解mysql并发访问压力,热点数据
减少响应时间:内存IO比磁盘快
提升吞吐量:redis等内存数据库单机就可以支持很高并发

2.redis数据存储类型 string/list/set/hash/sort set(zset)
查询(操作)类型 批量操作 事务支持 每个类型不同crud
发布/订阅 主从分区 序列化支持 脚本支持
网络IO 单进程 单线程 IO多路复用 协程
持久化支持 RDB/AOF

3.redis的常用数据类型,使用方式
string 用来实现简单的KV键值对存储,比如计数器
list 双向链表(左右都可以追加值),比如用户的关注,粉丝列表,队列
hash 用来存储彼此相关信息的键值对 用户ID和name关联
set 存储不重复元素,比如用户的关注者
sort set(zset)(有序集合) 实时信息排行榜

内置实现方式 各种类型的C底层实现方式
string 整数
list ziplist或double linked list
通过一个连续的内存块实现list结构,其中的每个entry节点头部保存前后节点长度信息,实现双向链表功能
hash ziplist或hashtable
set intset或hashtable
sortedset skiplist跳跃表
数据结构 时间与空间复杂度

4.redis实现的跳跃表是什么结构

在大多数情况先,跳跃表的效率可以与平衡树媲美,并且因为跳跃表的实现比平衡树更为简单,所以有不少程序都使用跳跃表来代替平衡树。

Redis使用跳跃表作为有序集合键的底层实现之一。

Redis的跳跃表由zskiplistNode和zskiplist两个结构定义,其中zskiplistNode结构用于表示跳跃表节点,而zskiplist结构用于保存跳跃表节点的相关信息(如节点数量,表头指针,表尾指针等)。

5.redis支持哪些持久化方式
1.快照方式:把数据快照放在磁盘二进制文件中,dump.rdb 快照的实现方式是指定时间间隔把redis数据库状态保存到一个压缩的二进制文件中
AOF(Append Only File):每一个写命令追加到appendonly.aof中
可以通过修改redis配置实现

6.redis事务
将多个请求打包,一次性,按序执行多个命令的机制
redis通过multi,exec,watch等命令实现事务功能
pipline=conn.pipline(transaction=True)

7.redis实现分布式锁
使用setnx实现加锁,可以同时通过expire添加超时时间
锁的value值可以使用一个随机的uuid或者特定的命令
释放锁的时候,通过uuid判断是否是该锁,是则执行delete释放锁

8.常用的缓存使用模式
cache aside 同时更新缓存和数据库
read/write through 先更新缓存,缓存负责同步更新数据库
write behind caching 先更新缓存,缓存定期异步更新数据库

9.数据库与缓存数据一致性
先更新数据库后更新缓存,并发写操作可能导致缓存读取的是脏数据
一般先更新数据库后删除缓存

10.缓存穿透问题
大量查询不到的数据的请求落到后端数据库,数据库压力增大
由于大量缓存查不到就去数据库取,数据库也没有要查的数据
很多无脑爬虫通过自增id的方式爬取网站,网站查不到相关id的数据
解决:对于没查到的返回为None的数据也缓存
插入数据的时候删除相应缓存,或者设置较短的超时时间

11.如何解决缓存击穿问题
某些非常热点的数据key过期,大量请求打到后端数据库
热点数据key失效导致大量请求打到数据库增加数据库压力
分布式锁:获取锁的线程从数据库拉数据更新缓存,其它线程等待
异步后台更新:后台任务针对过期的key自动刷新

12.如何解决缓存雪崩问题
缓存不可用或者大量缓存key同时失效,大量请求直接打到数据库
多级缓存:不同级别的key设置不同的超时时间
随机超时:key的超时时间随机设置,防止同时超时
架构层:提升系统可用性.监控,报警完善

13.redis如何做持久化?
因为Redis是内存型数据库,所以为了防止因为系统崩溃等原因导致数据丢失的问题,Redis提供了两种不同的持久化方法来将数据存储在硬盘里面,一种方法是快照(RDB),它可以将存在于某一个时刻的所有数据都写入到硬盘里面,另外一种方法是只追加文件(AOF),它会在执行写命令时,将被执行的写命令都写入到硬盘里面。

快照持久化:Redis可以通过创建快照来获得在内存里面的数据在某一个时间点上的副本。在创建快照之后,用户可以对快照进行备份,可以将快照复制到其它服务器从而创建具有相同数据的服务器副本,还可以将快照留在原地以便重启服务器时使用。在只使用快照持久化来保存数据时,如果系统真的发生崩溃,用户将丢失最近一次生成快照之后更改的所有数据。因此,快照持久化只适用于那些即使丢失一部分数据也不会造成问题的应用程序。有两个命令可以用于生成RDB文件,一个是SAVE,另外一个BGSAVE。

SAVE特点:SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕,在服务器进程阻塞期间,服务器不能处理任何命令请求。缺点:服务器持久化期间无法接受其它请求。

BGSAVE特点:BGSAVE命令则会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程则继续处理命令请求。缺点:创建子进程所耗费的时间会随着Redis占用的内存而增加。

文件持久化:AOF持久化会将被执行的写命令写到AOF文件的末尾,以此来纪录数据所发生的变化,因此,Redis只要从头到尾重新执行一次AOF文件所包含的所有写命令,就可以恢复AOF文件所记录的数据集。因为Redis会不断的将被执行的写命令纪录到AOF文件里面,所以随着Redis不断执行,AOF文件的体积也会不断增长,极端条件下,AOF甚至可能会用完硬盘的所有可用空间。为了解决上面的缺点,Redis提供了BGREWRITEAOF命令,这个命令会通过移除AOF文件中的冗余命令来重写AOF文件,使得AOF文件尽可能的小。它的原理和BGSAVE命令相似,Redis会创建一个子进程,然后由子进程负责对AOF文件进行重写,因为AOF文件重写也需要用到子进程,所以同样存在快照持久化因为创建子进程所导致的性能问题和内存占用问题。

django里Queryset的get和filter方法的区别?

get获得是一个对象,filter得到是一个对象列表,即使只有一个满足条件

简述django对http请求的执行流程。
一个 HTTP 请求,首先被转化成一个 HttpRequest 对象,然后该对象被传递给 Request 中间件处理,如果该中间件返回了Response,则直接传递给 Response 中间件做收尾处理。否则的话 Request 中间件将访问 URL 配置,确定哪个 view 来处理,在确定了哪个 view 要执行,但是还没有执行该 view 的时候,系统会把 request 传递给 View 中间件处理器进行处理,如果该中间件返回了Response,那么该Response 直接被传递给 Response 中间件进行后续处理,否则将执行确定的 View 函数处理并返回 Response,在这个过程中如果引发了异常并抛出,会被 Exception 中间件处理器进行处理。

简述django下的(内建的)的缓存机制
缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户.django提供了6中内存缓存机制,分别为:

开发调试缓存(为开发调试使用,实际上不使用任何操作);

内存缓存(将缓存内容缓存到内存中);

文件缓存(将缓存内容写到文件 );
数据库缓存(将缓存内容存到数据库);

memcache缓存(包含两种模块,python-memcached或pylibmc.)。

以上缓存均提供了三种粒度的应用。

django中model的slugfeild类型字段有什么用途?
只包含字母、数字、下划线和连接符,通常用于urls

Web开发中有哪些技术手段防止sql注入?
sql注入:在sql语句中,如果存在'--'字符,则执行sql语句时会注释掉--字符后面的内容。凡有SQL注入漏洞的程序,
都是因为程序要接受来自客户端用户输入的变量或URL传递的参数,并且这个变量或参数是组成SQL语句的一部分。放置方式有:
1、使用预编译绑定变量的SQL语句 如execute()
2.严格加密处理用户的机密信息
3.不要随意开启生产环境中Webserver的错误显示
4.使用正则表达式过滤传入的参数
5.字符串过滤
6.检查是否包函非法字符

redis开发相关的更多相关文章

  1. ASP.NET Redis 开发

    文件并发(日志处理)--队列--Redis+Log4Net Redis简介 Redis是一个开源的,使用C语言编写,面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高 ...

  2. JAVA开发相关

    JAVA开发相关1. IntelliJ IDEA开发工具熟练使用2. Maven3. Spring框架(IoC.AOP) 1)数据库相关MyBatis 2)数据库连接池 3)事务.多数据源.跨数据库分 ...

  3. ASP.NET c# Redis 开发

    Redis简介 Redis是一个开源的,使用C语言编写,面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景.Redis纯粹为应用而产生,它是一个高性能的 ...

  4. Redis开发与运维:SDS

    STRING 我们会经常打交道的string类型,在redis中拥有广泛的使用.也是开启redis数据类型的基础. 在我最最开始接触的redis的时候,总是以为字符串类型就是值的类型是字符串. 比如: ...

  5. Redis开发与运维学习笔记

    <Redis开发与运维>读书笔记   一.初始Redis 1.Redis特性与优点 速度快.redis所有数据都存放于内存:是用C语言实现,更加贴近硬件:使用了单线程架构,避免了多线程竞争 ...

  6. 在windows环境里,用Docker搭建Redis开发环境(新书第一个章节)

    大家都知道高并发分布式组件的重要性,而且如果要进大厂,这些技术不可或缺.但这些技术的学习难点在于,大多数项目里的分布式组件,都是搭建在Linux系统上,在自己的windows机器上很难搭建开发环境,如 ...

  7. 《Redis开发与运维》

    第1章 初识Redis 1. Redis介绍: Redis是一种基于键值对(key-value)的NoSQL数据库. 与很多键值对数据库不同的是,Redis中的值可以是由string(字符串).has ...

  8. WinCE及Windows软件开发相关书籍转让

    从开始做WinCE开发到现在已经十多年了,最初可以学习和参考的资料并不多,那时候还没有Stack Overflow,Google也还可以正常访问.遇到问题时,一般都在Google Groups的mic ...

  9. 【面试 redis】【第十二篇】redis的相关面试问题

    redis的相关面试问题 redis教程:http://www.redis.net.cn/tutorial/3501.html ==================================== ...

随机推荐

  1. [LeetCode] 369. Plus One Linked List 链表加一运算

    Given a non-negative number represented as a singly linked list of digits, plus one to the number. T ...

  2. Kubernetes 控制器之 Deployment 介绍(六)

    一.Deployment.ReplicaSet.Pod之间的关系 我们接着前面的文章说,如果不清楚的请查看之前的博文:http://blog.51cto.com/wzlinux/2322616 前面我 ...

  3. 树莓派插入U盘自动拷贝系统日志到U盘或通过U盘升级程序

    注意,U盘用Fat32格式,NTFS格式的话,需要在Linux另外安装相应驱动. 可通过udev实现如题的功能. 在/etc/udev/rules.d/目录下新建规则文件98-logcopy.rule ...

  4. Java环境配置-jdk和jre的安装

    java 是直接在 jdk 下就可以运行 jdk会自带jre 所以只需要下载jdk配置一下环境就可以了 一般编辑java是需要 myeclipse 也可以用 记事本TXT文档 或者用 notepad+ ...

  5. Linux系统权限设置 - 运用指南

    下面对linux系统下的有关权限操作命令进行了梳理总结,并配合简单实例进行说明.linux中除了常见的读(r).写(w).执行(x)权限以外,还有其他的一些特殊或隐藏权限,熟练掌握这些权限知识的使用, ...

  6. java的错误分类

    java的错误分类 java中的错误分为两大类:Error和Exception错误. Error 是程序无法处理的错误,表示运行应用程序中较严重问题,修改程序本身是不能解决的.例如java运行时产生的 ...

  7. TCP/IP学习笔记16--TCP--特点,数据重发,连接管理,段

    TCP充分实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的包进行顺序控制,这些在UDP中都是没有的.UDP是一种没有复杂控制,提供面向无连接通信服务的一种协议.TCP是面向有 ...

  8. Python中的数据类型、变量、字符编码、输入输出、注释

    数据类型 number(数字) 用于存储类型,通常分为int.long.float.complex: int:32位机器上占32位,取值范围为-231 ~ 231 - 1:64位机器上占64位,取值范 ...

  9. Python Web开发技术栈

  10. [SOJ #537]不包含 [CF102129I]Incomparable Pairs(2019-8-6考试)

    题目大意:给定一个长度为$n$的字符串$s$,求有多少个无序字符串二元组$(x,y)$满足:$x,y$是$s$的字串,且$x$不是$y$的字串,$y$不是$x$的字串 题解:发现满足$x,y$是$s$ ...