redis学习笔记--redis实现原理相关
Posted JordanInShenzhen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis学习笔记--redis实现原理相关相关的知识,希望对你有一定的参考价值。
redis为什么是单线程的?它完全是单线程吗?
首先,redis为什么是单线程的,首先肯定是为性能考虑,redis在数据的存取过程中,性能是非常高的,但是如果采用多线程策略,系统的性能反而会耗在线程切换上;如果觉得无法发挥出机器的多核的优势,可以考虑在一台机器上多开几个Redis实例解决。
其次,单线程代码更清晰,处理逻辑更简单,不用考虑各种锁的问题,不存在加锁和释放锁的操作,没有因为可能出现死锁而导致的性能问题。
但是,在redis6.0以后,它开始支持多线程了,为什么?因为redis主要的性能瓶颈不在于读写速度,而在于内存和网络,内存好说,直接加内存条即可,但是网络IO怎么办?这个加内存条可是不顶用的,所以redis6.0引入了多线程的概念,redis6.0在网络IO处理方面引入了多线程,如网络数据的读写和协议解析等,但是!执行命令的核心模块(内存读取)还是单线程的。
Redis持久化有几种方式?
redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
Redis和 memecache 有什么区别?
1. redis支持更丰富的数据结构和数据操作,而memcache仅支持简单的key-value数据结构
2. redis内存使用率比较高,Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于memecache。
3. redis是单线程,mencache是多线程的
4. Redis支持磁盘持久化,memecache不支持。
Redis可以将一些很久没用到的value通过swap方法交换到磁盘。
5. redis支持分布式,memcache不支持
Redis支持的 java 客户端都有哪些?
Redisson、Jedis、lettuce 等等,官方推荐使用 Redisson,代码开发过程中一般会继承spring-boot,spring-boot提供了便捷的redis访问工具:redisTemplate
目前用的最多的客户端是Jedis 和 Redisson,两者都是Java中对Redis操作的封装。Jedis 只是简单的封装了 Redis 的API库,可以看作是Redis客户端,它的方法和Redis 的命令很类似。Redisson 不仅封装了 redis ,还封装了对更多数据结构的支持,以及锁等功能,相比于Jedis 更加大。但Jedis相比于Redisson 更原生一些,更灵活。
redis实现原理相关就介绍这些,后面如果有想到哪些redis原理相关的知识点,会逐步的补充进来,下篇文章准备说下redis在大型互联网项目中会遇到的问题,如缓存击穿、缓存雪崩、缓存穿透等等,以及redis分布式锁的相关实现
Redis为什么这么快?
1. 基于内存的实现
2. 合理的数据类型设计
3. 针对每个数据类型,设计合理的数据存储结构
4. 合理的线程模型,在网络IO使用多线程,在数据存取的核心操作上,使用单线程,避免了线程上下文切换
5. 虚拟内存机制。暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据)。通过VM功能可以实现冷热数据分离,使热数据仍在内存中、冷数据保存到磁盘。这样就可以避免因为内存不足而造成访问速度下降的问题。
以上是关于redis学习笔记--redis实现原理相关的主要内容,如果未能解决你的问题,请参考以下文章