关于Redis的那些事——面试会问的问题
1、redis的五大数据类型:String、list、set、hash、sorted set
2、redis的应用情景:redis是使用c语言编写的一种高速缓存数据库,用于缓存数据的,能够减轻数据库的压力。应用场景:可以缓存点赞数,评论,点击数,文章的详情信息,记录会话的信息。在项目中,添加商品的时候,我会将商品添加到缓存中,在查询商品的时候,我会先查询缓存,如果缓存没有,去查询数据库,将商品添加到redis缓存中。
3、redis缓存数据后,是否做了持久化?
有两种持久化方案,一种是AOF(append only file),另一种是RDB(redis database)
AOF:就是将对redis数据库的增删改操作的命令保存到文件中,数据库恢复的时候将命令执行一遍即可
RDB:快照形式,定时的把内存中当前时刻的数据保存到磁盘中(默认的持久化方案)
4、redis 和 memecache 有什么区别?
redis:数据有部分保存到硬盘中,支持持久化方案,有复杂的数据类型,对于value的值的大小能够达到1GB
memecache:全部数据保存在内存中,断电之后会挂掉,不支持持久化方案,
数据类型相对简单,对于value值的大小只有1MB
5、redis使用过他的什么方法?
set、get、expire(设置key的过期时间)、del(key存在,删除key)、exists(检查给定的key值是否存在)、rename(重命名key)、ttl(返回给定 key 的剩余生存时间(TTL, time to live))
public interface JedisClient {
String set(String key, String value);
String get(String key);
Boolean exists(String key);
Long expire(String key, int seconds);
Long ttl(String key);
Long incr(String key);
Long hset(String key, String field, String value);
String hget(String key, String field);
Long hdel(String key, String... field);
Boolean hexists(String key, String field);
List<String> hvals(String key);
Long del(String key);
}
6、redis的集群和哨兵?
redis集群:Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
哨兵的作用就是防止redis集群节点出现问题,这个时候将备份节点顶上使用。
7、redis 支持的 java 客户端都有哪些?
Jedis、Redisson、Lettuce,不过我只会使用Jedis(尴尬)
8、怎么保证缓存和数据库数据的一致性?
合理的设置缓存过期的时间
增删改操作数据库的时候,同步更新redis缓存,可以使用事务机制来保证数据的一致性。
9、redis 如何做内存优化?
尽量使用散列表,把相关的信息放入到散列表中存储,而不是把每个字段单独存储,这样子可以有效的减少内存使用。比如将 Web 系统的用户对象,应该放到散列表里面再整体存储到 Redis,而不是把用户的姓名、年龄、密码、邮箱等字段分别设置 key 进行存储。