redis开发相关

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如何作持久化?python

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

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)(有序集合) 实时信息排行榜redis

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

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

在大多数状况先,跳跃表的效率能够与平衡树媲美,而且由于跳跃表的实现比平衡树更为简单,因此有很多程序都使用跳跃表来代替平衡树。django

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语句的一部分。放置方式有:一、使用预编译绑定变量的SQL语句 如execute()2.严格加密处理用户的机密信息3.不要随意开启生产环境中Webserver的错误显示4.使用正则表达式过滤传入的参数5.字符串过滤6.检查是否包函非法字符

相关文章
相关标签/搜索