面试:第十一章:缓存

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默认的隔离级别是什么?

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

    READ UNCIMMITTED(未提交读)
    READ COMMITTED(提交读)
    REPEATABLE READ(可重复读)
    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后根据票据判断是否登录