zoukankan      html  css  js  c++  java
  • 面试:第十一章:缓存

    redis的具体使用场景吗?

    1.主要应用在门户网站首页广告信息的缓存。因为门户网站访问量较大,将广告缓存到redis中,可以降低数据库访问压力,提高查询性能。

    2.应用在用户注册验证码缓存。利用redis设置过期时间,当超过指定时间后,redis清理验证码,使过期的验证码无效。

    3.用在购物车模块,用户登陆系统后,添加的购物车数据需要保存到redis缓存中。

    redis中对一个key进行自增或者自减操作,它是原子性的吗?

    是原子性的。一个操作的不可以再分,操作要么执行,要么不执行。Redis的操作之所以是原子性的,是因为Redis是单线程的。对Redis来说,执行get、set以及eval等API,都是一个一个的任务,这些任务都会由Redis的线程去负责执行,任务要么执行成功,要么执行失败,这就是Redis的命令是原子性的原因。Redis本身提供的所有API都是原子操作,Redis中的事务其实是要保证批量操作的原子性。

    数据库创建表时要考虑

    a、大数据字段最好剥离出单独的表,以便影响性能

    b、使用varchar,代替char,这是因为varchar会动态分配长度,char指定为20,即时你存储字符“1”,它依然是20的长度

    c、给表建立主键,看到好多表没主键,这在查询和索引定义上将有一定的影响

    d、避免表字段运行为null,如果不知道添加什么值,建议设置默认值,特别int类型,比如默认值为0,在索引查询上,效率立显。

    e、建立索引,聚集索引则意味着数据的物理存储顺序,最好在唯一的,非空的字段上建立,其它索引也不是越多越好,索引在查询上优势显著,在频繁更新数据的字段上建立聚集索引,后果很严重,插入更新相当忙。

    f、组合索引和单索引的建立,要考虑查询实际和具体模式

    ​​​​​​​mysql中哪些情况下可以使用索引,哪些情况不能使用索引?mysql索引失效的情形有哪些?

    1.一个字段的取值只有几种的字段不要使用索引。比如性别,只有两种可能数据。意味着索引的二叉树级别少,多是平级。这样的二叉树查找无异于全表扫描。

    2.频繁更新的字段不要使用索引

    3.where 子句中使用!=或<>操作符,对字段进行 null 值判断(IS NULL /IS NOT NULL),使用 or 来连接条件,使用in 和 not in,对字段进行表达式操作,对字段进行函数操作,/ like ‘%输入符%’等条件,不要使用索引。否则将导致引擎放弃使用索引而进行全表扫描

    4. 不要在 where 子句中的“=”左边进行函数(DAY(column)=…)、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

    5.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

    6.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引

    7.使用varchar,代替char,这是因为varchar会动态分配长度,char指定为20,即时你存储字符“1”,它依然是20的长度

    8.大数据字段最好剥离出单独的表,以便影响性能

    9.给表建立主键

    10.经常用到的列就最好创建索引

    11.查询从索引的最左前列开始并且不跳过索引中的列;

    12索引列上不操作

    13加了范围会失效

    14在JOIN操作中(需要从多个数据表提取数据时),MYSQL只有在主键和外键的数据类型相同时才能使用索引,否则即使建立了索引也不会使用。使用连接(JOIN)来代替子查询(Sub-Queries)

    java中的多线程在你们的这个项目当中有哪些体现?

     a,后台任务:如定时向大量(100W以上)的用户发送邮件;定期更新配置文件、任务调度(如quartz),一些监控用于定期信息采集

    b,  自动作业处理:比如定期备份日志、定期备份数据库

    c, 异步处理:如发微博、记录日志

    ​​​​​​​Redis分布式锁理解

    获取锁的时候,使用setnx加锁,并使用expire命令(this.redisTemplate.expire("max",tempTime,TimeUnit.SECONDS); )为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。

    获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。

    释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。

    SETEX:如果 key 已经存在, SETEX 命令将覆写旧值。

    SETNX:若给定的 key 已经存在,则 SETNX 不做任何动作。

    ​​​​​​​项目添加Redis缓存后,持久化具体怎么实现的。

    RDB:保存存储文件到磁盘;同步时间为15分钟,5分钟,1分钟一次,可能存在数据丢失问题。

    AOF:保存命令文件到磁盘;安全性高,修改后立即同步或每秒同步一次。

    上述两种方式在我们的项目中都有使用到,在广告轮播的功能中使用了redis缓存,先从redis中获取数据,无数据后从数据库中查询后保存到redis中

    采用默认的RDB方式,在广告轮播的功能中使用了redis缓存,先从redis中获取数据,无数据就从数据库中查询后再保存到redis中

    ​​​​​​​你有了解mysql的隔离级别吗?mysql默认的隔离级别是什么?

    数据库事务的隔离级别有四种,隔离级别高的数据库的可靠性高,但并发量低,而隔离级别低的数据库可靠性低,但并发量高,系统开销小。

    1. READ UNCIMMITTED(未提交读)
    2. READ COMMITTED(提交读)
    3. REPEATABLE READ(可重复读)
    4. SERIALIZABLE(可串行化)

    mysql默认的事务处理级别是'REPEATABLE-READ',也就是可重复读。

    ​​​​​​​项目中关于表结构拆分,你们是业务层面的拆分还是表结构层面的拆分?

    表结构层面的拆分。通过mycat数据库中间件完成数据库分表操作。

    业务层面也有拆分,比如商品模块拆分成8张表来实现存储

    使用MyCat分库分表?

    分库

     通过Mycat结点来管理不同服务器上的数据库,每个表最多存500万条记录

    分表

     重直切割,水平切割

    MySql提供了EXPLAIN语法用来进行查询分析,在SQL语句前加一个"EXPLAIN"即可。mysql中的explain语法可以帮助我们改写查询,优化表的结构和索引的设置,从而最大地提高查询效率。

    ​​​​​​​分布式架构session共享问题,如何在集群里边实现共享。

    用了CAS,所有应用项目中如果需要登录时在web.xml中配置过滤器做请求转发到cas端工作原理是在cas登录后会给浏览器发送一个票据(ticket),浏览器cookie中会缓存这个ticket,在登录其他项目时会拿着浏览器的ticket转发到cas,到cas后根据票据判断是否登录

  • 相关阅读:
    用电脑Python控制Arduino
    Arduino-LiquidCrystal_I2C 液晶库
    Arduino通讯串口
    nginx statistics in multi-workers
    Nginx RTMP 模块 nginx-rtmp-module 指令详解
    windows下搭建nginx-rtmp服务器
    超实用压力测试工具-ab工具
    (总结)Nginx配置文件nginx.conf中文详解
    NGINX conf 配置文件中的变量大全 可用变量列表及说明
    「自己开发直播」实现nginx-rtmp-module多频道输入输出与权限控制
  • 原文地址:https://www.cnblogs.com/javawxid/p/12811999.html
Copyright © 2011-2022 走看看