redis总结

1、什么是redis?

答:redis是c语言开发的一个开源的高性能键值对的内存数据库,可以用作数据库、缓存、消息中间件等。它是一种非关系型数据库,redis作为一个内存数据库,性能优秀,数据在内存中,读写速度非常快,支持并发10wQPS。单进程单线程,是线程安全的,采用IO多路复用机制。丰富的数据类型,支持字符串,散列,列表,集合、有序集合等。支持数据持久化。可以将内存中数据保存在磁盘中,重启时加载。主从复制,哨兵,高可用。可以作为分布式锁。可以作为消息中间件使用,支持发布订阅。

2、redis内部内存管理如何描述5种数据类型的?

redis总结

 redis内部使用一个redisObject对象来表示所有的key和value。redisObject对象结构如图所示。

(1)string是redis最基本的类型,一个key对应一个value。string类型是二进制安全的,意味着redis和string类型可以包含任何数据。

(2)hash是一个键值集合,hash是string的键值映射表。

(3)list是简单的字符串列表,按照插入顺序排序。redis list是一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了额外的内存开销。

(4)set是string类型的无序集合。集合是通过hashtable实现的,set中元素是没有顺序的,而且是不重复的。set和list差不多,但是set有一个自动去重的功能,还可以判断某个成员是否在set集合中。

(5)Zset和set一样是string类型元素的集合,且不允许重复的元素。sorted set可以通过用户额外提供的优先级的参数来为成员排序,并且插入时有序的,即自动排序。它的内部使用hashmap和skiplist保证数据的存储和有序,hashmap里放的是成员到score的映射。skiplist存放是所有的成员。

redis总结

3、redis缓存

有两种方式使用:a、redistemplate b、注解的方式 

4、实际运用遇到的问题

缓存和数据库数据一致性问题:分布式环境下非常容易出现缓存和数据库间的数据一致性问题。

解决的话就需要合适的策略,比如合适的缓存更新策略、更新数据库之后及时更新缓存、缓存失败时增加重试机制。

5、为什么redis很快却还是单线程?

因为redis是完全基于内存的操作,CPU不是redis的瓶颈,redis的瓶颈最有可能是机器内存的大小或者网络带宽。单线程操作迅速,数据结构简单,避免不必要的上下文切换,不存在多线程导致的CPU切换,不用考虑各种锁的问题。

6、redis持久化

redis为了保证效率,数据缓存在了内存中,但是会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件之中,以保证数据的持久化。

持久化策略有两种a、RDB b、AOF